0

0

CSS怎样制作加载进度圆环动画?conic-gradient渐变

蓮花仙者

蓮花仙者

发布时间:2025-08-16 13:20:02

|

427人浏览过

|

来源于php中文网

原创

使用conic-gradient制作加载进度圆环动画的核心是通过多层背景:radial-gradient“挖空”中心形成圆环,conic-gradient根据css变量绘制扇形进度;2. 通过@keyframes动画改变--current-progress变量实现动态填充效果;3. 动画可结合ease-in-out或cubic-bezier提升流畅度,多色渐变增强视觉层次;4. 需用javascript动态更新aria属性以保障可访问性;5. conic-gradient还可拓展用于饼图、颜色选择器、创意背景等场景,展现强大灵活性。该方案以简洁代码实现高性能、易维护的视觉效果,是进度环的理想选择。

CSS怎样制作加载进度圆环动画?conic-gradient渐变

使用CSS制作加载进度圆环动画,特别是利用

conic-gradient
,其实比你想象的要直接得多。核心思路就是通过
conic-gradient
来绘制扇形进度,再巧妙地“挖空”中心,形成一个圆环,然后通过CSS变量和
@keyframes
动画来驱动这个扇形的百分比变化。这样一来,一个动态的、视觉效果不错的进度环就出来了。

解决方案

要实现一个基于

conic-gradient
的进度圆环动画,我们通常会结合一个元素本身的背景和伪元素,或者更巧妙地利用多层背景。我个人比较偏爱后者,因为它把所有逻辑都封装在一个元素里,管理起来挺干净的。

首先,HTML部分可以非常简洁,一个

div
足以:

立即学习前端免费学习笔记(深入)”;

0%

接着是关键的CSS部分。这里我会用CSS变量来控制进度、尺寸和颜色,这样调整起来非常方便。

.loading-progress-ring {
    /* 定义一些CSS变量,让样式调整更灵活 */
    --current-progress: 0; /* 初始进度百分比 */
    --ring-size: 150px; /* 圆环的整体尺寸 */
    --ring-thickness: 12px; /* 圆环的厚度 */
    --fill-color: #6a1b9a; /* 进度条的填充色,我喜欢紫色 */
    --empty-color: #e0e0e0; /* 未填充部分的颜色 */
    --text-color: #333; /* 文本颜色 */
    --animation-duration: 2s; /* 动画时长 */

    width: var(--ring-size);
    height: var(--ring-size);
    border-radius: 50%; /* 确保是圆形 */
    display: flex;
    align-items: center;
    justify-content: center;
    position: relative; /* 用于内部文本定位 */
    overflow: hidden; /* 防止内容溢出,尽管在这里不那么关键 */

    /* 
     * 核心魔法:使用多层背景。
     * 第一层 (radial-gradient) 用来“挖空”中心,形成圆环的内边缘。
     * 第二层 (conic-gradient) 才是真正的进度条。
     */
    background:
        /* 径向渐变,从中心向外扩散,形成一个透明的内圆,从而“挖空”圆环 */
        radial-gradient(
            circle at center,
            white calc(50% - var(--ring-thickness)), /* 内圆的半径,比总半径小一个厚度 */
            transparent calc(50% - var(--ring-thickness) + 1px) /* 确保边缘清晰 */
        ),
        /* 锥形渐变,从0度开始,根据--current-progress变量绘制填充色 */
        conic-gradient(
            var(--fill-color) calc(var(--current-progress) * 1%), /* 进度填充色 */
            var(--empty-color) calc(var(--current-progress) * 1%) /* 未填充色 */
        );
    /* 如果conic-gradient不支持,提供一个基础背景色 */
    background-color: var(--empty-color); 

    /* 动画定义:驱动--current-progress变量从0到指定值 */
    animation: fillProgress var(--animation-duration) linear forwards;
    /* 
     * 实际项目中,--current-progress的值通常会通过JavaScript动态设置,
     * 这里为了演示动画效果,直接在keyframes里定义。
     */
}

.loading-progress-ring .progress-value {
    font-size: calc(var(--ring-size) / 4); /* 根据圆环大小调整字体 */
    font-weight: bold;
    color: var(--text-color);
    z-index: 1; /* 确保文本在渐变之上 */
    /* 
     * 动画监听:通过JS监听动画的每一帧,更新文本显示。
     * 这种方式在CSS中无法直接实现,通常需要JavaScript。
     * 这里只是一个占位符,实际动画过程中文本不会自动更新。
     */
}

/* 关键帧动画,控制进度变量的变化 */
@keyframes fillProgress {
    from {
        --current-progress: 0;
    }
    to {
        --current-progress: 75; /* 示例:动画到75% */
    }
}

这段代码的核心在于

background
属性里两层渐变的叠加。
radial-gradient
负责在中心挖出一个圆洞,而
conic-gradient
则负责绘制实际的进度扇形。当它们叠加时,
radial-gradient
的透明部分就让底层的
conic-gradient
显露出来,形成了一个有厚度的圆环。通过动画
--current-progress
变量,我们就能看到进度条逐渐填充的效果。

为什么
conic-gradient
是制作进度圆环的理想选择?

谈到进度圆环,你可能会想到用SVG、或者多个

div
叠加,甚至是一些复杂的
clip-path
技巧。但说实话,当
conic-gradient
出现后,它几乎成了这类需求的“最佳拍档”。为什么这么说呢?

首先,

