CSS-SVG-环形进度条

线上代码地址

html 复制代码
<div class="circular-progress-bar">
  <svg>
    <circle class="circle-bg" />
    <circle class="circle-progress" style="stroke-dasharray: calc(2 * 3.1415 * var(--r) * (var(--percent) / 100)), 1000" />
  </svg>
</div>

<br />
<br />
<p>
  <label>进度</label>
  <input type="range" min="0" max="100" value="0" oninput="changeConfig(this, '--percent')" />
</p>
<p>
  <label>环形大小</label>
  <input type="range" min="100" max="400" value="200" oninput="changeConfig(this, '--size', 'px')" />
</p>
<p>
  <label>进度条宽度</label>
  <input type="range" min="1" max="50" value="10" oninput="changeConfig(this, '--progress-border', 'px')" />
</p>
<p>
  <label>进度条颜色</label>
  <input type="color" value="#ff0000" oninput="changeConfig(this, '--progress-color')" />
</p>
<p>
  <label>背景色</label>
  <input type="color" value="#cccccc" oninput="changeConfig(this, '--bg-color')" />
  <button onclick="changeDemo({ value: 'transparent' }, '--bg-color')">透明</button>
</p>
css 复制代码
.circular-progress-bar {
  --size: 200px; /* 环形大小 */
  --percent: 0; /* 进度 */
  --progress-border: 10px; /* 进度条宽度:要带单位,不然计算半径的时候有问题,要和 --size 统一 */
  --progress-color: red; /* 进度条颜色 */
  --bg-color: green; /* 不是进度条的颜色 */
  position: relative;
  width: var(--size);
  height: var(--size);
  border-radius: 50%;
}
.circular-progress-bar::before {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  counter-reset: progress var(--percent);/* 用于重置计数器的初始值,并且命名为progress */
  content: counter(progress) "%";
  white-space: nowrap;
  font-size: 18px;
}

.circular-progress-bar svg {
  width: 100%;
  height: 100%;
}
.circular-progress-bar svg circle {
  --r: calc((var(--size) - var(--progress-border)) / 2);
  fill: none;
  stroke-width: var(--progress-border);
  stroke-linecap: round;
  stroke: var(--progress-color);
  transition: stroke-dasharray 0.3 linear;
  cx: calc(var(--size) / 2);
  cy: calc(var(--size) / 2);
  r: var(--r);
}
.circular-progress-bar svg .circle-bg {
  stroke: var(--bg-color);
}

.circular-progress-bar svg .circle-progress {
  opacity: var(--percent); /* 进度:0 的时候不需要显示 */
}
js 复制代码
const progressEl = document.querySelector('.circular-progress-bar');

function changeConfig({ value }, property, unit = '') {
  progressEl.style.setProperty(property, value + unit);
}
相关推荐
KaMeidebaby5 小时前
卡梅德生物技术快报|蛋白 N 端测序在重组贻贝融合蛋白表征中的应用,解决原核表达序列偏移工艺难题
前端·人工智能·物联网·算法·百度
kyriewen7 小时前
我筛了 1400 个 Claude Code Skills,留下 5 个天天在用的
前端·ai编程·claude
JNX_SEMI7 小时前
AT2401C 2.4GHz 全集成射频前端单芯片技术解析
前端·单片机·嵌入式硬件·物联网·硬件工程
anOnion7 小时前
Agentic 前端开发之 实时显示 AI Agent 终端输出
前端·javascript·人工智能
随风一样自由7 小时前
【前端领域】2026最新前端领域全梳理(框架/工具/AI/跨端/底层标准/就业趋势)
前端·人工智能·前端框架
这是个栗子7 小时前
【前端性能优化】优化数据加载:用 Promise.all 从串行到并行
前端·javascript·性能优化·异步编程·前端优化·promise.all
fei_sun8 小时前
黑洞路由(Null Route/空接口路由)
服务器·前端·javascript
大爱一家盟8 小时前
告别卡点BGM同质化 2026原创卡点音乐素材下载网站 TOP5 推荐
大数据·前端·人工智能
彦为君8 小时前
算法思维与经典智力题
java·前端·redis·算法
aa小小9 小时前
localhost 访问异常排查笔记
前端