conic-gradient 是目前最简洁可靠的纯 css 环形进度条实现方式,需正方形容器、border-radius: 50%,进度值映射为角度(如 75% → 270deg),未完成部分用浅色填充,建议加 will-change: background 优化渲染。

用 conic-gradient 实现环形进度条最直接
纯 CSS 实现环形进度条,conic-gradient 是目前最简洁可靠的方式,不需要 SVG 或 JS 控制。它基于色相角(0–360deg)绘制扇形,进度值直接映射为角度:比如 75% 进度就是 conic-gradient(from 0deg, #3b82f6 0deg 270deg, #e5e7eb 270deg)(270 = 360 × 0.75)。
关键点:
- 必须设置容器为正方形,并用
border-radius: 50%确保圆形裁剪 - 背景使用
conic-gradient,未完成部分用浅色占满剩余角度 - 为避免边缘锯齿,建议加
will-change: background或transform: translateZ(0) - 不支持 IE 和旧版 Safari(iOS
在 Tailwind 中动态控制进度需要内联样式或插件
Tailwind 默认不提供 conic-gradient 的原子类,也不能直接用 bg-[...] 插值百分比(因为 JIT 编译时无法预知变量值)。所以实际项目中常见两种做法:
- 服务端或组件逻辑中拼接 style 字符串:
style="background: conic-gradient(from 0deg, #3b82f6 0deg ${progress * 360}deg, #e5e7eb ${progress * 360}deg)" - 用
@apply抽成可复用的 class,但只适用于固定进度(如.progress-75) - 引入插件如
tailwindcss-conic-gradient,它会生成bg-conic-from-0-via-blue-500-to-gray-200类,但仍不能绑定运行时进度值
别指望 bg-[conic-gradient(...)] 里写 ${progress} —— Tailwind 不解析 JS 表达式,编译阶段就报错或静默忽略。
用 stroke-dasharray + SVG 是更可控的备选方案
如果项目需要动画平滑、IE 兼容、或进度值频繁变化(如实时上传),SVG 路径方案反而更稳。核心是画一个 <circle></circle>,用 stroke-dasharray 和 stroke-dashoffset 控制“可见弧长”:
<svg viewbox="0 0 100 100"><circle cx="50" cy="50" r="45" fill="none" stroke="#e5e7eb" stroke-width="10"></circle><circle cx="50" cy="50" r="45" fill="none" stroke="#3b82f6" stroke-width="10" stroke-dasharray="282.74" stroke-dashoffset="282.74"></circle></svg>
其中 282.74 ≈ 2 × π × 45 是圆周长;进度 75% 时设 stroke-dashoffset="282.74 * (1 - 0.75) = 70.69"。Tailwind 对 SVG 属性无侵入,所有控制都靠 JS 更新 stroke-dashoffset 即可。
动画卡顿或起点偏移?检查 from 角度和 transform 原点
用 conic-gradient 做动画时容易出现两个问题:
- 进度从顶部开始(而非默认的右侧):加
from -90deg,即conic-gradient(from -90deg, ...) - 旋转抖动或掉帧:确保父容器有
transform: rotate(0)或will-change: background,避免浏览器频繁重绘整个层 - 动画不线性:CSS transition 默认是
ease,改用transition-timing-function: linear
还有个隐藏坑:某些安卓 WebView 对 conic-gradient 的 angle 动画支持不全,真机测试比模拟器更重要。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











