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

news2024/11/27 15:27:36

本文记录通过 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 = maxLen
    console.log(maxLen);

    // 效果1:自定义进度 teep 条
    // 定义的进度效果列表(注:表示的是百分比的值)
    /* const loadings = [5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
    let loadingIndex = 0
    const timer = setInterval(() => {
      progress.style.strokeDashoffset = maxLen - (loadings[loadingIndex] / 100 * maxLen)
      loadingIndex += 1
      text.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 = num
        text.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教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/49808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】第七章 图

1.单选(2分) 已知一个有向图的邻接矩阵表示&#xff0c;要删除所有从第i个结点发出的边&#xff0c;操作为&#xff08; &#xff09;。 ‏A.将邻接矩阵的第i列删除 B.将邻接矩阵的第i行元素全部置为0 C.将邻接矩阵的第i列元素全部置为0 D.将邻接矩阵的第i行删除 2.单选(2分)…

UE5——动画混合

一、引言 关于动画的一些基础可以看我往期的文章&#xff1a;《UE5——动画重定向》 二、动画混合 1、动画混合的原理 动画&#xff1a; 我们知道动画实际上就是控制静态模型中的某些点按照一定的预定轨迹移动&#xff0c;简言之就是 “一组变换信息的集合” 动画混合&…

多功能手持读数仪VH03如何连接手机蓝牙

VH03 内置有基于 SPP&#xff08;Serial Port Profile&#xff09;协议的蓝牙接口&#xff0c;蓝牙名称为“VH03”。 使用任何支持 SPP 协议的蓝牙设备均可实现与 VH03 的连接。当蓝牙建立连接后&#xff0c;可向 VH03 发送指令进行交互&#xff08;前述 MODBUS、AABB、字符串…

CET-4 week9 阅读 写译

去# 阅读 question 定位 寻找有意义有目的 的动词符号 – &#xff0c; 转折词从句的解释说明理解超刚词不完全一样的地方要注意 注意匹配对应 answer 是否出现比较 比较对象 结果 article 重点长难句考点不在简单词上 选相反的答案或其他 仔细阅读 严格翻译题目 知道重点…

采用策略分布曲线评估信用风险模型的效果

在信贷业务的风控体系中&#xff0c;模型的构建与应用始终是一项重点内容&#xff0c;最常见的莫过于贷前环节的申请信用风险模型。作为典型的二分类模型&#xff0c;为了有效识别好坏用户群体&#xff0c;我们经常选取某些评价指标来量化模型的综合性能&#xff0c;例如KS、AU…

Java定时任务技术分析

《从零打造项目》系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建SpringBoot集成Mybatis项目实操SpringBoot集成MybatisPlus项目实操SpringBoot集成Spring Data JPA项目实操 数据库变更管理 数据库变更管理&#xff1a;Liquibase…

内存 管理

内存管理c/c中内存分布sizeof 与 strlenc 语言中动态内存管理方式malloccallocreallocc 中动态内存管理new 与 delete自定义类型空间的动态分配new 与 delete 的实现operator new 与 operator delete基本概念辨识malloc/free 与 new/delete 区别 *****内存泄漏c/c中内存分布 c…

手把手教你:CSS + JS实现文本交替

1. Koa 中间件 Koa 的中间件通过一种更加传统的方式进行级联&#xff0c;摒弃了以往 node 频繁的回调函数造成的复杂代码逻辑。使用异步函数&#xff0c;我们可以实现"真正" 的中间件。与之不同&#xff0c;当执行到 yield next 语句时&#xff0c;Koa 暂停了该中间…

Qt 在linux上检测内存泄漏,用valgrind的问题

我在ubuntu上装了Qt5.15.2, 打开我的项目后&#xff0c;准备检测内存泄漏问题。 此时&#xff1a; 内存检测工具都是可用状态&#xff0c;但点击内存检测后&#xff0c;进度条走完后&#xff0c;就结束了。项目都没启动起来&#xff0c;这怎么检测内存问题&#xff1f; 然后&…

11月30日(第二天)

序列化&#xff1a;implements Serializable&#xff0c;public final static Long SeriaVersionUid 1L;MP的使用步骤&#xff1a;在BookBO类上使用TableName(“表名")去关联&#xff0c;在字段上使用TableId&#xff0c;TableField进行字段关联。(最好新建一个BookVO类,…

嫦娥五号探测器详细介绍

嫦娥五号&#xff08;Change 5&#xff09;&#xff0c;即嫦娥五号探测器&#xff0c;是由中国空间技术研究院研制的中国首个实施无人月面取样返回的航天器&#xff0c;是完成中国探月工程重大科技专项“绕、落、回”三步走发展战略最后一步的关键任务。 中国探月工程三步走 嫦…

Linux 主机间ssh相互免密

Linux 主机间ssh相互免密两步实现ssh主机免密详细教程请往下看主机间ssh相互免密 —— 方法一主备两台未配置密钥主机作为测试生成公私密钥拷贝公钥到目标主机ssh免密测试主机间ssh相互免密——方法二实验准备分发密钥对免密测试MobaXterm免密登录服务器&#xff08;以ecs-4207…

SAP中的PI接口

文章目录1 Pi overall2 Create pi process3 Inbound interface4 Outbound interface5 Matter need attention6 Pi test7 View log8 Transport CTS1 Pi overall What is the pi ? Pi is Sap’s middle software . it is interacted with SAP an external system. 2 Create p…

【Python】Python 中实现数据序列化

文章目录一、前言二、为什么要进行序列化三、Python 中的数据序列化1. json模块2. pickle模块3. shelve模块4. 总结参考链接一、前言 首先&#xff0c;要了解什么是序列化&#xff0c;请参考我的另一篇文章&#xff1a;序列化与反序列化介绍 本文主要介绍 Python 中的数据序列…

i.MX 6ULL 驱动开发 二十七:块设备

参考&#xff1a;【块设备】通用块层 struct bio 详解 | zzm (aliez22.github.io) 一、Linux 中块设备驱动框架 二、块设备基本概念 1、扇区的概念来自硬件&#xff0c;扇区是硬件最小操作单位。 2、块的概念来自文件系统&#xff0c;是文件系统数据处理的最小单位。 3、段…

django 开启CSRFtoken校验,以及postman实现问题

1.0 Django默认的CSRFtoken 表现&#xff1a; 后端使用的是Django的表单验证 post请求携带参数的问题 2.0 先处理post请求携带数据的csrfmiddlewaretoken 在登录界面 在input输入框中隐藏&#xff0c;所以需要提取input的value值&#xff0c;在【tests】脚本中进行提取&…

小样本关系分类(原型学习):Better Few-Shot Relation Extraction with Label Prompt Dropout

Better Few-Shot Relation Extraction with Label Prompt Dropout core idea 在小样本关系分类中&#xff0c;prompt信息是relation name是信息&#xff0c;这篇文章为了保持train和test的一致性&#xff0c;将train中的一些relation name信息删除掉了。&#xff08;相反&…

linux应用移植问题

背景 公司设备降成本&#xff0c;设备运行平台从armv7架构mpu换成了armv5架构的mpu&#xff0c;应用移植过程都挺顺利的&#xff0c;只是牵涉到一个引用外部库的应用时&#xff0c;运行该应用到引用库中的函数时&#xff0c;应用抛出illegal instrution异常。 问题分析 初步…

HTML(超文本标记语言)

HTML(超文本标记语言) 网页的基本信息 、等成对的标签&#xff0c;分别叫**开放标签**和**闭合标签**&#xff0c;单独呈现的标签(空元素)&#xff0c;如&#xff1b;意为用 / 来关闭空元素 DOCTYPE&#xff1a;告诉浏览器&#xff0c;我们要使用什么规范 head&#xff1a;代…

Jenkins安装与配置Windows11系统

目录 Jenkins安装 一、下载 官网地址&#xff1a;Jenkins download and deployment 点击LTS&#xff08;长期稳定版&#xff09;下的Windows 二、安装 基本就是一路Next即可 三、配置 访问地址 http://localhost:8080/&#xff0c;会出现如下界面&#xff1a; 安装 注&…