当前位置:首页 > 科技  > 软件

如何仅使用CSS创建一个环形进度条?

来源: 责编: 时间:2024-04-02 17:23:13 319观看
导读这一系列课程将包含各种 ES6 辅助函数。它包括处理原语、数组和对象的助手,以及算法、DOM 操作函数和 Node.js 实用程序等相关内容。环形进度条在现今的网站中是一个相当常见的元素。然而,对很多开发者来说,它们似乎是一

这一系列课程将包含各种 ES6 辅助函数。它包括处理原语、数组和对象的助手,以及算法、DOM 操作函数和 Node.js 实用程序等相关内容。63m28资讯网——每日最新资讯28at.com

环形进度条在现今的网站中是一个相当常见的元素。然而,对很多开发者来说,它们似乎是一个相当大的挑战。实际情况是,理解并掌握基础并不困难。事实上,借助一些新的CSS特性,这比以往任何时候都更容易。63m28资讯网——每日最新资讯28at.com

63m28资讯网——每日最新资讯28at.com

环形进度条的结构

简单来说,一个环形进度条就是两个圆叠加在一起。下面的圆为背景,上面的圆为进度指示器。关于我们如何填充进度指示器的部分我们稍后再讲,但是基本的结构可以通过使用一个<svg>元素和少量的CSS轻松构建出来。63m28资讯网——每日最新资讯28at.com

<svg width="250" height="250" viewBox="0 0 250 250">  <circle class="bg"    cx="125" cy="125" r="115" fill="none" stroke="#ddd" stroke-width="20"  ></circle>  <circle class="fg"    cx="125" cy="125" r="115" fill="none" stroke="#5394fd" stroke-width="20"  ></circle></svg>circle.fg {  transform: rotate(-90deg);  transform-origin: 125px 125px;}

63m28资讯网——每日最新资讯28at.com

正如你所看到的,我们需要的唯一一部分CSS就是一个变换属性。我们将前景圆旋转90度,并将变换原点设置为圆的中心。这样,圆就围绕其中心旋转,进度指示器从顶部开始。63m28资讯网——每日最新资讯28at.com

数学计算

在我们开始之前,不妨花一点时间理解代码背后的数学原理。63m28资讯网——每日最新资讯28at.com

我们需要确定的两个值是进度条的大小和描边的宽度。对于这个示例,我们确定了大小为250px,描边宽度为20px。我们将使用这些值来计算我们需要的其它值。63m28资讯网——每日最新资讯28at.com

大小用来设置SVG元素的宽度和高度属性,以及viewBox属性。将其除以二,我们得到125px,对应于图片中心的坐标。这个值用来设置圆的cx和cy属性。63m28资讯网——每日最新资讯28at.com

考虑到描边宽度,我们可以计算出圆的半径。半径是从圆心到边缘的距离。在这种情况下,半径是115px,即图片的大小减去描边宽度再除以二。63m28资讯网——每日最新资讯28at.com

最后,我们可以计算出圆的周长。周长是圆边缘的长度。在这种情况下,周长是722.5px,即2 * π * 115px.。63m28资讯网——每日最新资讯28at.com

变量63m28资讯网——每日最新资讯28at.com

63m28资讯网——每日最新资讯28at.com

公式 63m28资讯网——每日最新资讯28at.com

size63m28资讯网——每日最新资讯28at.com

250px63m28资讯网——每日最新资讯28at.com

N/A (user defined)63m28资讯网——每日最新资讯28at.com

stroke63m28资讯网——每日最新资讯28at.com

20px63m28资讯网——每日最新资讯28at.com

N/A (user defined)63m28资讯网——每日最新资讯28at.com

center63m28资讯网——每日最新资讯28at.com

125px63m28资讯网——每日最新资讯28at.com

size / 263m28资讯网——每日最新资讯28at.com

radius63m28资讯网——每日最新资讯28at.com

115px63m28资讯网——每日最新资讯28at.com

(size - stroke) / 263m28资讯网——每日最新资讯28at.com

circumference63m28资讯网——每日最新资讯28at.com

722.5px63m28资讯网——每日最新资讯28at.com

2 * π * radius63m28资讯网——每日最新资讯28at.com

