五分钟学会各种环形进度条

news2024/11/21 0:32:57

本文将会通过svg实现圆形进度条矩形进度条以及三角形进度条,先放效果图

圆环进度条

首先我们需要两个画两个圆,一个是底色圆,一个是进度圆。

<svg width="200" height="200"><circle fill="none" cx="100" cy="100" r="50" stroke="#EBEDF0" stroke-width="10" /><path fill="none" d="M 100, 50 A 50, 50, 0, 0, 1, 100, 150 A 50, 50, 0, 0, 1, 100, 50" stroke="#50D4AB" stroke-width="10" />
</svg> 

现在就画好了两个圆,绘制进度圆的重点就是d属性值M代表起点,A代表画椭圆弧,一次最多只能画半圆,所以要分两次,下面是具体画圆路径的参数解释

命令参数-参数解释
Arx, ry x-axis-rotation, large-arc-flag, sweepflag x, y从当前画笔位置开始绘制一条椭圆弧线到(x,y)指定的坐标。rx和ry分别为X轴和Y轴的半径。x-axis-rotation为x轴旋转度数。large-arc-flag代表优弧还是劣弧(0表示劣弧,1表示优弧)。sweep-flag为弧线方向 0为顺时针 1为逆时针
Mx,y移动虚拟画笔到指定的(x,y)坐标,仅移动不绘制

既然圆画出来了,怎么让进度圆动起来?

这个时候就有比较重要的两个属性 stroke-dasharraystroke-dashoffset 关于这两个属性详细解释可以看这个大佬写的链接

stroke-dasharray

stroke-dasharray属性用于创建虚线,就是设置实线和虚线的宽度

比如:stroke-dasharray: 50 20; 效果就是下图


stroke-dasharray 当属性为两个值时,一个表示长度,一个表示间距

这个时候我们可以利用这个属性来实现进度,首先我们需要知道这个圆的周长,然后就可以通过百分比 * 周长去得到相应百分比需要绘制的长度。

周长 = 2* Π * r 这个公式大家都会吧,以示例为准,周长 = 2 * Math.PI * 50,我们将其进度变为25%

const girth = 2 * Math.PI * 50
const dasharray = `${0.25 * girth} ${girth}`
const d = M 100, 50 A 50, 50, 0, 0, 1, 100, 150 A 50, 50, 0, 0, 1, 100, 50

<svg width="200" height="200">
 <circle fill="none" cx="100" cy="100" r="50" stroke="#EBEDF0" stroke-width="10" />
 <path fill="none" :d="d" stroke="#50D4AB" stroke-width="10" :stroke-dasharray="dasharray"/>
</svg> 

这样就实现了一个进度为25%的圆环进度条

矩形进度条

老规矩,先画两个矩形,rx代表矩形的圆角,矩形进度条的重点是在周长的计算,以示例为准,因为矩形是带圆角的,所以就不是 2 * (长 + 宽) ,而是需要加上圆角的长度

<svg width="200" height="200"><rect fill="none" x="10" y="10" rx="10" width="100" height="100" stroke="#ebedf0" stroke-width="10" /><rect fill="none" x="10" y="10" rx="10" width="100" height="100" stroke="#50D4AB" stroke-width="10" />
</svg> 

矩形的四个圆角拼起来其实就是一个圆,半径就是 rx可以得出周长 = 2 * Math.PI * rx + 4 * (正方形的边长 - 2 * rx)

接下来还是用dasharray属性来实现进度

const circleGirth = 2 * Math.PI * 100 // 圆角的圆的周长
const width = 100 - 2 * 10 // 正方形的边长
const girth = circleGirth + 4 * width // 圆角矩形总周长
const dasharray = `${0.25 * girth} ${girth}`

<svg width="200" height="200"><circle fill="none" cx="100" cy="100" r="50" stroke="#EBEDF0" stroke-width="10" /><path fill="none" stroke="#50D4AB" stroke-width="10" :stroke-dasharray="dasharray"/>
</svg> 

圆环进度条会了,矩形不是信手拈来

三角形进度条

三角形进度条是用 polygon 来实现,其中 stroke-linejoin 属性是可以设置圆角,在计算周长的时候就不需要计算圆角,会比较方便,points属性就是三角形三个角的坐标,所以绘制的重点是这三个角的坐标

<svg>
<polygon fill="none" stroke-linejoin="round" points="ax,ay bx,by cx,cy" stroke="#ebedf0" stroke-width="10"/>
</svg> 

接下来我们来计算ABC三个角的坐标

