JSFiddle - React, Tailwind, and code Playground
HTML
<svg viewBox="0 0 126 126" preserveAspectRatio="xMinYMin meet">
<clipPath id="cut-off">
<rect x="0" y="0" width="100%" height="50" />
</clipPath>
<clipPath id="progress-percent">
<path x="0" y="0" width="12%" height="50" />
</clipPath>
<g>
<circle r="35%" cx="40%" cy="40%" class="circle-fill" clip-path="url(#cut-off)" />
<circle id="divisions" r="35%" cx="40%" cy="40%" class="circle-back" clip-path="url(#cut-off)"
stroke-dasharray="20 0.5" stroke-dashoffset="25" />
<circle r="35%" cx="40%" cy="40%" class="circle-progress" clip-path="url(#progress-percent)" />
</g>
</svg>
CSS
circle {
fill: none;
}
.circle-back {
stroke: #F8F6F0;
stroke-width:9px;
}
.circle-fill {
stroke: grey;
stroke-width: 10px;
}
.circle-progress {
stroke: blue;
stroke-width:9px;
}
JavaScript
let divisionsElement = document.getElementById('divisions');
let length = parseInt(divisionsElement.getAttribute("r")) * Math.PI;
let divisionsArray = [20,30,80,90]; //stroke at 20%, 30%,80%,90% position
let METER_DIVISIONS_GAP = 0.2;
divisionsArray.map(ele => {
setupPath(ele);
})
function setupPath(val) {
divisionsElement.setAttribute("stroke-dasharray", val + ' ' +METER_DIVISIONS_GAP);
}