# clip实现圆环进度条

2018-02-27 11:02:37来源:https://juejin.im/post/5a7c6d0d6fb9a063395c5f59作者:稀土掘金人点击

.left{
width: 200px;
height: 200px;
border: 10px solid lightblue;
position:absolute;
top: -10px; /* 10的原因是因为边框是10个像素 */
right: -10px;
clip: rect(0 100px 200px 0);/* 上面为0 右边到100px

}

.right{
width: 200px;
height: 200px;
border: 10px solid lightblue;
position:absolute;
top: -10px;/* 10的原因是因为边框是10个像素 */
right: -10px;
clip: rect(0 200px 200px 100px);/* 位置更改，计算可以参考上图 */
}

<!DOCTYPE html>
<html lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div{
box-sizing: border-box;
}
.box{
width: 200px;
height: 200px;
position: relative;
background-color: #ccc;
left: 40%;
top: 200px;
}
.num{
position: absolute;
top: 50%;
left: 50%;
background: #fff;
width: 180px;
height: 180px;
transform: translate(-50%, -50%);
text-align: center;
line-height: 180px;
font-size: 32px;
}

.clip{
width: 200px;
height: 200px;
position: absolute;
border: 10px solid #ccc;
clip: rect(0, 200px, 200px, 100px);
}
.left{
width: 200px;
height: 200px;
position: absolute;
border: 10px solid lightblue;
clip: rect(0 100px 200px 0);
top: -10px;
left: -10px;
}
.right{
width: 200px;
height: 200px;
position: absolute;
border: 10px solid lightblue;
clip: rect(0 200px 200px 100px);
top: -10px;
left: -10px;
}
.width-none{
width: 0;
}
.auto{
clip: auto;
}
</style>
<body>
<div class="box">
<div class="clip">
<div class="left"></div>
<div class="right width-none"></div>
</div>
<div class="num">
</div>
</div>
<script >
let clip = document.querySelector('.clip'),
left = document.querySelector('.left'),
right = document.querySelector('.right'),
num = document.querySelector('.num'),
rotate = 0;
let loop = setInterval(() => {
if(rotate >= 100){
rotate = 0;
clip.classList.remove('auto');
} else if(rotate > 50){
right.classList.remove('width-none');
}
rotate++;
left.style.transform = 'rotate('+ 3.6*rotate + 'deg)';
num.innerHTML = `\${rotate}%`
},100)
</script>
</body>
</html>

1、首先隐藏了右半圆，这是因为我们需要旋转的是左半圆，我们可以等左半圆转到右边圆的位置再显示右 边，就是等到旋转到180度的时候。

2、同时我们看到主圆添加了 clip: rect(0, 200px, 200px, 100px); 裁剪样式，这是因为默认我们 进度是0%的，我们只显示右边的话才能隐藏左边，但是我们右边不是隐藏的吗？那显示它干嘛呢，因为 旋转左边的时候就看到转到右边的圆了。稍微有点绕，请结合代码，多多理解

3、等到左边旋转了180我们需要将右边显示出来，并且将 box 元素的裁剪设置为默认值，就是不裁剪，这 这样才能显示完整的左右两个圆。

4、最后我们使用js来控制旋转角度并将百分比显示在页面上