conic-gradient
(锥形渐变)的特性就是围绕一个中心点进行颜色过渡,就像钟表的指针扫过表盘一样。这与我们进度圆环的需求——从0%到100%的扇形填充——简直是天作之合。它天然地与角度(0-360度)和百分比(0-100%)的概念完美对应。你不需要去计算复杂的三角函数或者路径数据,只需要简单地把百分比转换成角度(或直接用百分比),就能精确控制填充的范围。

相比之下,

linear-gradient
(线性渐变)和
radial-gradient
(径向渐变)就没那么直观了。
linear-gradient
是从一端到另一端渐变,更适合条形进度;
radial-gradient
是从中心向外扩散,适合径向模糊或圆形填充,但要做出“扇形进度”效果,通常需要额外的遮罩或裁剪,远不如
conic-gradient
直接。

更重要的是,

conic-gradient
让整个进度圆环的实现变得异常简洁。你只需要一个HTML元素,所有的视觉效果和动画逻辑都可以在CSS里完成。这不仅减少了DOM节点的数量,提升了渲染性能,也让代码更易于理解和维护。在现代前端开发中,追求“少即是多”的原则,
conic-gradient
无疑是这条路上的一个重要工具

如何让进度圆环动画看起来更流畅、更专业?

一个能动的圆环固然好,但要让它看起来更“丝滑”、更有质感,还有些细节可以打磨。这不仅仅是技术上的优化,更是用户体验层面的考量。

302.AI
302.AI

302.AI是一个汇集全球顶级AI的自助服务平台

下载

一个很重要的点是动画的缓动函数(

animation-timing-function
。默认的
linear
虽然简单,但有时会显得有点生硬。尝试使用
ease-in-out
会让动画在开始和结束时有加速和减速的效果,看起来更自然。如果你想玩得更高级,
cubic-bezier()
函数能让你自定义动画曲线,实现各种奇特的加速减速效果,比如模拟物理世界的弹性或阻尼。

再来,色彩的选择和过渡也能极大影响观感。如果你觉得单色填充太单调,可以在

conic-gradient
中加入更多的颜色断点,比如从一种颜色平滑过渡到另一种颜色,甚至可以做出彩虹效果。当然,这要看具体的设计需求,有时候简洁的单色反而更显专业。

/* 示例:更复杂的conic-gradient,带多种颜色过渡 */
background:
    radial-gradient(
        circle at center,
        white calc(50% - var(--ring-thickness)),
        transparent calc(50% - var(--ring-thickness) + 1px)
    ),
    conic-gradient(
        #ff9a9e 0%, /* 起始颜色 */
        #fad0c4 var(--current-progress), /* 填充色过渡 */
        #ffb7b7 var(--current-progress), /* 另一种填充色,增加层次 */
        #e0e0e0 100% /* 未填充色 */
    );

别忘了可访问性。对于屏幕阅读器用户来说,一个纯视觉的进度条是毫无意义的。在实际项目中,我们应该为进度环添加

aria-valuenow
aria-valuemin
aria-valuemax
属性,并用JavaScript动态更新
aria-valuenow
的值,这样屏幕阅读器就能正确地播报当前的进度。

最后,性能考量。虽然

conic-gradient
本身性能不错,但在一些老旧设备或复杂页面中,频繁的动画可能会造成性能压力。如果动画非常复杂或元素数量多,可以考虑使用
will-change: transform;
will-change: background;
来提前通知浏览器进行优化,但切记不要滥用,因为它也可能带来负面影响。

除了进度显示,
conic-gradient
还能在哪些创意场景中应用?

conic-gradient
的魅力远不止于进度圆环。一旦你掌握了它的基本原理——围绕中心点进行颜色扫过——你会发现它的应用场景简直是无限的,很多时候,它能以一种非常简洁的方式实现原本需要复杂图形库才能完成的效果。

最直观的延伸就是饼图(Pie Charts)。无论是静态的展示数据比例,还是动态的随着数据更新而变化,

conic-gradient
都能轻松搞定。你只需要为每个数据段计算出其对应的百分比,然后将这些百分比转换为
conic-gradient
的颜色停止点,一个漂亮的饼图就跃然纸上。

再比如,颜色选择器。很多设计工具中的圆形颜色选择器,其核心就是一个巨大的

conic-gradient
,它将色相环完美地呈现出来。用户只需点击或拖动,就能选择到想要的颜色。这比用图片或SVG来模拟色相环要灵活得多,也更具响应性。

此外,它在背景设计中也有独特表现。你可以用它来制作各种几何图案、抽象背景,甚至是模拟光线从中心向外扩散的效果。通过调整渐变的起始角度、颜色和颜色停止点,能够创造出非常丰富的视觉纹理。想象一下,一个网页背景由多个

conic-gradient
叠加而成,每个渐变都带着不同的透明度和混合模式,那将是多么富有层次感和动态美。

我甚至见过有人用

conic-gradient
来制作文本的描边或填充效果,虽然这需要一些额外的
mask
clip-path
配合,但最终效果确实令人惊艳,让普通的文字瞬间变得与众不同。

总而言之,

conic-gradient
就像CSS世界里的一把瑞士军刀,看似简单,实则蕴藏着巨大的潜力。它鼓励我们跳出传统思维,用更“CSS原生”的方式去解决视觉设计问题,从而让我们的前端代码更优雅、更高效。

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

544

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

372

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

727

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

470

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

393

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

990

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

655

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

544

2023.09.20

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

150

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.7万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.7万人学习

CSS教程
CSS教程

共754课时 | 17.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号