接下来,这些数字将开始派上用场,但我保证我们几乎不需要做什么数学计算。63m28资讯网——每日最新资讯28at.com

填充进度指示器

现在我们已经有了基本的结构,现在需要来填充进度指示器。为此,我们将使用 stroke-dasharray属性,它需要传入闪烁和长度的交替值。63m28资讯网——每日最新资讯28at.com

要创建一个进度条,我们希望传入两个值:填充部分的长度和空白部分的长度。获取填充部分我们需要将进度百分比乘以圆的周长。获取空白部分,我们会从周长中减去填充部分。63m28资讯网——每日最新资讯28at.com

假设我们想要填充圆的50%,SVG代码看起来将会是这样:63m28资讯网——每日最新资讯28at.com

<svg width="250" height="250" viewBox="0 0 250 250">  <circle class="bg"    cx="125" cy="125" r="115" fill="none" stroke="#ddd" stroke-width="20"  ></circle>  <circle class="fg"    cx="125" cy="125" r="115" fill="none" stroke="#5394fd" stroke-width="20"    stroke-dasharray="361.25 361.25"  ></circle>

使进度条动态化

硬编码stroke-dasharray值并不是很有用。我们希望能够动态地设置进度百分比。这就是之前的CSS变量和数学在这里起作用的地方。63m28资讯网——每日最新资讯28at.com

给定一个--progress变量,我们可以相对容易地计算stroke-dasharray。知道我们将需要之前的大部分值,我们也可以将它们设置为CSS变量。更好的是,我们想要设置的大多数SVG属性都可以用CSS操作。63m28资讯网——每日最新资讯28at.com

