Решение с помощью stroke-dasharray
У заданного пути максимальная длина равна 350px
Вычисляется длина с помощью getTotalLength()
<input type="button" value="Максимальная длина" onclick="TotalLength()"/>
<div>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:ev="http://www.w3.org/2001/xml-events"
width="500" height="500" viewBox="0 0 500 500" >
<path id="check" fill= "none" stroke ="grey" stroke-width ="1"
d="M41 149.5a77 77 0 1 1 117.93 0" />
</svg>
</div>
<script>
function TotalLength(){
var path = document.querySelector('#check');
var len = Math.round(path.getTotalLength() );
alert("Длина пути - " + len);
};
</script>
Если нужно поделить на три равных сектора, то длина одного сектора будет равна 116.67px
Это сумма длин: черты - 110px и пробела 6.67px
<svg xmlns="http://www.w3.org/2000/svg" height="200" width="200" viewBox="0 0 200 200" data-value="40">
<path class="bg" stroke="#ccc" stroke-width="20" stroke-dasharray="110 6.67"
d="M41 149.5a77 77 0 1 1 117.93 0" fill="none"/>
</svg>
Более подробно, как делить окружности на равные части с помощью stroke-dasharray здесь и здесь
Анимация заполнения первого сектора основана на изменении значения длины черты от нуля до максимального значения 110px
<animate id="an1" attributeName="stroke-dasharray" begin="0s;an3.end" values="0 110 0 240;110 0 0 240" dur="2s" fill="freeze" />
Точно также заполняются по очереди остальные 2 сектора.
Я сделал сектора разного цвета, при необходимости можно присвоить один цвет.
<svg xmlns="http://www.w3.org/2000/svg" height="200" width="200" viewBox="0 0 200 200" data-value="40">
<path class="bg" stroke="#ccc" stroke-width="20" stroke-dasharray="110 6.67"
d="M41 149.5a77 77 0 1 1 117.93 0" fill="none"/>
<path class="meter" stroke="green" stroke-width="20"
d="M41 149.5a77 77 0 1 1 117.93 0" fill="none" stroke-dasharray="0 350" stroke-dashoffset="0" >
<! анимация заполнения зелёного сектора -->
<animate id="an1"
attributeName="stroke-dasharray"
begin="0s;an3.end"
values="0 110 0 240;110 0 0 240"
dur="2s"
fill="freeze" />
</path>
<! анимация заполнения жёлтого сектора -->
<path class="meter" stroke="gold" stroke-width="20"
d="M41 149.5a77 77 0 1 1 117.93 0" fill="none" stroke-dasharray="0 350" stroke-dashoffset="0" >
<animate id="an2"
attributeName="stroke-dasharray"
begin="an1.end"
values="0 116.67 0 110 0 116.67;0 116.67 110 0 0 116.67"
dur="2s"
fill="freeze" />
</path>
<! анимация заполнения красного сектора -->
<path class="meter" stroke="red" stroke-width="20"
d="M41 149.5a77 77 0 1 1 117.93 0" fill="none" stroke-dasharray="0 350" stroke-dashoffset="0" >
<animate id="an3"
attributeName="stroke-dasharray"
begin="an2.end"
values="0 116.67 0 116.67 0 116.67;0 116.67 0 116.67 110 0"
dur="2s"
fill="freeze" />
</path>
</svg>
Анимация стрелки указателя
<animateTransform id="an_arrow" attributeName="transform" type="rotate" values="-10 100 100;255 100 100" dur="6s" repeatCount="indefinite" fill="freeze" />
<svg xmlns="http://www.w3.org/2000/svg" height="200" width="200" viewBox="0 0 200 200" data-value="40">
<path class="bg" stroke="#ccc" stroke-width="20" stroke-dasharray="110 6.67"
d="M41 149.5a77 77 0 1 1 117.93 0" fill="none"/>
<path class="meter" stroke="green" stroke-width="20"
d="M41 149.5a77 77 0 1 1 117.93 0" fill="none" stroke-dasharray="0 350" stroke-dashoffset="0" >
<! анимация заполнения зелёного сектора -->
<animate id="an1"
attributeName="stroke-dasharray"
begin="0s;an3.end"
values="0 110 0 240;110 0 0 240"
dur="2s"
fill="freeze" />
</path>
<! анимация заполнения жёлтого сектора -->
<path class="meter" stroke="gold" stroke-width="20"
d="M41 149.5a77 77 0 1 1 117.93 0" fill="none" stroke-dasharray="0 350" stroke-dashoffset="0" >
<animate id="an2"
attributeName="stroke-dasharray"
begin="an1.end"
values="0 116.67 0 110 0 116.67;0 116.67 110 0 0 116.67" dur="2s"
fill="freeze" />
</path>
<! анимация заполнения красного сектора -->
<path class="meter" stroke="red" stroke-width="20"
d="M41 149.5a77 77 0 1 1 117.93 0" fill="none" stroke-dasharray="0 350" stroke-dashoffset="0" >
<animate id="an3"
attributeName="stroke-dasharray"
begin="an2.end"
values="0 116.67 0 116.67 0 116.67;0 116.67 0 116.67 110 0"
dur="2s"
fill="freeze" />
</path>
<circle cx="100" cy="100" r="50" fill="none" stroke-width="4" stroke="silver" />
<path d="m62.4 134.1c0 2.8 13.6 7.4-2.6 5-2.7-0.4-10.7-0.2-10.7-0.2 0 0 4-13.1 4.1-19.1 0.1-6 9.2 11.5 9.2 14.3z" fill="silver">
<animateTransform id="an_arrow"
attributeName="transform"
type="rotate"
values="-10 100 100;255 100 100"
dur="6s"
repeatCount="indefinite"
fill="freeze" />
</path>
<circle cx="100" cy="100" r="3" fill="#8E8E8E" />
</svg></code></pre>
Ссылки на связанные топики c заполнением прогрессбара и выводом процентов:
Круговой прогресс бар
Круговой процентный прогресс бар
Круглый векторный индикатор прогресса
Практические примеры применения масок svg
pathlengthна 30, то увидите, что результат совсем не такой. – Daniyal Lukmanov Apr 03 '19 at 14:54