以边长100为例,先求三角形的高,因为等边三角形三线合一,高既是底边的中线,也是底边的高线,再根据勾股定理 得出 高² = 边长² - 底边²高 = Math.sqrt(Math.pow(100, 2) - Math.pow(50, 2))所以 A点的坐标(0, 高),B点的坐标(50, 0),C点的坐标(100, 高)

const height = Math.sqrt(Math.pow(100, 2) - Math.pow(50, 2)) // 高
const points = `0,${height} 50,0 100,${height}`

<svg><polygon fill="none" stroke-linejoin="round" :points="points" stroke="#50D4AB" stroke-width="10"/>
</svg> 

当我们将相应的值带进去的时候,发现有部分被遮挡,其实是因为我们设置了 stroke-width,所以我们只需要将ABC三点的xy坐标都加10就行了

const height = Math.sqrt(Math.pow(100, 2) - Math.pow(50, 2)) // 高
const points = `10,${height + 10} 60,10 110,${height + 10}`

<svg><polygon fill="none" stroke-linejoin="round" :points="points" stroke="#50D4AB" stroke-width="10"/>
</svg> 

三角形实现了,现在只需要计算周长,就可以实现进度百分比,周长 = 3 * 边长,现在以33%为例实现代码

const height = Math.sqrt(Math.pow(100, 2) - Math.pow(50, 2)) // 高
const points = `10,${height + 10} 60,10 110,${height + 10}`
const dasharray = 100 300
<svg><polygon fill="none" stroke-linejoin="round" :points="points" stroke="#50D4AB" stroke-width="10"/><polygon fill="none" stroke-linejoin="round" :points="points" stroke="#50D4AB" stroke-width="10":stroke-dasharray="dasharray" stroke-linecap="round" />
</svg> 

其中的stroke-linecap属性是设置进度条的进度圆角

这样我们就简单的实现了三种不一样的进度条

最后

最近找到一个VUE的文档,它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

Web 3.0顶级干货教学:区块链概述

Web 3.0顶级干货教学&#x1f525;&#xff1a;区块链定义&#xff1f; 尊重原创&#xff0c;本人致力于打造高质量博客&#xff0c;编写不易 &#xff0c;帮忙点赞关注一下~转载小伙伴请注明出处&#xff01;谢谢 区块链是什么&#xff1f; 最早使用历史 1991年采用 时间戳 追…

【大数据入门核心技术-Spark】(一)Spark介绍

​目录 ​一、Spark概述 二、为什么要学习Spark 三、Spark 四大特性 1、速度快 2、易用性 3、通用性 4、兼容性 一、Spark概述 Apache Spark™ is a unified analytics engine for large-scale data processing. spark是基于内存计算的大数据处理框架&#xff0c;由于基…

葡聚糖/聚己内酯两亲嵌段聚合物(Dextran-PCL)|5-氟尿嘧啶-右旋糖酐偶联物(DEX-5-Fu)

葡聚糖/聚己内酯两亲嵌段聚合物(Dextran-PCL)|5-氟尿嘧啶-右旋糖酐偶联物(DEX-5-Fu) 中文名称&#xff1a;葡聚糖/聚己内酯两亲嵌段聚合物 产品描述&#xff1a; 一种葡聚糖/聚己内酯两亲嵌段聚合物,它是由胺端基葡聚糖和醛端基聚己内酯通过偶联反应生成,其中葡聚糖链段的数均…

SSM框架学习记录-Spring_day03

1.AOP简介 代码参考Spring_17_aop_demo 什么是AOP&#xff1f; AOP(Aspect Oriented Programming)即面向切面编程&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结构 AOP作用 在BookDaoImpl.java中&#xff0c;执行save方法显然可以计算程序执行时间&#xff0c;…

Redis框架(三):大众点评项目 基于Session的短信登录

大众点评项目 基于Session的短信登录需求&#xff1a;基于Session实现短信验证登录基于Session的短信登录发送手机验证码实现登录 &#xff08;注意MyBatisP的接口使用&#xff09;新的问题SpringCloud章节复习已经过去&#xff0c;新的章节Redis开始了&#xff0c;这个章节中将…

C#语言实例源码系列-实现无损压缩图片

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

微电网两阶段鲁棒优化问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Redis之相关介绍、远程docker部署以及相关shell命令

Redis相关shell命令一、概述1、介绍2、作用3、特性4、官方网址二、远程服务Docker上Redis相关测试及命令1、Redis安装及挂载1.1 查找所有关于Redis1.2 拉取最高版本的Redis1.3 通过xftp连接到远程服务器1.4 挂载1.5 开启远程服务器的端口1.6 修改配置文件2、开始使用Redis2.1 开…

autoconf-archive源码安装

