使用conic-gradient制作环形进度条的核心是利用其角度渐变特性模拟扇形填充,并通过伪元素创建中心遮罩实现环形镂空效果;2. 首先设置一个圆形容器,使用::before伪元素应用conic-gradient,根据css变量--progress-percent定义进度颜色的终止角度,剩余部分由轨道颜色填充;3. 使用::after伪元素创建一个较小的同心圆,尺寸为容器尺寸减去两倍的进度条厚度,背景色与中心区域一致,通过z-index覆盖在渐变上方,形成视觉上的“镂空”环形;4. 动态更新进度通过javascript修改--progress-percent变量实现,如document.queryselector('.circular-progress').style.setproperty('--progress-percent', '75');5. 实现动画效果可采用@property定义可动画的css变量并结合transition,或使用javascript的requestanimationframe逐步更新变量值以实现平滑过渡;6. 相比传统方法如多元素旋转、svg路径或border技巧,conic-gradient方案代码更简洁、维护更方便,且能精准控制角度渐变,是目前最直观高效的环形进度条实现方式,最终效果完整且可高度自定义。

CSS制作环形进度条,尤其是结合
conic-gradient
要使用
conic-gradient
首先,我们设定一个HTML结构:
立即学习“前端免费学习笔记(深入)”;
<div class="circular-progress">
<span class="progress-value">50%</span>
</div>接着,是关键的CSS部分:
.circular-progress {
position: relative;
width: 180px; /* 进度条外径 */
height: 180px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden; /* 防止渐变超出边界 */
/* CSS变量,方便控制 */
--progress-percent: 50; /* 0-100的百分比值 */
--progress-color: #4CAF50; /* 进度条颜色 */
--track-color: #e0e0e0; /* 轨道背景色 */
--inner-circle-bg: #ffffff; /* 中心圆背景色 */
--bar-thickness: 15px; /* 进度条厚度 */
}
.circular-progress::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 50%;
/* 使用 conic-gradient 创建进度和轨道 */
background: conic-gradient(
var(--progress-color) calc(var(--progress-percent) * 1%), /* 进度部分 */
var(--track-color) 0% /* 剩余轨道部分 */
);
z-index: 1; /* 确保在中心圆下方 */
}
.circular-progress::after {
content: '';
position: absolute;
/* 创建一个比父元素小的圆,作为中心遮罩 */
width: calc(100% - (var(--bar-thickness) * 2));
height: calc(100% - (var(--bar-thickness) * 2));
border-radius: 50%;
background-color: var(--inner-circle-bg);
z-index: 2; /* 确保在进度条上方 */
}
.progress-value {
position: relative; /* 确保文本在最上层 */
z-index: 3;
font-size: 2em;
font-weight: bold;
color: #333;
}通过调整
--progress-percent
document.querySelector('.circular-progress').style.setProperty('--progress-percent', '75');conic-gradient
我觉得,
conic-gradient
conic-gradient
transform: rotate()
border
box-shadow
border
conic-gradient
说实话,第一次用
conic-gradient
border-radius
overflow: hidden
::after
::before
conic-gradient
具体来说,我们的
conic-gradient
::before
conic-gradient
实现这个“镂空”效果的关键在于:
--bar-thickness
--bar-thickness
--bar-thickness
z-index
position: absolute; top: 0; left: 0;
width: 100%; height: 100%;
width
height
display: flex; align-items: center; justify-content: center;
background-color
这种方法既简单又高效,完美地利用了CSS的层叠特性来达到视觉上的“镂空”效果,而实际上并没有真的“挖”掉什么。
让环形进度条动起来或者根据数据实时更新,是提升用户体验的关键。实现这些效果主要依赖于CSS的
transition
动态更新: 最直接的方式就是通过JavaScript来修改我们之前定义的CSS自定义属性(变量),例如
--progress-percent
conic-gradient
// 假设你想将进度更新到75%
const progressBar = document.querySelector('.circular-progress');
progressBar.style.setProperty('--progress-percent', '75');这种方式非常灵活,JavaScript只需要关注数据的变化,而CSS负责渲染,职责分离清晰。
动画效果: 虽然
conic-gradient
transition
background
transition
conic-gradient
平滑过渡: 在
.circular-progress
transition
background
background-image
conic-gradient
background
transition
background
background
.circular-progress::before {
/* ...其他样式... */
transition: background 0.5s ease-in-out; /* 尝试动画化背景 */
}实际测试中,直接
transition
background
conic-gradient
使用@property
@property
--progress-percent
transition
animation
@property --progress-percent {
syntax: "<number>";
inherits: false;
initial-value: 0;
}
.circular-progress::before {
/* ...其他样式... */
transition: --progress-percent 0.5s ease-in-out;
}然后JavaScript更新变量时就会有动画了。这是目前最理想的纯CSS动画方案。
JavaScript驱动动画: 如果不考虑
@property
requestAnimationFrame
--progress-percent
function animateProgress(start, end, duration) {
let startTime = null;
const progressElement = document.querySelector('.circular-progress');
function step(currentTime) {
if (!startTime) startTime = currentTime;
const progress = Math.min((currentTime - startTime) / duration, 1);
const currentValue = start + (end - start) * progress;
progressElement.style.setProperty('--progress-percent', currentValue);
if (progress < 1) {
requestAnimationFrame(step);
}
}
requestAnimationFrame(step);
}
// 调用动画:从当前值动画到75%,持续1秒
// animateProgress(parseInt(progressBar.style.getPropertyValue('--progress-percent')), 75, 1000);我个人更倾向于优先考虑CSS方案,因为它可以将动画的性能优化交给浏览器,但如果CSS无法满足,JS动画也是非常可靠的兜底方案。CSS这东西,有时候就是这样,一个新属性就能彻底改变你的思路。
以上就是CSS怎样制作环形进度条?conic-gradient应用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号