svg用画半圆进度条最稳:设r=50、cx=cy=r居中,stroke-dasharray="157.08 157.08"截半圆,stroke-dashoffset从157.08→0实现0%→100%进度,需校验输入、节流更新、用viewbox适配移动端。

用 SVG <circle></circle> 画半圆弧线最稳
纯 CSS 实现半圆进度条容易在旋转中心、描边对齐、动画起始点上出问题,SVG 是更可控的选择。核心思路是:用一个 <circle></circle> 元素画完整圆,再通过 stroke-dasharray 和 stroke-dashoffset 截出下半圆(或上半圆),最后用 JS 或 CSS 控制偏移量实现进度变化。
关键点:
-
r设为固定值(比如50),cx/cy必须等于r,才能让圆心落在容器左上角;若要居中,需设cx="100" cy="100"+ 容器width/height: 200px - 半圆对应周长是
2 * Math.PI * r的一半,即Math.PI * r≈157.08(当r=50) - 初始
stroke-dasharray设为"157.08 157.08",表示“实线段 157.08 + 空白段 157.08”,刚好覆盖整个半圆路径 - 进度 0% →
stroke-dashoffset = 157.08(完全隐藏);100% →stroke-dashoffset = 0(完全显示)
CSS 动画驱动时注意 transform: rotate() 的基准点
如果坚持用 CSS(比如用两个 180° 扇形叠加),必须手动设置 transform-origin 为圆心,否则旋转会偏移。更常见问题是:用 border-radius 做半圆背景 + clip-path 裁剪进度层,但 clip-path 在 Safari 旧版或部分安卓 WebView 中支持不一致。
稳妥做法:
- 用 SVG 容器包裹
<circle></circle>,不依赖 CSS transform 做弧度控制 - 若必须用 CSS 动画,把
transform-origin显式设为center,且父容器width/height必须严格对称 - 避免用
rotate(90deg)调整起始角度——直接改stroke-dashoffset更直观,也绕过浏览器对 transform 动画的重绘优化干扰
JS 动态更新进度要防抖并校验范围
直接把用户输入或 API 返回的数值塞进 stroke-dashoffset 容易崩:负数、超 100、非数字都会导致弧线消失或错位。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
实操建议:
- 用
Math.min(Math.max(value, 0), 100)强制截断 - 计算 offset 时统一用
maxOffset * (1 - progress / 100),其中maxOffset是半圆周长(如157.08) - 高频触发(如拖拽滑块)时加简单节流:
setTimeout延迟 30ms 更新,避免 layout thrashing - 别忘了给
<circle></circle>加class="progress-ring__circle",方便用document.querySelector拿到元素
移动端适配重点在 viewBox 和 stroke-width 缩放
直接写死 width="200" height="100" 在小屏上会糊,或者被缩放导致 stroke-width 看起来太细/太粗。
正确姿势:
- SVG 标签加
viewBox="0 0 200 100",然后用 CSS 控制容器宽高(如width: 100%; max-width: 200px;) -
stroke-width设为相对单位,比如stroke-width="8",它会随 viewBox 缩放自动调整粗细 - 避免用
%或em设stroke-width,SVG 不认这些单位 - Android 4.4–6.0 的 WebView 对
stroke-dashoffset动画支持差,可降级为 JS requestAnimationFrame + setAttribute 更新
真正卡住人的往往不是怎么画弧,而是圆心没对齐、周长算错、offset 符号反了、或者忘了 viewBox —— 这几处一错,进度条就“不动”或“跑飞”。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










