圆形进度条中阈值标记指示器 CSS

Mark Indicator of a threshold value in circular progress bar CSS

我需要在圆形进度条上显示阈值指示器,我能够使用圆形指示器指示该位置。但是我需要显示一个带有阈值的线指示器。

例如,如果阈值是 70%,我必须显示一个显示阈值的线指示器。

关于如何完成的任何建议?也欢迎就可以使用的任何其他外观提出建议。

当前工作版本 - https://stackblitz.com/edit/react-td3nnk

现有外观

期待的样子

我会建议这样的事情。我想 meter/gauge 本身就是简单的部分。这里我有一个 stroke-dasharay 可以设置为 0-100 之间的值。

我添加了更多阈值指示器,以便您可以在圆的左侧和右侧看到它们的外观。基本上它只是一条线和一个旋转的文本。显示左侧文字时需要旋转180度

<svg width="400" viewBox="0 0 100 100" fill="none" stroke-width="5" stroke-linecap="round">
  <circle stroke="silver" cx="50" cy="50" r="40"/>
  <circle transform="rotate(-90 50 50)" stroke="green" cx="50" cy="50" r="40" pathLength="100" stroke-dasharray="65 100"/>
  <g transform="translate(50 50) rotate(-90) rotate(90)">
    <line x1="37.5" y1="0" x2="47.5" y2="0" stroke="black" stroke-width="1"/>
    <text transform="translate(43 -1)" font-size="4" fill="black">25</text>
  </g>
  <g transform="translate(50 50) rotate(-90) rotate(135)">
    <line x1="37.5" y1="0" x2="47.5" y2="0" stroke="black" stroke-width="1"/>
    <text transform="translate(43 -1)" font-size="4" fill="black">38</text>
  </g>
  <g transform="translate(50 50) rotate(-90) rotate(270)">
    <line x1="37.5" y1="0" x2="47.5" y2="0" stroke="black" stroke-width="1"/>
    <text transform="translate(43 -1) rotate(180) translate(-5 -2)" font-size="4" fill="black">75</text>
  </g>
  <g transform="translate(50 50) rotate(-90) rotate(315)">
    <line x1="37.5" y1="0" x2="47.5" y2="0" stroke="black" stroke-width="1"/>
    <text transform="translate(43 -1) rotate(180) translate(-5 -2)" font-size="4" fill="black">88</text>
  </g>
</svg>

互动版

var meter = document.getElementById('meter');
var threshold = document.getElementById('threshold');

document.forms.form01.addEventListener('change', e => {
  let newval = e.target.value;
  switch(e.target.name){
    case 'val':
      meter.setAttribute('stroke-dasharray', `${newval} 100`);
      break;
    case 'tval':
      threshold.setAttribute('transform', `translate(50 50) rotate(-90) rotate(${3.6*newval})`);
      let text = threshold.querySelector('text');
      text.textContent = newval;
      let transformStr = 'translate(43 -1)';
      if(newval > 50) transformStr += ' rotate(180) translate(-5 -2)';
      text.setAttribute('transform', transformStr);
      break;
  }
});
<form name="form01">
<lable>Value: <input name="val" type="range" min="0" max="100" value="25"/></lable>
<lable>Threshold: <input name="tval" type="range" min="0" max="100" value="33"/></lable>
</form>
<svg width="400" viewBox="0 0 100 100" fill="none" stroke-width="5" stroke-linecap="round">
  <circle stroke="silver" cx="50" cy="50" r="40"/>
  <circle id="meter" transform="rotate(-90 50 50)" stroke="green" cx="50" cy="50" r="40" pathLength="100" stroke-dasharray="25 100"/>
  <g id="threshold" transform="translate(50 50) rotate(-90) rotate(120)">
    <line x1="37.5" y1="0" x2="47.5" y2="0" stroke="black" stroke-width="1"/>
    <text transform="translate(43 -1)" font-size="4" fill="black">33</text>
  </g>
</svg>