本文记录通过 HTML + CSS + 部分原生 JS 使用 SVG 嵌入 HTML 文档的用法实现常见的圆形和矩形进度条效果,效果图如下:(实际运行效果是进度条从 0 过渡到一个目标值比如 100%

下面直接上代码:

圆形

HTML:线性渐变色的代码可以不加,非必须

<!-- 最外层的盒子 使用 svg 格式绘制图形 --><svg class="box" width="200" height="200"><!-- 定义一个线性渐变色,非必须如果使用纯色可以不写 --><defs><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%"><stop offset="0%" style="stop-color:rgb(57, 242, 218);stop-opacity:1" /><stop offset="50%" style="stop-color:rgb(6, 166, 230);stop-opacity:1" /><stop offset="100%" style="stop-color:hsl(223, 92%, 50%);stop-opacity:1" /></linearGradient></defs><!-- circle用于定义圆形进度条,stroke 可以直接使用纯色:stroke="skyblue" --><circle class="progress" cx="100" cy="100" r="60" fill="transparent" stroke="url(#grad1)" stroke-width="10"></circle><!-- 内部的文本 --><text class="text" x="100" y="100" fill="#0c4ef5" text-anchor="middle" alignment-baseline="middle"></text></svg>

CSS:仅处理了 svg 的位置而已,整个 CSS 都非必须,可以不写

<style>.box {position: absolute;top: 0;left: 0;right: 0;bottom: 0;margin: auto;}/* 对进度条这里用到的最重要的两个属性说明 */.progress {/* 注:使用 document.querySelector('.progress').getTotalLength() 可以得到圆一圈大小约为377 *//* stroke-dasharray: 377; *//* stroke-dashoffset 表示当前进度条剩余长度为 0 时表示进度条已完成,最大为 stroke-dasharray 的值,等于 stroke-dasharray 的值 时表示进度为 0我们可以使用 js 动态更新这个值得到进度逐步增加的效果*//* stroke-dashoffset: 377; */}
</style>

JavaScript:主要实现进度条“跑起来”的效果,原理就是动态更新圆形的 stroke-dashoffset 值

<script>// 获取进度条元素const progress = document.querySelector('.progress')const text = document.querySelector('.text')  // 获取内部的文本元素// 获取圆一整圈的长度const maxLen = Math.ceil(progress.getTotalLength())   // 结果可向上取整progress.style.strokeDasharray = maxLenconsole.log(maxLen);// 效果1:自定义进度 teep 条// 定义的进度效果列表(注:表示的是百分比的值)/* const loadings = [5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]let loadingIndex = 0const timer = setInterval(() => {progress.style.strokeDashoffset = maxLen - (loadings[loadingIndex] / 100 * maxLen)loadingIndex += 1text.innerHTML = `${loadings[loadingIndex]}%`// 进度列表的值取完就停止定时器if(loadingIndex === loadings.length) {clearInterval(timer)text.innerHTML = `OK`}}, 200);   // 注:间隔时间越短进度条越丝滑*/// 效果2:匀速从 0~100% 的进度效果let num = maxLen   // 进度条的初始值,效果为进度条为 0// 此类场景使用 window.requestAnimationFrame() 进行循环比使用定时器性能更好let timer = window.requestAnimationFrame( function fn() {// 循环继续的条件if(num > 0) {num -= 2    // 减得越小动画持续时间越长progress.style.strokeDashoffset = numtext.innerHTML = ((1 - num / maxLen) * 100).toFixed() + '%'// 继续循环则递归调用 fn 函数timer = window.requestAnimationFrame(fn)} else {// 循环停止progress.style.strokeDashoffset = 0// 清除定时器window.cancelAnimationFrame(timer)}})</script>

矩形

HTML:线性渐变色的代码可以不加,非必须

<svg class="box" width="800" height="20"><!-- 定义一个线性渐变色,非必须,可以不写 --><defs><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%"><stop offset="0%" style="stop-color:rgb(57, 242, 218);stop-opacity:1" /><stop offset="50%" style="stop-color:rgb(6, 166, 230);stop-opacity:1" /><stop offset="100%" style="stop-color:rgb(12, 78, 245);stop-opacity:1" /></linearGradient></defs><!-- 将线性渐变色绑定到矩形的 fill 背景色上,fill 也可以直接给纯色 --><rect class="rect" width="0" height="20" rx="5" ry="5" fill="url(#grad1)"></rect><text class="text" x="400" y="12" fill="red" text-anchor="middle" alignment-baseline="middle">0%</text></svg>

CSS:核心代码是给 box 加一个背景色和内部矩形同样的圆角

<style>.box {position: absolute;top: 40px;left: 50%;transform: translateX(-50%);background-color: #eee;border-radius: 5px;}</style>

JavaScript:核心原理就是动态给矩形的 width 赋值可以百分比

<script>const rect = document.querySelector('.rect')const text = document.querySelector('.text')let rectWidth = 80   // 矩形的宽度,即停止动画的值 单位: 百分比let loadingWidth = 0    // 进度条开始时的初始值// 此类场景使用 window.requestAnimationFrame() 进行循环比使用定时器性能更好let timer = window.requestAnimationFrame( function fn() {// 循环继续的条件if(loadingWidth < rectWidth) {loadingWidth += 0.5   // 加的越小动画持续时间越长rect.style.width = loadingWidth + '%'text.innerHTML = loadingWidth.toFixed() + '%'// 继续循环则递归调用 fn 函数timer = window.requestAnimationFrame(fn)} else {// 循环停止rect.style.width = rectWidth + '%'// 清除定时器window.cancelAnimationFrame(timer)}})</script>

源码

以上就是使用 HTML + CSS +少量的原生 JS 实现圆形、矩形进度条效果的示例代码了

源码地址:progress-demo: 通过 HTML + CSS + 部分原生 JS 使用 SVG 嵌入 HTML 文档的用法实现常见的圆形和矩形进度条效果项目源码

更多关于 SVG 的教程:菜鸟教程-SVG教程

HTML + CSS 实现矩形/圆形进度条效果 - SVG相关推荐

  1. 如何用CSS做倒计时/圆形进度条效果

    前言:有时,我们会见一些圆形的进度条,随着进度条的推进,进行倒计时的变化. 若是只实现一个圆环的话,只用border和border-radius就能画出来. 但是这样的圆环不能动,产生进度条效果的重要 ...

  2. android绘制环形进度_Android使用Canvas绘制圆形进度条效果

    前言 Android自定义控件经常会用到Canvas绘制2D图形,在优化自己自定义控件技能之前,必须熟练掌握Canvas绘图机制.本文从以下三个方面对Canvas绘图机制进行讲解: 画布Canvas ...

  3. Python动画制作:90秒倒计时圆形进度条效果

    今天单独讲解一下使用python自带的tkinter模块,如何做出下图这种倒计时的效果. 我们使用tkinter模块里的Canvas画布组件来完成这个倒计时的制作. 拆解最终完成的图形,可以看到,除了 ...

  4. android自定义渐变色圆环,Android实现渐变圆环、圆形进度条效果

    最近做了一个功能,里面涉及到了渐变圆形的需求.就是一个颜色可以渐变的圆环,最后实现的效果如下图: 左图是带渐变效果,右图是不带渐变效果.原理还是绘图,Canvas可以绘制的对象有:弧线(arcs).填 ...

  5. canvas 绘制圆形进度条

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  6. 在html中怎么用圆形渐变,css怎么实现圆形渐变进度条效果

    css怎么实现圆形渐变进度条效果 发布时间:2021-03-17 10:29:57 来源:亿速云 阅读:129 作者:小新 这篇文章给大家分享的是有关css怎么实现圆形渐变进度条效果的内容.小编觉得挺 ...

  7. 圆的css样式,圆形进度条css3样式

    30% 以下样式100upx是50upx的2倍,这是尺寸比例 .con { position: relative; display: inline-block; height: 100upx; wid ...

  8. css实现圆形进度条加载动画

    这里我会把遇到这个需求时的实现过程和遇到的问题记录下来,如果只是要看最终实现结果可直接滑到底部看实现代码. 我们经常可以看到网上有一些圆形进度条跟随数字的变化慢慢变成一个圆,这个动画实际上可以通过纯c ...

  9. Vue2.0+SVG实现音乐播放圆形进度条组件,传入实时百分比实现圆圈进度动画效果

    vue2.0+SVG实现音乐播放圆形进度条组件,传入实时百分比实现圆圈进度动画效果 需求分析: 类似于大多数音乐播放器中等mini播放器控制按钮,显示播放进度,实时更新进度. progress-cir ...

最新文章

  1. 关于缓存命中率的几个关键问题!
  2. sybase存储过程修改
  3. 【简便解法】1089 狼人杀-简单版 (20分)_25行代码AC
  4. java显示星期几_Java 使用日历显示星期几
  5. 计组之中央处理器:2、指令周期数据流(指令周期、机器周期、时钟周期、取指周期、间址周期、执行周期、中断周期、单指令周期、多指令周期、流水线方案)
  6. html底部弹出选择,jQuery手机端底部弹出菜单列表特效代码
  7. 百面机器学习——svm基尼系数寻找最优划分
  8. 相同数据源情况下,使用Kafka实时消费数据 vs 离线环境下全部落表后处理数据,结果存在差异...
  9. mysql如何实现递归查询
  10. c# splitContainer1隐藏panel1/2
  11. 弱电安防监控系统的安装要点
  12. Docer实现Django Uwsgi部署
  13. 5分钟快速撑起高校邮件保护伞
  14. XYIXY.COM短网址在线生成,快速、稳定、永久有效,免费开放网址缩短API接口。...
  15. 手机投屏电脑的开源软件
  16. 2020计算机数电实验第四次(2)
  17. python 实现自动化
  18. 在使用pyrcc5编译二进制文件出现错误Cannot find file:和pyrcc5: No resources in resource description.
  19. nrcellcu和nrcelldu_012_5G NR(V2.00.22) NSA SA双模站点改造指导手册_R1.0(19页)-原创力文档...
  20. iOS Gif动画播放

热门文章

  1. 来呀~~ 聊聊像素呗
  2. Spring Boot + Bootstrap 出现Failed to decode downloaded font和OTS parsing error: Failed to convert W
  3. 图论基础知识总结(一)
  4. Java实现接口防篡改
  5. 通过Kalman滤波对方程进行参数估计matlab
  6. Nginx免费证书申请构建Https域名
  7. 4月2日世界孤独症日,壹基金启动蓝色行动关注孤独症群体
  8. 炉石传说 服务器维护,炉石传说服务器炸了怎么办?一直排不到人原因和解决方法[多图]...
  9. mac用pycharm远程连接linux服务器
  10. Web基础知识之TCP_IP协议