如何使用CSS制作旋转进度条的实现步骤

来源:C语言教程作者:苏锦程头衔:网络博主
导读:本期聚焦于苏锦程创作的《如何使用CSS制作旋转进度条的实现步骤》,敬请观看详情。旋转进度条并不依赖图片或Canvas,纯CSS就能实现环形填充效果。现代浏览器推荐使用conic-gradient配合CSS变量,按百分比设置颜色边界并动态更新;需要兼容旧环境时,也可以用两个半圆容器和overflow隐藏实现分段旋转。无论哪种方案,核心都是控制颜色沿圆周覆盖的角度。本文从基础圆环结构开始,拆解conic-gradient绘制、自定义属性驱动进度、平滑过渡、半圆方案对比以及旋转加载动画,帮助读者完整掌握一个可交互旋转进度条的实现步骤。示例代码覆盖HTML结构和JavaScript更新逻辑,调整圆环厚度、颜色和动画时间都很方便,适合用于任务看板、上传进度展示和加载指示器。

旋转进度条通常用于展示任务完成度或加载状态,它比线性进度条更节省横向空间,也更容易融入卡片、仪表盘和移动端界面。实现一个纯CSS旋转进度条,核心思路是让颜色沿着圆周按比例填充,同时保留中间空白区域形成圆环。传统做法会使用两个半圆容器配合rotate旋转,现代浏览器则可以直接使用conic-gradient完成同样的效果。本文从易于维护和动态更新的角度,优先介绍conic-gradient方案,再对比半圆方案,帮助理解旋转和角度计算。

如何使用CSS制作旋转进度条的实现步骤

一、用conic-gradient画出基础圆环

conic-gradient是CSS中专门用于圆锥渐变的函数,它的渐变起点默认在元素顶部,然后按顺时针方向绕中心旋转,非常适合制作圆形进度。想让进度条按百分比显示,只需要把前一部分设置为主题色,剩余部分设置为浅灰色。示例中calc(var(--progress) * 1%)用来把0到100的数值转换成0%到100%的百分比,#4f8cff从顶部开始填充到该百分比位置,紧接着#e8ecf1覆盖剩余部分。

为了把实心圆变成圆环,最直接的方式是在内部叠加一个与背景色相同的圆形。这里使用::after伪元素,通过inset控制内圆与外层边框的距离,该距离就是圆环的粗细。伪元素设置border-radius:50%后,会覆盖中心区域,只露出外圈的渐变部分。进度文本需要放在伪元素上方,因此可以给文本容器设置相对定位并提高层级。

<div class="progress-ring" style="--progress: 72;">
  <span class="progress-text">72%</span>
</div>
.progress-ring {
  --progress: 0;
  position: relative;
  width: 150px;
  height: 150px;
  border-radius: 50%;
  background: conic-gradient(
    #4f8cff calc(var(--progress) * 1%),
    #e8ecf1 0
  );
  display: flex;
  align-items: center;
  justify-content: center;
}
.progress-ring::after {
  content: "";
  position: absolute;
  inset: 14px;
  border-radius: 50%;
  background: #fff;
}
.progress-text {
  position: relative;
  z-index: 1;
  font-size: 28px;
  font-weight: 600;
  color: #333;
}

这段结构非常简单,外层.progress-ring负责渐变圆盘和尺寸,伪元素负责挖空中心,.progress-text显示百分比。当--progress变化时,calc会重新计算颜色边界,进度条就会按照新数值渲染。需要注意的是,如果内圆背景色与页面背景不一致,可以将其设置为与容器所在背景相同的颜色,或者改用mask方案彻底透明。

二、用CSS变量驱动进度更新与过渡

静态圆环只是第一步,实际业务中进度值通常来自上传进度、接口返回或计时器。CSS变量非常适合承担这个桥梁角色。通过style.setProperty修改行内样式中的--progress,无需改动样式表,就能让圆环实时响应。下面是一段简单的JavaScript更新逻辑,它每50毫秒增加1%,直到100%。

const ring = document.querySelector('.progress-ring');
const text = ring.querySelector('.progress-text');
let value = 0;
const timer = setInterval(() => {
  value = Math.min(value + 1, 100);
  ring.style.setProperty('--progress', value);
  text.textContent = value + '%';
  if (value >= 100) {
    clearInterval(timer);
  }
}, 50);

