.circle-progress-con{position: relative;margin: 0 auto;text-align: center;line-height: calc(196px - 16px);background-color: rgba(0, 0, 0, 0.6);border: 16px solid rgba(112, 112, 112, 0.5);color: #fff;font-size: 30px;}
.circle, .percent{position: absolute;}
.circle-progress-con, .circle, .percent{width: 196px;height: 196px;border-radius: 50%;box-sizing: border-box;}
.circle{top: -16px;left: -16px;clip:rect(0, 196px, 196px, calc(196px / 2));}
.clip-auto{clip: auto;/*clip:rect(auto, auto, auto, auto);*/}
.percent{border: 16px solid #ffdd00;}
.left{transition:transform ease;clip: rect(0, calc(196px / 2), 196px, 0);}
.right{clip:rect(0, 196px, 196px, calc(196px / 2));}
.wth0{width:0;}
<div class="circle-progress-con">
<div class="circle">
<div class="percent left"></div>
<div class="percent right wth0"></div>
</div>
<div class="num"><span>0</span>%</div>
</div>
var percent=0;
var loading=setInterval(function(){
if(percent>100){
percent=0;
$('.circle').removeClass('clip-auto');
$('.right').addClass('wth0');
}else if(percent>50){
$('.circle').addClass('clip-auto');
$('.right').removeClass('wth0');
}
$('.left').css({'transform': 'rotate('+ (18/5)*percent +'deg)', '-webkit-transform': 'rotate('+ (18/5)*percent +'deg)', '-moz-transform': 'rotate('+ (18/5)*percent +'deg)'});
$('.num>span').text(percent);
percent++;
},200);
主要应用css的clip属性:
剪裁形状:高度是从top到bottom,宽度是从left到right
原理:用border画圆环,利用剪裁剪出左右两个半圆环,默认右半圆环width给0即不显示,左半圆环显示,之后放在一个大的圆形容器中,该容器利用剪裁默认只留右半部分来装右半圆环,这样默认左右半圆环都不会显示出来,当百分比进度<=50的时候,渐渐向大容器右半部分旋转左半圆环,这样进度会从0%-50%(50%时与右半圆环重叠);当百分比进度>50的时候大容器不需要剪裁即露出整个圆形,右半圆环显示出来(去掉width=0恢复宽度)继续旋转左半圆,即51%-100%(100%即左右圆环拼接成完整的圆环)。
css圆环实现方法:
1.border或box-shadow(box-shadow: [nset] 0 0 0 16px rgba(0, 0, 0, 0.5))
2.两个圆嵌套或用before/after
参考:https://blog.youkuaiyun.com/angeljsl/article/details/51208960
其他方法:https://blog.youkuaiyun.com/xuyunfei_2012/article/details/53672876