0. 源码地址 autoconf-archive源码下载地址经由https://savannah.gnu.org搜索"autoconf-archive"到GNU Autoconf Archive - Summary [Savannah] 再在其中点击上图中箭头位置&#xff0c;转到GitHub - autoconf-archive/autoconf-archive: A mirror of the GNU Autoc…

数据分析软件-FineReport内置SQl提交

1. 概述 1.1 版本 报表服务器版本 功能变动 11.0.2 填报配置表时支持从数据库中模糊搜索表&#xff0c;详情见 2.2 节。 1.3 功能介绍 设计好填报表格&#xff0c;添加填报控件之后&#xff0c;如下图所示&#xff1a; 需要将填报数据的单元格与数据库表字段进行绑定&#…

【微服务】2、一篇文章详解 Ribbon 负载均衡

Ribbon 负载均衡一、负载均衡原理&#xff08;debug 源码&#xff09;(1) 基本介绍(2) 打断点① LoadBalancerInterceptor.java - intercept()② RibbonLoadBalancerClient.java - execute()③ RibbonLoadBalancerClient.java - execute()④ RibbonLoadBalancerClient.java - g…

【STM32】详解RTC实时时钟的概念和配置示例代码

一、什么是RTC RTC(Real-time Clock)&#xff1a;实时时钟&#xff0c;本质上是一个支持BCD编码的定时器/计数器。主电源断电后能够由电池供电&#xff0c;使其时钟跳转依然正常。 二、STM32F4芯片内的RTC功能 ①日历时钟&#xff08;时分秒、年月日、星期&#xff09; ②两个闹…

六、排序算法介绍3

4、希尔排序 4.1 简单插入排序问题 简单的插入排序可能存在的问题&#xff0c;数组 arr { 2, 3, 4, 5, 6, 1 } 这时需要插入的数 1(最小)&#xff0c;简单插入排序的过程如下&#xff1a; {2,3,4,5,6,6} {2,3,4,5,5,6} {2,3,4,4,5,6} {2,3,3,4,5,6} {2,2,3,4,5,6} {1,2,3,4,…

CCIA技术沙龙 | “数据安全风险评估及安全服务实践” 沙龙成功举办

2022年12月8日&#xff0c;由中国网络安全产业联盟&#xff08;CCIA&#xff09;主办、CCIA数据安全工作委员会支持、杭州美创科技股份有限公司承办的“数据安全风险评估及数据安全服务实践”主题技术沙龙成功举办。 当前&#xff0c;我国数字经济快速发展、数字化转型持续深入…

Java对象深拷贝详解(List深拷贝)

1、Java中拷贝的概念 在Java语言中&#xff0c;拷贝一个对象时&#xff0c;有浅拷贝与深拷贝两种 浅拷贝&#xff1a;只拷贝源对象的地址&#xff0c;所以新对象与老对象共用一个地址&#xff0c;当该地址变化时&#xff0c;两个对象也会随之改变。 深拷贝&#xff1a;拷贝对…

一起学习用Verilog在FPGA上实现CNN----(一)总体概述

1 总体概述 为避免闭门造车&#xff0c;找一个不错的开源项目&#xff0c;学习在FPGA上实现CNN&#xff0c;为后续的开发奠定基础 1.1 项目链接 大佬的开源项目链接&#xff1a; CNN-FPGA 链接跳转界面如下&#xff1a; 大佬的该项目已经发表论文&#xff0c;而且开源工程结…

Qt5.6.1移植海思Hi3521d(一)

系列文章目录 文章目录系列文章目录前言一、开发环境二、搭建环境1.准备2.海思SDK和交叉编译器安装2.测试交叉编译器一下3.安装tftp总结前言 上半年做个一个Qt移植海思芯片的程序&#xff0c;感觉差不多快忘记了&#xff0c;赶紧记录一下 一、开发环境 系统&#xff1a;Ubunt…

初学Python到月入过万最快的兼职途径(纯干货)

程序员小猴紫&#xff0c;不错过任何一次干赚钱干货 1.兼职薪资&#xff0c;附行哥工资单2.兼职门槛&#xff0c;附学习知识清单3.兼职途径&#xff0c;附入职考核过程4.我的兼职感受 答应小猴紫的第一篇赚钱干货推文来啦&#xff0c;行哥第一个在读书期间通过兼职赚到的10w收…

Web前端大作业—里约热内卢奥运会(html+css+javascript)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

产品经理 - 产品设计方法论需求分析部分

整体 – 产品设计方法论思维导图 个人整理&#xff0c;存在异议大家可以讨论下 需求分析方法论 需求分析为需求收集的延展&#xff0c;需求收集后即需进行需求分析&#xff0c;拆解需求后方可业务落地&#xff0c;此处我将其分为两步&#xff0c;一是主动发散型需求分析&am…