如果希望进度变化时颜色边界平滑移动,需要给自定义属性注册类型。使用@property声明--progress为数值类型后,再给.progress-ring设置transition: --progress 0.25s ease。这样每次数值更新都会被浏览器插值,颜色边界会平滑旋转到新位置,而不是瞬间跳变。需要注意的是,@property目前在现代浏览器中支持良好,但在较旧环境中不会生效,此时可以退化为直接跳变,不影响功能。

@property --progress {
  syntax: '<number>';
  initial-value: 0;
  inherits: false;
}
.progress-ring {
  transition: --progress 0.25s ease;
}

这种方案的维护成本很低,进度值只需要一个数字,圆环厚度、颜色、尺寸都集中在CSS中。如果要加环形阴影、渐变高光,也只需要调整background和伪元素样式,不会影响核心逻辑。

三、半圆容器方案与遮罩处理

在conic-gradient普及之前,开发者通常使用两个半圆容器加overflow隐藏的方式来实现圆形进度。其思路是把一个完整圆分成左右两半,每半容器内放置一个宽度翻倍的填充层,通过旋转填充层让颜色逐渐露出。右半容器负责0%到50%的进度,超过50%后左半容器开始参与旋转。这种方案的优势是兼容更老的浏览器,但代码量和状态判断明显增加。

半圆方案的HTML结构会多出几个嵌套层,基本形态如下。外层容器是圆形,内部左右两个容器各占一半宽度,并且都设置overflow:hidden,保证只显示所属半区的内容。填充层宽度需要是容器宽度的两倍,这样才能形成完整圆盘的一半。旋转原点要放在半圆的圆心,也就是左半容器内的右边界中点,或右半容器内的左边界中点。

<div class="legacy-ring">
  <div class="legacy-left">
    <div class="legacy-left-fill"></div>
  </div>
  <div class="legacy-right">
    <div class="legacy-right-fill"></div>
  </div>
</div>
.legacy-ring {
  position: relative;
  width: 140px;
  height: 140px;
}
.legacy-left,
.legacy-right {
  position: absolute;
  top: 0;
  width: 50%;
  height: 100%;
  overflow: hidden;
}
.legacy-left {
  left: 0;
}
.legacy-right {
  right: 0;
}
.legacy-left-fill,
.legacy-right-fill {
  position: absolute;
  width: 200%;
  height: 100%;
  background: #4f8cff;
  border-radius: 50%;
}
.legacy-left-fill {
  left: 0;
  transform-origin: right center;
}
.legacy-right-fill {
  right: 0;
  transform-origin: left center;
}

这个方法的关键在于旋转逻辑:在50%以下时,只旋转右半填充层,左半保持隐藏;超过50%后,右半填充层固定旋转到180度,同时开始旋转左半填充层。由于填充层是实心圆盘,默认会形成饼图进度,如果要得到圆环,还需要再叠加一个中心圆形遮罩。可以看出,conic-gradient方案减少了大量状态判断,更推荐在新项目中使用。

四、旋转加载动画与细节优化

有时进度条不是为了展示实际百分比,而是表示正在加载。这种情况下可以给圆环添加一个连续旋转动画。做法是让整个.progress-ring持续旋转,同时保持内部文本不转或反向旋转。对于纯加载指示器,通常不需要中心文本,直接使用一个半透明圆环加旋转动画即可。

.loading-ring {
  width: 60px;
  height: 60px;
  border: 6px solid #e8ecf1;
  border-top-color: #4f8cff;
  border-radius: 50%;
  animation: spin 0.9s linear infinite;
}
@keyframes spin {
  to {
    transform: rotate(360deg);
  }
}

这个简化版加载环只使用四边边框,把顶部边框设置为主题色,其他边框保持浅灰,再配合animation让整个元素旋转。与前面基于百分比的圆环不同,它重点强调系统正在工作,不展示精确进度。这种旋转动画可以和conic-gradient方案组合,例如在进度达到100%前显示一个外圈旋转高光,但要注意动画层和进度层不要互相覆盖。

在实际项目中还需要考虑无障碍和可读性。承载进度信息的元素建议设置role="progressbar"和aria-valuenow,颜色对比度也要满足基本要求。对于移动端,尺寸不宜太小,圆环厚度至少4像素,否则在小屏幕上难以辨认。以上方案全部基于纯CSS和少量JavaScript,没有额外请求图片,适合作为组件嵌入到各类前端框架中。

CSS旋转进度条CSS动画进度条实现修改时间:2026-09-23 16:22:35

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/0923/60967.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。