【Ten Mins Effect】 - 02 波浪加载器动画效果

442 阅读4分钟

大家好,这里是初心Yearth,欢迎来到 10 mins css,每天花 10 分钟,实现要给简单精美的 css 效果。

那么下面我们直接进入正题,先来看看今天的效果展示吧:

图片1
图片1

分析

这个效果乍一看似乎挺复杂的,其实不然,我们将波浪分解成最小单位便不难看出,实际上需要实现的效果如下:

  • 画一个半圆
  • 让它摆动起来

而完整的效果只需要增加下面的变量即可:

  • 半圆逐渐扩大
  • 摆动之间有固定延迟
  • 每个半圆颜色不同

实现

让我们先来看看一个摆动的半圆怎么实现吧。

其实很简单,先实现一个正方形,通过 border 对其进行描边:

+ * {
+   margin0;
+   padding0;
+   box-sizing: border-box;
+ }
+ body {
+   height100vh;
+   width100vw;
+   display: flex;
+   justify-content: center;
+   align-items: center;
+   background#000;
+ }
+ .loader {
+   width250px;
+   height250px;
+   overflow: hidden;
+   position: relative;
+ }
+ .loader span {
+   position: absolute;
+   top0;
+   left0;
+   right0;
+   bottom0;
+   border10px solid #0b0b0b;
+   border-top10px solid #0f0;
+   border-left10px solid #0f0;
+ }

效果如下:

图片2
图片2

随后添加角度即可实现半圆环的效果了:

body {
   height250px;
   overflow: hidden;
   position: relative;
+  border-radius50%;
+  transformrotate(175deg);
 }

 .loader span {
   border10px solid #0b0b0b;
   border-top10px solid #0f0;
   border-left10px solid #0f0;
+  border-radius50%;
 }

效果如下:

图片3
图片3

随后则是让这个圆环摆动起来即可:

 body {
   border-top10px solid #0f0;
   border-left10px solid #0f0;
   border-radius50%;
+  animation: wave 1s alternate ease-in-out infinite;
+}
+
+@keyframes wave {
+  0% {
+    transformrotate(0deg);
+  }
+  100% {
+    transformrotate(90deg);
+  }
 }

效果如下:

图片4
图片4

到这里,最核心的效果已经实现了,剩下的就很简单了,这里我们可以借助 css 变量来简化过程:

-      <span></span>
+      <span style="--i: 0"></span>
+      <span style="--i: 1"></span>
+      <span style="--i: 2"></span>
+      <span style="--i: 3"></span>
+      <span style="--i: 4"></span>
+      <span style="--i: 5"></span>
+      <span style="--i: 6"></span>
+      <span style="--i: 7"></span>
+      <span style="--i: 8"></span>
+      <span style="--i: 9"></span>

.loader span {
   position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
+  top: calc(12px * var(--i));
+  left: calc(12px * var(--i));
+  right: calc(12px * var(--i));
+  bottom: calc(12px * var(--i));
   border: 10px solid #0b0b0b;
   border-top: 10px solid #0f0;
   border-left: 10px solid #0f0;
   border-radius: 50%;
   animation: wave 1s alternate ease-in-out infinite;
}

效果如下:

图片5
图片5

到这里,还差的就只是不同圆环之间的颜色和动画的延迟了,这里我们可以借助 filter 和 animation-delay:

body {
   border-top10px solid #0f0;
   border-left10px solid #0f0;
   border-radius50%;
+  filterhue-rotate(calc(60deg * var(--i)));
   animation: wave 1s alternate ease-in-out infinite;
+  animation-delaycalc(-0.1s * var(--i));
}

最终效果如下:

图片6
图片6

感兴趣的读者可以看看这个效果的在线 demo:波浪加载器动画效果