纯css实现环形进度条+动画加载效果

news/2025/4/1 11:10:58/

写在最前面:

本文是小程序开发中,使用纯css+html实现的进度圆环动画加载效果(换成vue也是一样的)。
如果你的项目可以用echarts,建议还是用插件,手搓不易,这很难评。

在这里插入图片描述
实现效果如上图:

HTML部分

<view :class="styles.chargeBox"><view :class="styles.clockFace"><!-- 24 个刻度线 --><viewv-for="i in 24":key="i":class="[styles.tick]":style="{ transform: `rotate(${(i - 1) * 15}deg) translateY(-248rpx)` }"><!-- 特殊刻度数字 --><textv-if="isSpecialTick(i)":class="styles.tickNumber":style="{ transform: `rotate(${-((i - 1) * 15)}deg)` }">{{ getTickNumber(i) }}</text></view><!-- 环形轨道 --><view :class="targetProgress == 100 ? styles.orbitFinsh : styles.orbitTrack"  :style="{ '--progress': `${currentProgress}` }"><template  v-if="targetProgress > 0 && targetProgress < 100"><!-- 进度条圆角 --><view :class="styles.orbitEnd"></view><!-- 半径上的小圆点 --><view :class="styles.orbitCircle"></view></template><!-- 外层渐变圆环 --><view :class="styles.outerCircle"><view :class="styles.circularTrack"><!-- 最小内层圆环 --><view :class="styles.innerCircle"><view :class="styles.measure"><view :class="styles.num">{{ currentProgress }}<view :class="styles.unit">%</view></view></view></view></view></view></view></view></view>

js部分

const isSpecialTick = (i) => {const angle = (i - 1) * 15;return angle % 90 === 0; // 0°, 90°, 180°, 270°
};const getTickNumber = (i) => {const angle = (i - 1) * 15;switch (angle) {case 0:return '50';case 90:return '75';case 180:return '0';case 270:return '25';default:return '';}
};
const currentProgress = ref(0);
const targetProgress = ref(90);// 挂载后执行动画
onMounted(() => {const interval = setInterval(() => {if (currentProgress.value >= targetProgress.value) {clearInterval(interval);return;}currentProgress.value++;}, 10);
});

css_90">css部分

