JSFiddle - React, Tailwind, and code Playground

by Sergei Sokolov

HTML

<svg width="300" viewBox="0 0 220 220" xmlns="http://www.w3.org/2000/svg">
  <g transform="translate(110,110)">
    <circle r="100" class="e-c-base"/>
		<g transform="rotate(-90)">
      <circle r="100" class="e-c-progress"/>
			<g id="e-pointer">
				<circle cx="100" cy="0" r="8" class="e-c-pointer"/>
			</g>
		</g>
	</g>
</svg>
<div>
  <input type="range" min=0 max=100 value=85 step="0.01" id="in-value">
	<span id="e-indicator"></span>
</div>

CSS

.e-c-base {	fill:none; stroke:#CCC; stroke-width:4px}
.e-c-progress {	fill:none; stroke:#F60; stroke-width:4px}
.e-c-pointer {fill:#FFF; stroke:#F60; stroke-width:2px}

JavaScript

/**
 * для вопроса https://toster.ru/q/449024
 * Как построить похожий график?
 */
var $progress = $('.e-c-progress')
  ,$indi = $('#e-indicator')
  ,$pointer = $('#e-pointer')
  ,len = Math.PI * 2 * 100
;
$progress.css('stroke-dasharray', len);


function update(v) {
	$indi.text(v);
	var offset = - len - len * v / 100;
	$progress.css('stroke-dashoffset', offset);
	$pointer.attr('transform','rotate(' + (360*v/100) + ')');
};

update(85);

$('#in-value').on('input', function() {
  update( $(this).val());
});