Проблемы кросс-браузерного рендеринга SVG с кружком и штрих-черточкой - PullRequest
0 голосов
/ 17 сентября 2018

моя проблема объясняется довольно просто.Я получил снимок экрана с ситуацией и фрагмент кода jsFiddle.

Проблема, с которой я столкнулся, хорошо видна на скриншоте, круглые участки отлично выглядят в браузере Chrome, но в FireFox, Edge и т. Д.сечения слегка смещены.

До текущего состояния я установил для свойств r / cx / cy значение css, но это также было несовместимо.Я обнаружил, что вы должны записать их прямо в круговую метку.

У кого-нибудь была проблема, я имею в виду, но кто-нибудь может объяснить, почему она не работает, как ожидалось?

[РЕДАКТИРОВАТЬ] СПАСИБО @Sphinxxx за ответ на основной вопрос у не работает, что.

Есть ли взломать / обходной путь, чтобы решитьпроблема?


Снимок экрана:

Chrome | Firefox | Edge Браузер на этом экране: 1. Chrome 2. FireFox 3. Edge

[ОБНОВЛЕНИЕ] (В текущей версии Firefox эта проблема исправлена)

  • Теперь эта проблема возникает только в Edgeбраузер

enter image description here

Вот пример кода:

const duration = 1200
        Array.from(document.getElementsByClassName('count')).forEach(el => {
            const target = parseInt(el.innerText)
            const step = (duration / target)
            const increment = step < 10 ? Math.round(10 / step) : 1
            let current = 0
            console.log(el.innerText + ': ' + step)
            el.innerText = current
            window.addEventListener('load', _ => {
                const timer = setInterval(_ => {
                    current += increment
                    if (current >= target) {
                        el.innerText = target
                        clearInterval(timer)
                    } else
                        el.innerText = current
                }, step)
            })
        })

        function getlength(number) {
            return number.toString().length;
        }
svg.chart {
            width: 100px;
            border-radius: 50%;
            background: yellowgreen;
            transform: rotate(-90deg);
            animation: grow-up cubic-bezier(0, 0, 0.18, 1) 2s;
            animation-delay: 0.3s;
        }

        .chart > circle {
            fill: none;
            stroke-width: 32;
        }

        .chart > circle.first {
            stroke: deeppink;
        }

        .chart > circle.second {
            stroke: mediumpurple;
        }

        .chart > circle.third {
            stroke: #fb3;
        }
		
        .chart > circle.fourth {
            stroke: #ce3b6a;
        }

        .legend-list li{
			width: 40%;
		}
        .legend-list span.glyphicon {
            color: yellowgreen;
        }

        .legend-list .first span.glyphicon {
            color: deeppink;
        }

        .legend-list .second span.glyphicon {
            color: mediumpurple;
        }

        .legend-list .third span.glyphicon {
            color: #fb3;
        }
        .legend-list .fourth span.glyphicon {
            color: #ce3b6a;
        }

        svg circle {
            animation: rotate-in cubic-bezier(0, 0, 0.18, 1) .7s;
            animation-delay: 0.3s;
            transform-origin: 50% 50%
        }

        @keyframes rotate-in {
            from {
                opacity: 0;
                stroke-dashoffset: 30;
            }
            to {
                opacity: 1;
                stroke-dashoffset: 0;
            }
        }

        @keyframes grow-up {
            from {
                opacity: 0;
            }
            to {
                opacity: 1;
            }
        }
<svg class="chart" viewBox="0 0 32 32">	
	<!-- circle zero from 0 to 100 for filling yellowgreen -->	<!-- 75 - 100 = 25 % -> realy 0 - 100 background color -->					
  <circle class='fourth' stroke-dasharray="75 100" r="16" cx="16" cy="16"></circle>	<!-- 60 - 75 = 15 % -->	
  <circle class='third' stroke-dasharray="60 100" r="16" cx="16" cy="16"></circle>	<!-- 40 - 60 = 20 % -->	
  <circle class='second' stroke-dasharray="40 100" r="16" cx="16" cy="16"></circle> <!-- 30 - 40 = 10 % -->	
  <circle class='first' stroke-dasharray="30 100" r="16" cx="16" cy="16"></circle> <!-- 0 - 30 = 30 % -->	
</svg>

1 Ответ

0 голосов
/ 17 сентября 2018

И Edge, и Firefox явно делают что-то не так при рисовании кругов, где обводка пересекает себя в центре круга. Ваш пример можно упростить до этого:

<svg class="chart" width="320" height="340" viewBox="1 0 32 34">	
    <circle cx="16" cy="1"  r="8" stroke-width="15.5" stroke="green" stroke-dasharray="20 999" fill="none"></circle>
    <circle cx="16" cy="18" r="8" stroke-width="16"   stroke="blue"  stroke-dasharray="20 999" fill="none"></circle>
</svg>

Зеленый круг имеет штрих, который слишком мал, чтобы достичь центра, и выглядит так, как и следовало ожидать, с крошечной дырой в середине. Синий круг должен идеально закрыть этот промежуток, но каким-то странным образом выходит за рамки:

enter image description here

Проблема может быть связана с этим: Пути: поглаживание и смещение , но выглядит не совсем так.

...