Как убрать окружность на конце линии при значении атрибута stroke-linecap="round "

Я написал простой пример прогресс-бара, чтобы продемонстрировать проблему:

Ниже на изображении маленький кружок на конце линии перед началом анимации:

введите сюда описание изображения

Анимация начинается после клика по холсту SVG:

<style>
body{text-align:center;font-family:sans-serif;background:silver;}
svg{width:30%;}
</style>

<svg id="svg1"  viewBox="0 0 100 100">
   <circle cx="50" cy="50" r="40" fill="transparent" stroke="#fff" stroke-width="8"/>
  <path id="progress" stroke-dasharray="251.2" stroke-dashoffset="251.2" stroke-width="8" stroke="#4596AB" stroke-linecap="round" fill="none"
        d="M50 10
           a 40 40 0 0 1 0 80
           a 40 40 0 0 1 0 -80"> 
    <animate attributeName="stroke-dashoffset" begin="svg1.click" dur="4s" values="251.2;0;251.2" fill="freeze" />     
  </path>
</svg>

Когда я назначаю атрибут stroke-linecap = "round", в начале строки появляется круг. В этом случае линия имеет нулевую длину.

С другими значениями, например, stroke-linecap = "butt", этого эффекта не будет.

Как удалить кружок в начале строки с помощью stroke-linecap = "round"?

Примечание: Этот эффект не наблюдается здесь во фрагменте, но отчетливо виден в браузере в отдельно сохраненном файле. Как показано на рисунке выше.


Ответы (1 шт):

Автор решения: Alexandr_TT

Причина этой ошибки браузера была обнаружена с помощью @Paul LeBeau

Я посчитал длину окружности в вопросе 2 * PI * 40 ~= 2 * 3,14 * 40 ~= 251,2

При этом значении 251,2 есть маленький кружок, как показано на картинке в вопросе.

Если вы рассчитываете с помощью getTotalLength(), вы получаете 251.36264038085938
При этом значении длины окружности ~= 251,36 маленького кружка нет

<style>
body{text-align:center;font-family:sans-serif;background:silver;}
svg{width:30%;}
</style>

<svg id="svg1"  viewBox="0 0 100 100">
   <circle cx="50" cy="50" r="40" fill="transparent" stroke="#fff" stroke-width="8"/>
  <path id="progress" stroke-dasharray="251.36" stroke-dashoffset="251.36" stroke-width="8" stroke="#4596AB" stroke-linecap="round" fill="none"
        d="M50 10
           a 40 40 0 0 1 0 80
           a 40 40 0 0 1 0 -80"> 
    <animate attributeName="stroke-dashoffset" begin="svg1.click" dur="4s" values="251.36;0;251.36" fill="freeze" />       
  </path>
</svg>
<script>
 console.log(progress.getTotalLength());
 </script>  

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

→ Ссылка