思路
- 用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度的旋转,就达成了很酷炫的进度条的效果。
