当前位置: 首页 > Web前端 > CSS

使用css动态实现圆环的百分比分布——css3动画初探

时间:2023-03-30 18:29:45 CSS

最近一个小程序项目有一个设计图,需要一个圆环,有两种颜色分布,分别代表可用量和冻结量.如果直接这样显示,感觉不水平??所以我决定做一个动态!看了mdn上的渐变(gradients)、过渡(transitions)、动画(animations)的新特性,不禁感叹CSS真牛!这三个新特性加上canvas,似乎瞬间就具备了js正面的能力。用js很难过渡得这么完美,而且浏览器的css渲染性能比js好很多。然后看了张新旭(据说是css高手)的一篇关于rings的博文,觉得很神奇。Link=>纯CSS3种方法实现中间镂空的12色彩虹渐变环,才服气!除了能够灵活运用CSS的各种特性,我最佩服辛老师的是他的创造性思维。会让你感叹:卧槽,还有这种操作?!我想起了高中物理老师每次装逼时说的一句话:心有多远,能走多远。虽然demo和我的需求不太一样,问题还是没有解决,但是仔细看了还是收获不少,对我后面的代码很有帮助。辛老师这篇博文的重点还是在渐变上,我需要实现动态平滑连续的颜色分布。比如整个环本来是绿色的,然后慢慢的有60%被红色占据,整个过程一定要流畅。最接近我需求的是倒计时demo,一个用linear-gradient线性渐变实现的彩色圆环demo,但不是连续的过程,而是每次切割30度。看了一些其他的博文,好像找不到合适的,只好自己想一个!因为再写这个demo的时候,发现小程序和H5在css性能上还是有一些差异的(具体差异总结在文末),所以贴上H5的代码比较好。不多说,直接上代号代号部分//html部分

¥4500/¥5000//css部分.circle{-webkit-mask:radial-gradient(transparent150px,#000150px);宽度:400px;高度:400px;溢出:隐藏;边界半径:50%;位置:相对;}.circle-left{宽度:50%;高度:100%;背景:#24B39B;变换原点:100%50%;位置:绝对;左:0;z-index:0;}.circle-right{宽度:50%;高度:100%;背景:#24B39B;transition:变换1s线性;变换原点:0%50%;位置:绝对;右:0;z-index:2;}.??circle-bottom-left{宽度:50%;高度:100%;背景:rgb(234、67、15);位置:绝对;左:0;z-index:-1;}.circle-bottom-right{宽度:50%;高度:100%;背景:rgb(234、67、15);位置:绝对;右:0;z-index:1;}.info{宽度:400px;高度:400px;行高:400px;文本对齐:居中;-顶部:-400px;}//js代码window.onload=function(){varred=4500,total=5000//红色区域代表的数量和总量varpercent=red/totalvarright=document.getElementsByClassName('circle-right')[0]varleft=document.getElementsByClassName('circle-left')[0]if(percent<=0.5){//红色区域不超过一半right.style.transform=`rotate(${percent*360}deg)`}else{//红色区域超过一半的情况下,关键部分right.style.transform=`rotate(180deg)`right.style.transition=`opacity0sstep-end1s,transform1slinear`//timing-function需要设置成linear来实现平滑的视觉过渡right.style.opacity=0left.style.transition=`transform${(percent-0.5)/0.5}slinear1s`left.style.transform=`rotate(${percent*360-180}deg)`}}效果图思路st=>start:starte=>end:endcon=>condition:degree<=180?op1=>操作:右绿色旋转op2=>operation:右绿色旋转180度,opacity变为0,然后左绿色旋转st->concon(yes)->op1->econ(no)->op2->e难点在于红色的情况面积过半,左右绿色半圆之间的连接,过渡应该是自然的,看不出明显的破绽。**在这种情况下,我的做法是:4个半圆(两红两绿)的z-index设置为leftred