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

CSS3+JS实现静态循环进度条【清晰易懂】

时间:2023-03-31 11:45:15 CSS

在写这篇文章之前,笔者查阅了很多博客,但大部分前辈只是贴出代码,没有明确的注释,所以新手很容易就可以了多云。在这里,作者在了解了原理之后,对代码进行了优化,决定写(总结)一个清晰明了的循环进度条的实现,方便后人快速理解。1.实现原理首先我们来画一个圆圈(黑色)。接下来,再来两个半圆来覆盖黑色圆圈。(为了演示,左右两边颜色不同。)这时候我们顺时针旋转右边的蓝色半圆,下面的黑色圆就会露出来。比如我们旋转45度(12.5%),效果就出来了。如果我们把蓝色右半圆也设置成灰色,看看效果,12.5%的饼图就出来了!OK,我们试试旋转更大的度数,比如40%(144度)、50%(180度)、60%(216度)如下图。我们发现旋转180度后,右半圆与左半圆重合了。如果我们再次旋转,它会在右上角弹出,这显然不是我们想要的。我们想要的是继续旋转被黑色覆盖。..嗯。..怎么做?我们把右边的圆放回原来的位置,把它涂成黑色(和底色一样),然后旋转左边的半圆(它在右边的半圆的底部),这样它就会被右边的半圆覆盖。好了,废话不多说,我们把左边的半圆顺时针旋转45度,效果就出来了。可以想象,如果继续旋转,在180度时,它会被右边的半圆完全覆盖,而左边的底色会完全暴露,这样100%就显示出来了。最后,添加一个白色的小圆圈并将其放在正中间。好的,到目前为止,我们已经想出了如何去做。2.代码实现html部分

60%
css部分/*支持IE9及以上*/.circle-bar{font-size:200px;宽度:1em;高度:1em;位置:相对;背景色:#333;}.circle-bar-left,.circle-bar-right{width:1em;高度:1em;背景色:#eee;}/*这里clip是用来切圆实现左右两个半圆,右边的半圆在后面,所以更上一层楼。clip的使用参考:http://www.w3school.com.cn/cssref/pr_pos_clip.asp*/.circle-bar-right{clip:rect(0,auto,auto,.5em);}.circle-bar-left{clip:rect(0,.5em,auto,0);}.mask{宽度:0.8em;高度:0.8em;背景颜色:#fff;文本对齐:居中;行高:0.2em;颜色:rgba(0,0,0,0.5);}.mask:first-child{字体大小:0.3em;高度:0.8em;行高:0.8em;显示:块;/*所有后代水平和垂直居中,所以是一个同心圆*/.circle-bar*{position:absolute;顶部:0;右:0;底部:0;左:0;保证金:自动;}/*本身和它的子元素都是圆*/.circle-bar,.circle-bar>*{border-radius:50%;}JavaScript实现//反正IE8不支持CSS3中的border-radius属性,所以这里使用新方法getElementsByClassName()启动window.onload=function(){varcircleBar=document.getElementsByClassName('circle-酒吧')[0];varpercent=parseInt(circleBar.getElementsByClassName('percent')[0].firstChild.nodeValue);varcolor=circleBar.css('背景颜色');varleft_circle=circleBar.getElementsByClassName('circle-bar-left')[0];varright_circle=circleBar.getElementsByClassName('circle-bar-right')[0];如果(百分比<=50){varrotate='rotate('+(percent*3.6)+'deg)';right_circle.css3('变换',旋转);}else{varrotate='rotate('+((percent-50)*3.6)+'deg)';right_circle.css('background-color',color);//背景色设置为进度条的颜色right_circle.css3('transform','rotate(0deg)');//右侧不旋转left_circle.css3('transform',rotate);//向左旋转}}//封装css3功能,主要是懒得重复写代码了。既然写好了css3的功能,我们就顺便写个css吧。风格统一,更好看。Element.prototype.css=function(property,value){if(value){//对于CSS中的background-color等属性,'-'在JavaScript中是不兼容的,需要设置驼峰式varindex=property.indexOf('-');if(index!=-1){varchar=property.charAt(index+1).toUpperCase();property.replace(/(-*){1}/,char);}this.style[属性]=值;}else{//getPropertyValue()方法参数类似background-color写法,所以不要转驼峰格式returnwindow.getComputedStyle(this).getPropertyValue(property);}}//封装一个css3函数,快速设置css3属性Element.prototype.css3=function(property,value){if(value){property=capitalize(property.toLowerCase());this.style['webkit'+property]=value;this.style['Moz'+property]=值;this.style['ms'+property]=value;this.style['O'+property]=value;this.style[property.toLowerCase()]=value;}else{returnwindow.getComputedStyle(this).getPropertyValue(('webkit'+property)||('Moz'+property)||('ms'+property)||('O'+property)||property);//说实话,我不知道为什么要把没有浏览器标记的放在最后,既然这么用,那我干嘛但是这对现代浏览器来说可能不太好,判断次数增加了}//首字母大写函数capitalize(word){returnword.charAt(0).toUpperCase()+word.slice(1);}}jQuery实现$(function(){varpercent=parseInt($('.mask:first-child').text());varbaseColor=$('.circle-bar').css('background-color');if(percent<=50){$('.circle-bar-right').css('transform','rotate('+(percent*3.6)+'deg)');}else{$('.circle-bar-right').css({'transform':'rotate(0deg)','background-color':baseColor});$('.circle-bar-left').css('transform','rotate('+((percent-50)*3.6)+'deg)');}})jQuery这么简单好用,为什么还要写JavaScript?首先,学习JavaScript的使用。毕竟有些方法可能比较陌生,还是多看看文档,熟悉一下吧。第二,如果项目中不需要jQuery,以后就得自己实现。3、经验总结在指定圆的大小时,使用font-size属性,长度以font-size为准,单位是em。这样有个好处,只要修改font-size的值,就可以把Roundsizeup改大,很方便。另外,在写css的时候,尽量把功能相同的代码抽出来,把某个功能写在一个{}里,起个好名字,方便以后复用。bootstrap就是这样玩的,简洁易读,通过Classname基本可以知道标签有什么特点。