当前位置:首页 > 技术分析 > 正文内容

从‘相信前端能做一切’到‘连这个都做不了么’

ruisui883个月前 (03-14)技术分析27

分享一篇CSS圆环进度条的实践。

正文

此篇文章主要是为了实现仪表盘功能,前后过了4种方案,每篇方案从逻辑、代码、效果、问题四个方面出发。最后个人总结。同时非常非常希望有大佬能够提供一个方案,个人实在想不到实现方案了

需求

h5页面中,做一个环形仪表盘(如下图),需要一个从0%到实际百分比的增长过渡动效

前提

使用前端原生Html、css、js语言实现, 不打算借助第三方插件。

最初Scheme

将UI图片作为背景,上面放一个白色div作为遮罩,再利用css3将白色div旋转,从而达到过渡效果。

代码如下:


 
  
<script> function load() { setTimeout(() => { document.querySelectorAll('.light-strip-top')[0].setAttribute('style', "rotate: 180deg") }, 1000) } </script>

效果如下:


出现问题:

由于仪表盘整体大于180度,所以白色div,在最开始遮挡全部仪表盘,那么旋转一定角度后一定会覆盖UI图。

进化Scheme

根据上面出现的问题,想到与UI沟通将仪表盘改成180度效果(解决不了问题,就把问题解决掉),该方案由于改变了原型之后会导致UI过于丑,就没有进行深度测试。

超进化Scheme

根据上面两个方案的结合,想到将方案1中的白色div换成一张指针图片,利用css3旋转追针,达到过渡效果,但此方案也是改了UI效果。

代码如下:

 
 
  
<script> function load() { setTimeout(() => { document.querySelectorAll('.light-strip-top')[0].setAttribute('style', "rotate: 90deg") }, 1000) } </script>

效果如下:


Now:

此时大脑宕机了,在我的前端知识基础上,想不到能够完美实现UI效果的方案了。于是和同事探讨了一下,了解到element-plus中的进度条有类似的效果,于是打算看一下源码,了解到它是svg实现的。发现新大陆又开始尝试svg实现。

究极进化Scheme

利用svg,做一个带白色的背景圆环A,再做一个带有渐变背景色的进度圆环B, 利用进度圆环的偏移值、显示长度、断口长度配合css3过渡实现过渡效果。

代码如下:

 




 
   
    
           
           
           
           
         
   
 
  
  
  
  
  




0%
<script> function setProgress(percentage) { const circleProgress = document.querySelector('.circle-progress'); const circleBackground = document.querySelector('.circle-background'); const percentageText = document.getElementById('percentage'); const circumference = 2 * Math.PI * 40; // 圆的周长 const circumNewLength = (percentage / 100) * (circumference - 52); const dashOffset = 163 - circumNewLength; // 设置进度圆环的样式 circleBackground.style.strokeDashoffset = dashOffset; circleBackground.style.strokeDasharray = `${200 - circumNewLength}, ${ 52 + circumNewLength }` circleProgress.style.strokeDasharray = `${circumNewLength}, ${ circumference - circumNewLength }` // 更新百分比文本 percentageText.textContent = `${percentage}%`; } // 设置初始进度为0% setProgress(0); // 模拟过渡效果,从0%到50% setTimeout(() => { setProgress(50); }, 1000); // 过渡时间为1秒,你可以根据需要调整这个值 </script>

效果如下:

问题:

基本实现,但是还有一个问题是,渐变色是两点之间的线性渐变,无法做到圆环的顺时针渐变。

总结

  • 单纯前端不是万能的
  • 个人认为这个需求还是能够实现的
  • 希望有da lao能出个方案
  • 加油,继续搞

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/2773.html

标签: 前端动效
分享给朋友:

“从‘相信前端能做一切’到‘连这个都做不了么’” 的相关文章

出租车费用管理系统——出租车管理软件推荐

出租车费用管理系统是由宏达官方推出的一款出租车管理软件,用户可以在该软件中对出租车进行一个全面的管理,支持车辆信息管理、日常费用结算管理等等,同时该软件中还会对各种费用进行一个总结,帮助各位更加清晰进行查看,非常的便捷,有需要的小伙伴快来喜爱杂岸边埃安。来源:http://www.3h3.com/s...

2021最全VUE面试题,奥利给

1. vue-router用过没,哪些常用的钩子函数路由钩子的执行流程,钩子函数种类有:全局守卫、路由守卫、组件守卫。首页可以控制导航跳转, beforeEach , afterEach 等,?般?于页? title 的修改。?些需要登录才能调整??的重定向功能。beforeEach 主要有3个参数...

GitLab-合并请求

描述合并请求可用于在您对项目进行的其他人员之间交换代码,并轻松与他们讨论更改。合并请求的步骤步骤1-在创建新的合并请求之前,GitLab中应该有一个创建的分支。您可以参考本章来创建分支-步骤2-登录到您的GitLab帐户,然后转到“ 项目”部分下的项目 -步骤3-单击“ 合并请求”选项卡,然后单击“...

使用cgroup限制进程资源

这里使用containerd项目中的cgroup包来实现进程资源限制。先写一个耗费一个CPU并且一秒增加10m内存的测试进程package mainimport ( "fmt" "math/rand" "time")func main() { go f...

面试被逼疯:聊聊Python Import System?

面试官一个小时逼疯面试者:聊聊Python Import System?对于每一位Python开发者来说,import这个关键字是再熟悉不过了,无论是我们引用官方库还是三方库,都可以通过import xxx的形式来导入。可能很多人认为这只是Python的一个最基础的常识之一,似乎没有可以扩展的点了,...

HTML5最新版本介绍

HTML5是HTML4.01和XHTML1.0之后超文本标记语言的最新版本,由一群自由思想者设计,最终实现了多媒体支持、交互性、更智能的表单和更好的语义标注。 HTML 5不只是 HTML规范的最新版本,它是用于生成现代 Web内容的一系列相关技术的总称,其中最重要的三个技术是:HTML5核心规范...