.chargeBox {display: flex;justify-content: center;align-items: center;position: relative;margin-bottom: 16px;z-index: 9;.clockFace {width: 496px;height: 496px;border-radius: 50%;position: relative;margin: 50px;display: flex;justify-content: center;align-items: center;}.tick {position: absolute;width: 8px; // 刻度线的宽度height: 8px; // 刻度线的高度border-radius: 50%;background-color: var(--color-font-light__3); // 刻度线的颜色top: 50%; // 垂直居中left: 50%; // 水平居中transform-origin: center top; // 设置变换的原点}.specialTick {width: 16px; // 刻度线的宽度height: 16px; // 刻度线的高度border-radius: 50%;background-color: var(--color-font-light__1); // 特殊刻度线的颜色}.tickNumber {position: absolute;top: -35px; // 调整数字的位置left: -5px;transform: translate(-55%, -55%);font-size: 24px;line-height: 1;color: #0000001F;}.orbitFinsh {width: 450px;height: 450px;position: relative;border-radius: 50%;display: flex;justify-content: center;align-items: center;animation: calc(var(--progress) * 1%) 1.5s linear infinite; /* 应用旋转和增长动画 */background: radial-gradient(transparent 0%,#137DF5 calc(var(--progress) * 1%),transparent calc(var(--progress) * 1%),);z-index: 1;}.orbitTrack {width: 450px;height: 450px;position: relative;border-radius: 50%;display: flex;justify-content: center;align-items: center;animation: calc(var(--progress) * 1%) 1.5s linear infinite; /* 应用旋转和增长动画 */background: conic-gradient(from 180deg,#E7EEFE 0%, #137DF5 calc(var(--progress) * 1%),transparent calc(var(--progress) * 1%),);z-index: 1;}.orbitEnd {position: absolute;top: 0;left: 0;width: 100%;height: 100%;border-radius: 50%;transform: rotate(calc(180deg + (var(--progress) * 3.6deg))); transform-origin: center center;animation: transform 1.5s linear infinite; }.orbitEnd::before {position: absolute;display: inline-block;content: "";width: 15px;height: 16px;border-radius: 50%;background-color: #137DF5;top: 0%;left: 47.9%;}.orbitCircle {position: absolute;top: 0;left: 0;width: 100%;height: 100%;border-radius: 50%;transform: rotate(calc(180deg + var(--progress) * 3.6deg));animation: transform 1.5s linear infinite; transform-origin: center center;z-index: 2;}.orbitCircle::after {position: absolute;display: inline-block;content: "";width: 22px;height: 22px;border-radius: 50%;border: 5.41px solid #fff;background-color: #137DF5;top: 8%;left: 46.5%;}.outerCircle {width: 420px;height: 420px;background: rgba(227,255,241,0.41);box-shadow: inset 0px 0px 54px 0px rgba(99,191,255,0.48);border-radius: 50%;display: flex;justify-content: center;align-items: center;position: relative;overflow: visible;.innerCircle {width: 272px;height: 272px;background: radial-gradient(42% at 73% 53%, #FFFFFD 100%, #D2E2FF 100%);box-shadow: 0px 22px 27px -14px rgba(54,110,244,0.08), 0px 43px 65px 5px rgba(54,110,244,0.04), 0px 16px 81px 14px rgba(54,110,244,0.23), inset 0px 0px 32px 0px #FFFFFF;border-radius: 50%;z-index: 10; display: flex;justify-content: center;align-items: center;}.circularTrack {width: 272px;height: 272px;border-radius: 50%;display: flex;justify-content: center;align-items: center;background:  radial-gradient(#FFFFFD 0%, #D2E2FF 100%,);}}.measure {font-family: Bebas, Bebas;font-weight: 500;color: #137DF5;display: flex;justify-content: flex-end;align-items: flex-end;.num {font-size: 96px;line-height: 96px;position: relative;}.unit {position: absolute;bottom: 0;right: -30px;font-size: 36px;line-height: 46px;text-align: left;display: inline-block;}}}

end!
希望记录的问题能帮助到你~


http://www.ppmy.cn/news/1584188.html

相关文章

从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.2.2文本生成逻辑:Top-k采样与温度控制

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 2.2.2 文本生成逻辑:Top-k采样与温度控制1. 文本生成的核心挑战与数学框架1.1 自回归生成的基本流程2. `Top-k`采样原理与工程实现2.1 数学定义与算法流程2.2 PyTorch实现优化3. 温度控制的数学本质与参…

【数学建模】(启发式算法)模拟退火算法:原理、实现与应用

模拟退火算法&#xff1a;原理、实现与应用 文章目录 模拟退火算法&#xff1a;原理、实现与应用1. 引言2. 算法原理2.1 基本思想2.2 算法流程 3. Python实现4. 应用场景4.1 旅行商问题(TSP)4.2 图分割问题4.3 VLSI布局优化4.4 作业调度问题 5. 算法优缺点5.1 优点5.2 缺点 6. …

06-SpringBoot3入门-常见注解(简介)

1、Controller ResponseBody Controller是Spring MVC 中的注解&#xff0c;负责处理 HTTP 请求。 ResponseBody是Spring MVC 中的注解&#xff0c;用于直接将方法的返回值作为 HTTP 响应体。 2、RestController RestController Controller ResponseBody 3、RequestMappin…

AI赋能职教革新:生成式人工智能(GAI)认证重构技能人才培养新范式

在数字化浪潮的推动下&#xff0c;职业教育正经历着前所未有的变革。面对快速变化的市场需求和技术发展&#xff0c;如何培养具备高技能、高素质的人才成为了职业教育的重要课题。而在这个过程中&#xff0c;人工智能&#xff08;AI&#xff09;技术的融入&#xff0c;无疑为职…

ActiveMQ监听器在MQ重启后不再监听问题

应用的监听器注解 JmsListener(destination "TopicName",containerFactory "FactoryName")工厂代码 BeanJmsListenerContainerFactory<?> FactoryName(ConnectionFactory connectionFactory){SimpleJmsListenerContainerFactory factory new S…

Postman 如何发送 JSON 格式的 API 请求?

在 Postman 中创建并发送 JSON 格式的请求&#xff0c;让你更加高效地进行 API 测试和开发工作。从新建请求到设置请求头&#xff0c;再到编辑请求体和最终的发送请求&#xff0c;我们将一步步地引导你掌握。 Postman 发送 json 格式的请求教程

django多线程实现原理

一、WSGI服务器的底层支持 多线程处理机制 Django本身不直接管理线程&#xff0c;而是通过WSGI服务器&#xff08;如Gunicorn、uWSGI&#xff09;实现多线程。例如&#xff0c;Gunicorn默认以多线程模式运行&#xff0c;每个请求分配独立线程处理&#xff0c;Django框架代码在线…

甘肃旅游服务平台+论文源码视频演示

4 系统设计 4.1系统概要设计 甘肃旅游服务平台并没有使用C/S结构&#xff0c;而是基于网络浏览器的方式去访问服务器&#xff0c;进而获取需要的数据信息&#xff0c;这种依靠浏览器进行数据访问的模式就是现在用得比较广泛的适用于广域网并且没有网速限制要求的小程序结构&am…