思路
- 用svg画出一个圆
- stroke-dasharray和stroke-dashoffset配合使用
实现举例
<svg viewBox="25 25 50 50">
<circle cx="50" cy="50" r="20"></circle>
</svg>
svg {
width: 3.75em;
transform-origin: center;
animation: rotate 2s linear infinite;
}
circle {
fill: none;
stroke: #fc2f70;
stroke-width: 2;
stroke-dasharray: 1, 200;
stroke-dashoffset: 0;
stroke-linecap: round;
animation: dash 1.5s ease-in-out infinite;
}
@keyframes rotate {
100% {
transform: rotate(360deg);
}
}
/* 精髓 */
@keyframes dash {
0% {
stroke-dasharray: 1, 200;
stroke-dashoffset: 0;
}
50% {
stroke-dasharray: 90, 200;
stroke-dashoffset: -35px;
}
100% {
stroke-dashoffset: -125px;
}
}
精髓部分实现逐帧讲解:
- 整个动画可以分解为两个部分,第一个是stroke-dasharray的第一个参数变大造成的描边线变长,描边线由一开始的初始小点,长度1(下图)
变成了很长的中间态2,但是因为整体的周长为Math.PI 2 20 = 125.66370614359172,所以并不是一个整圆。
- 接下来加上stroke-dashoffset的配合,就会让整个描边的起点左移,圆在中间点会变成
- 在达成这个状态之后,再减少stroke-dashoffset的值,就会看到线继续左移到看不见的空间,视觉表现会变成
再配合上最外层的svg进行360度的旋转,就达成了很酷炫的进度条的效果。