<svg  width="250" height="250" viewBox="0 0 250 250"  class="circular-progress" style="--progress: 50">  <circle class="bg"></circle>  <circle class="fg"></circle></svg>.circular-progress {  --size: 250px;  --half-size: calc(var(--size) / 2);  --stroke-width: 20px;  --radius: calc((var(--size) - var(--stroke-width)) / 2);  --circumference: calc(var(--radius) * pi * 2);  --dash: calc((var(--progress) * var(--circumference)) / 100);}.circular-progress circle {  cx: var(--half-size);  cy: var(--half-size);  r: var(--radius);  stroke-width: var(--stroke-width);  fill: none;  stroke-linecap: round;}.circular-progress circle.bg {  stroke: #ddd;}.circular-progress circle.fg {  transform: rotate(-90deg);  transform-origin: var(--half-size) var(--half-size);  stroke-dasharray: var(--dash) calc(var(--circumference) - var(--dash));  transition: stroke-dasharray 0.3s linear 0s;  stroke: #5394fd;}

这可能看起来很多,但其实主要就是设置CSS变量,然后使用它们来计算我们需要的值。我想指出一个很酷的事情,那就是pi常数是calc()函数的一部分!63m28资讯网——每日最新资讯28at.com

此时,如果你使用一些JavaScript去操作--progress变量的值,你会看到进度条填充起来。新增的transition属性将使进度条平滑地动画表现。63m28资讯网——每日最新资讯28at.com

定时进度条

你是否曾在手机游戏里看过广告?你知道的,那种如果你看完整个广告就会给你奖励的那种。它们通常都有一个进度条,随着广告的播放而填充。或者说,当你观看时,它就像倒计时定时器一样慢慢变空。无论你可能看到的是哪种类型,它们都属于同一概念的变体。63m28资讯网——每日最新资讯28at.com

我们如何创建一个在预定时间内填满的进度条呢?我们可以用JavaScript和Window.requestAnimationFrame()来实现,但那样就不太酷了。取而代之的是,我们可以使用animation属性来让--progress变量在设定的时间内从0变为100。63m28资讯网——每日最新资讯28at.com

下面是重构后的代码看起来是什么样的:63m28资讯网——每日最新资讯28at.com

@keyframes progress-animation {  from {    --progress: 0;  }  to {    --progress: 100;  }}

63m28资讯网——每日最新资讯28at.com

如果你尝试将这个连接到我们的SVG,你会发现它并不像你想象的那样运作。这是因为浏览器并不知道如何处理--progress变量。它不知道它是一个数字,所以不知道如何对它进行动画处理。63m28资讯网——每日最新资讯28at.com

幸运的是,CSS为此提供了一个解决方案。@property规则允许我们定义自定义属性,并告诉浏览器它们是什么类型。在这种情况下,我们想告诉浏览器--progress是一个数字。63m28资讯网——每日最新资讯28at.com

@property --progress {  syntax: "<number>";  inherits: false;  initial-value: 0;}

63m28资讯网——每日最新资讯28at.com

现在浏览器知道如何处理--progress变量,我们可以将它连接到动画。63m28资讯网——每日最新资讯28at.com

.circular-progress {  animation: progress-animation 5s linear 0s 1 forwards;}

63m28资讯网——每日最新资讯28at.com

这将在5秒内把--progress变量从0变到100。forwards关键字告诉浏览器保持动画的最后值。没有它的话,动画完成后,进度条会重置为0。你可以通过设置animation-direction属性为reverse,并使用backwards而不是forwards来创建相反的效果。63m28资讯网——每日最新资讯28at.com

整合所有内容

我们在这篇文章中涵盖了很多内容。我们从一个简单的SVG元素,发展到一个功能完整的进度条。我们使用了CSS变量、数学函数,甚至一个新的CSS特性。让我们来看看最终的代码。63m28资讯网——每日最新资讯28at.com

<svg width="250" height="250" viewBox="0 0 250 250" class="circular-progress">  <circle class="bg"></circle>  <circle class="fg"></circle></svg>.circular-progress {  --size: 250px;  --half-size: calc(var(--size) / 2);  --stroke-width: 20px;  --radius: calc((var(--size) - var(--stroke-width)) / 2);  --circumference: calc(var(--radius) * pi * 2);  --dash: calc((var(--progress) * var(--circumference)) / 100);  animation: progress-animation 5s linear 0s 1 forwards;}.circular-progress circle {  cx: var(--half-size);  cy: var(--half-size);  r: var(--radius);  stroke-width: var(--stroke-width);  fill: none;  stroke-linecap: round;}.circular-progress circle.bg {  stroke: #ddd;}.circular-progress circle.fg {  transform: rotate(-90deg);  transform-origin: var(--half-size) var(--half-size);  stroke-dasharray: var(--dash) calc(var(--circumference) - var(--dash));  transition: stroke-dasharray 0.3s linear 0s;  stroke: #5394fd;}@property --progress {  syntax: "<number>";  inherits: false;  initial-value: 0;}@keyframes progress-animation {  from {    --progress: 0;  }  to {    --progress: 100;  }}

以下是一个展示代码运行效果63m28资讯网——每日最新资讯28at.com

图片图片63m28资讯网——每日最新资讯28at.com

结论

使用现代HTML和CSS,我们创建了一个圆形进度条。这个设置可以作为你实验的好起点。你可以参照使用,也可以扩展它以适应你的需要,如果需要的话,你可以加入一点JavaScript。你甚至可以将它转换为Web组件或React组件用于你的项目。63m28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-80884-0.html如何仅使用CSS创建一个环形进度条?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 代码是如何被被编译的?

下一篇: 巧妙运用Redisson打造自定义限流注解,让接口防刷更高效

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 使用Webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

    1、前言在我们使用 Selenium 进行 UI 自动化测试时,常常会因为浏览器驱动与浏览器版本不匹配,而导致自动化测试无法执行,需要手动去下载对应的驱动版本,并替换原有的驱动,可能还
  • 微软邀请 Microsoft 365 商业用户,测试视频编辑器 Clipchamp

    8 月 1 日消息,微软近日宣布即将面向 Microsoft 365 商业用户,开放 Clipchamp 应用,邀请用户通过该应用来编辑视频。微软于 2021 年收购 Clipchamp,随后开始逐步整合到 Microsof
  • 三星Galaxy Z Fold5官方渲染图曝光:13.4mm折叠厚度依旧感人

    据官方此前宣布,三星将于7月26日在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
  • 上海举办人工智能大会活动,建设人工智能新高地

    人工智能大会在上海浦江两岸隆重拉开帷幕,人工智能新技术、新产品、新应用、新理念集中亮相。8月30日晚,作为大会的特色活动之一的上海人工智能发展盛典人工
Top