svg圆环进度条需用stroke-dasharray设周长、stroke-dashoffset控制起始偏移,从周长值动画至0实现满进度;css动画需反向设置关键帧,配合gpu加速与兼容性处理确保跨端稳定。

用 stroke-dasharray 和 stroke-dashoffset 控制 SVG 圆环进度
SVG 圆环进度条最稳,不依赖 JS 也能做静态示意,但真正动态更新必须靠 CSS 动画或 JS 控制这两个属性。关键不是“画个圆”,而是算对周长、偏移和动画起止点。
-
stroke-dasharray设为圆周长(2 * π * r),就能把描边变成“一整段实线”;设为0, 周长就是完全隐藏 -
stroke-dashoffset是起点偏移量:值越大,实线段越往逆时针方向缩;从周长变到0,就是从空到满的动画 - 别手算周长——直接用
calc(2 * 3.1416 * 45)(假设r=45)或 JS 注入更安全,CSS 里硬写 282.74 容易错位 - 动画卡顿?加
transform: translateZ(0)或will-change: stroke-dashoffset强制 GPU 加速
CSS 伪元素 + clip-path 模拟半圆旋转遮罩(兼容性陷阱多)
这个方案本质是用两个半圆叠在一起,靠 clip-path 切出可见部分,再旋转其中一个来“露出”进度。看起来巧,但 iOS Safari 15.4 之前不支持 clip-path 的 circle() 或 path(),只能退化成 inset() 矩形裁剪,效果全崩。
- 真要用,优先选
clip-path: inset(0 0 0 50%) rotate(-90deg)配合overflow: hidden,比path()兼容好 - 旋转中心必须设对:
transform-origin: center,否则半圆转歪,进度不对齐 - 动画用
rotate()而非transform: rotate()简写,避免和其他 transform 冲突覆盖 - 安卓 WebView 里
clip-path对border-radius的圆角裁剪行为不一致,测试务必覆盖 OPPO/Vivo 内置浏览器
纯 CSS 实现 0% → 100% 进度动画的关键帧写法
别用 @keyframes 从 0% 到 100% 硬写数值,SVG 方案里 offset 是反向的:满的时候 offset 是 0,空的时候是周长。动画方向容易搞反。
- 正确写法:
@keyframes progress { from { stroke-dashoffset: 282.74; } to { stroke-dashoffset: 0; } } - 如果要暂停在某个百分比(比如 65%),JS 改
style.strokeDashoffset = 282.74 * (1 - 0.65),别直接设动画时间 - 动画时长设
0.3s以上,低于0.15s人眼难识别变化,还可能被系统节流掉帧 - 加
animation-timing-function: cubic-bezier(0.34, 1.56, 0.64, 1)比ease-out更自然,避免结尾突停
加载中状态与真实数据完成的衔接要点
纯 CSS 动画只能播一次或循环,但真实场景需要“加载开始→进度推进→完成→消失”。这一步必须交由 JS 控制类名切换,CSS 只管视觉表现。
- 初始状态加
loading类,触发旋转/描边动画;完成后 JS 移除它,加loaded类,用opacity: 0+visibility: hidden隐藏 - 别用
display: none直接隐藏,会导致动画中断后无法重播;用opacity过渡更稳妥 - 移动端频繁触发
resize时,SVGviewBox若没设死,圆环会缩放变形——固定width/height,不要只靠% - 如果后端返回的是 0–100 的整数进度,JS 计算 offset 时记得做校验:
Math.max(0, Math.min(282.74, 282.74 * (1 - percent / 100)))
最麻烦的从来不是画出那个圆,而是让它的动效在各种屏幕缩放、WebView 补丁、低功耗模式下都不跳、不卡、不回弹。动手前先跑一遍 iOS 16、Android 13 Chrome、微信内置浏览器这三端。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











