使用conic-gradient制作环形进度条的核心是利用其角度颜色过渡特性,通过css变量控制进度;2. html只需一个div并设置--percentage变量,css使用conic-gradient从0度开始按百分比填充颜色,再用::before伪元素创建中间圆孔,::after显示文本;3. 动态效果通过javascript修改--percentage实现,结合transition可让进度变化平滑动画;4. 浏览器兼容性方面,现代主流浏览器均支持,旧版浏览器可通过特性检测fallback到svg或多层div方案。该方法以极简代码实现高效、可维护的环形进度条,是当前最优解。

使用CSS制作环形进度条,特别是借助
conic-gradient
conic-gradient
要用
conic-gradient
首先,你需要一个HTML元素作为进度条的容器,比如一个简单的
div
立即学习“前端免费学习笔记(深入)”;
<div class="progress-circle" style="--percentage: 75;"></div>
这里我直接在
style
--percentage
接着,是关键的CSS部分。
.progress-circle {
--track-color: #e0e0e0; /* 进度条未填充部分的颜色 */
--progress-color: #4CAF50; /* 进度条已填充部分的颜色 */
--circle-size: 150px; /* 进度条的整体大小 */
--inner-hole-size: 120px; /* 中间圆孔的大小 */
width: var(--circle-size);
height: var(--circle-size);
border-radius: 50%; /* 确保是圆形 */
position: relative; /* 为伪元素定位做准备 */
display: grid; /* 方便居中内部文本或内容 */
place-items: center; /* 居中内容 */
overflow: hidden; /* 防止渐变超出边界,虽然conic-gradient通常不会 */
/* 核心:conic-gradient */
background: conic-gradient(
var(--progress-color) calc(var(--percentage, 0) * 1%), /* 从0度开始,填充到指定百分比 */
var(--track-color) 0% /* 未填充部分,从百分比结束处开始填充剩余部分 */
);
}
/* 创建中间的圆孔 */
.progress-circle::before {
content: '';
position: absolute;
width: var(--inner-hole-size);
height: var(--inner-hole-size);
border-radius: 50%;
background-color: white; /* 圆孔的颜色,通常与背景色一致 */
/* 伪元素会自动被place-items居中,如果父元素是grid/flex */
/* 如果不是,则需要手动居中:top: 50%; left: 50%; transform: translate(-50%, -50%); */
}
/* 可选:显示百分比文本 */
.progress-circle::after {
content: var(--percentage, 0) '%'; /* 直接显示CSS变量的值 */
font-size: 1.5em;
font-weight: bold;
color: #333;
z-index: 1; /* 确保文本在圆孔上方 */
}这段CSS的核心在于
background: conic-gradient(...)
var(--progress-color) calc(var(--percentage, 0) * 1%)
--progress-color
--percentage
var(--track-color) 0%
--percentage
--track-color
至于中间的圆孔,我选择用一个
::before
::after
conic-gradient
回想一下,在
conic-gradient
div
div
overflow: hidden
transform: rotate
<circle>
stroke-dasharray
stroke-dashoffset
而
conic-gradient
div
所以,对我来说,
conic-gradient
conic-gradient
虽然
conic-gradient
最直接的方式就是通过JavaScript来修改我们之前定义的
--percentage
// 假设你有一个进度条元素
const progressBar = document.querySelector('.progress-circle');
// 更新进度条的函数
function updateProgress(percentage) {
if (progressBar) {
progressBar.style.setProperty('--percentage', percentage);
}
}
// 示例:每秒更新一次进度
let currentPercentage = 0;
const intervalId = setInterval(() => {
currentPercentage += 1;
if (currentPercentage > 100) {
currentPercentage = 0; // 循环
}
updateProgress(currentPercentage);
// 如果需要停止,可以调用 clearInterval(intervalId);
}, 50); // 每50毫秒更新1%
// 也可以通过用户交互来更新,比如点击按钮
// document.getElementById('myButton').addEventListener('click', () => {
// updateProgress(Math.floor(Math.random() * 101)); // 随机更新一个进度
// });通过
element.style.setProperty('--variableName', value)conic-gradient
添加动画效果:
如果你想让进度条的更新过程更平滑,而不是瞬间跳变,可以尝试使用CSS
transition
.progress-circle {
/* ... 其他样式 ... */
transition: --percentage 0.5s ease-out; /* 让 --percentage 的变化有动画效果 */
}这里有一个小技巧:
transition
--percentage
对于更复杂的动画,比如需要多个步骤或更精细的控制,你也可以考虑使用JavaScript动画库(如GSAP)来插值
--percentage
@keyframes
conic-gradient
@keyframes
--percentage
transition
conic-gradient
尽管
conic-gradient
浏览器兼容性:
目前,
conic-gradient
-webkit-
你可以随时访问
caniuse.com
conic-gradient
conic-gradient
备选方案(Fallbacks):
对于那些不支持
conic-gradient
渐进增强(Progressive Enhancement): 这是我个人比较倾向的做法。对于不支持的浏览器,进度条可能只会显示一个纯色背景(如果你在
conic-gradient
background-color
SVG作为备选: 如果视觉效果至关重要,那么SVG是一个非常强大的备用方案。你可以使用JavaScript来检测浏览器是否支持
conic-gradient
<circle>
stroke-dasharray
// 简单的 conic-gradient 支持检测
function supportsConicGradient() {
const el = document.createElement('div');
el.style.backgroundImage = 'conic-gradient(white, black)';
return el.style.backgroundImage.includes('conic-gradient');
}
if (!supportsConicGradient()) {
// Fallback to SVG or other methods
// 例如,为 .progress-circle 添加一个特定的 class,然后用 CSS 切换显示
document.querySelector('.progress-circle').classList.add('no-conic-gradient');
// 或者直接替换 HTML 内容为 SVG 进度条
}旧版CSS方法: 虽然复杂,但基于
border-radius
overflow: hidden
transform: rotate
div
在实际项目中,我通常会先评估目标用户群体的浏览器分布。如果大部分用户都使用现代浏览器,那么我可能会选择渐进增强,让不支持的浏览器看到一个基本版本。如果项目对兼容性要求极高,那么我会倾向于使用JavaScript进行特性检测,并提供SVG作为备用方案。毕竟,CSS的进步是为了让我们写更少的代码,实现更好的效果,没必要为了极少数的旧浏览器而牺牲代码的简洁性。
以上就是CSS怎样制作环形进度条?conic-gradient技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号