特效一览
声音波纹:
弹性缩放:
旋转加载:
渐变点:
翻转纸片:
声音波纹特效
原理和代码
需要几个块,就准备几个空 dom 元素。当然,数量越多,动画越细腻,但同时维护成本也高。
1 2 3 4 5 6
| <div> <span></span> <span></span> <span></span> <span></span> </div>
|
先编写一些基础样式代码:
1 2 3 4 5 6 7 8 9 10 11 12
| div { display: flex; align-items: center; justify-content: space-between; width: 2em; }
span { width: 0.3em; height: 1em; background: red; }
|
单独观察一个空 dom 元素,其实就是一个缩放动画:
1 2 3 4 5 6 7 8 9 10
| @keyframes grow { 0%, 100% { transform: scale3d(1, 1, 1); }
50% { transform: scale3d(1, 2, 1); } }
|
不同点:每个元素的动画启动时间不一样;每个元素的初始状态不一样。
下面的代码中有个 2 个时间参数,第一个是动画时长,第二个是延迟时间。如果延迟时间是负数,那么会自动计算对应时间点的动画作为初始状态动画。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| div span:nth-of-type(1) { animation: grow 1s 0s ease-in-out infinite; }
div span:nth-of-type(2) { animation: grow 1s 0.15s ease-in-out infinite; }
div span:nth-of-type(3) { animation: grow 1s 0.3s ease-in-out infinite; }
div span:nth-of-type(4) { animation: grow 1s 0.45s ease-in-out infinite; }
|
弹性缩放特效
原理和代码
分解一下这个动画,会发现它分为 2 个部分:
- 放大一倍,旋转 360deg
- 缩小到正常大小,再旋转 360deg
因此,动画的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| @keyframes stretch { 0% { transform: scale(1) rotate(0); }
50% { transform: scale(2) rotate(360deg); }
100% { transform: scale(1) rotate(720deg); } }
|
样式效果是通过 border 来实现的,只展示对立方向的 border 即可:
1 2 3 4 5 6 7 8 9
| div { width: 1em; height: 1em; border: 2px transparent solid; border-top-color: #531dab; border-bottom-color: #531dab; border-radius: 50%; animation: stretch 2s ease-in-out infinite; }
|
缩放加载特效
原理和代码
动画很简单,就是无限循环的旋转。主要是如此丝滑的效果,采用的是「慢 => 快 => 慢」对应的动画函数,也就是ease-in-out
。
样式效果和上一个类似,也是通过操作 border 实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| div { height: 1em; width: 1em; border: 2px solid #d3adf7; border-radius: 50%; border-top-color: #722ed1; animation: spin 1s ease-in-out infinite; }
@keyframes spin { to { transform: rotate(360deg); } }
|
渐变点特效
原理和代码
和「声音波纹」特效类似,展示点的个数取决于空 dom 元素个数:
1 2 3 4 5
| <div> <span></span> <span></span> <span></span> </div>
|
动画特效非常简单,就是「透明 => 完全不透明 => 透明」这个过程。整体效果也是通过调整动画时长 && 动画延迟启动时间来实现的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| div { display: flex; position: absolute; align-items: center; justify-content: center; }
div span { height: 10px; width: 10px; background: #ff4d4f; border-radius: 50%; }
div span:nth-of-type(1) { animation: fade 1s ease-in-out infinite; }
div span:nth-of-type(2) { animation: fade 1s 0.2s ease-in-out infinite; }
div span:nth-of-type(3) { animation: fade 1s 0.4s ease-in-out infinite; }
@keyframes fade { 0%, 100% { opacity: 0; }
50% { opacity: 1; } }
|
翻转纸片
代码和原理
这个特效比较有意思的地方是动画很细腻。主要是分为两部分,一个是关于 y 轴的 180deg 旋转,另一个是关于 x 轴的 180deg 旋转。要借助rotateX
和rotateY
来实现。
⚠️ 为了取得位于中间位置的轴线,要设置transform-origin: center
。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| div { width: 24px; height: 24px; background: #eb2f96; transform-origin: center; animation: paper 2s ease infinite; }
@keyframes paper { 0% { transform: rotateX(0) rotateY(0); }
50% { transform: rotateX(180deg) rotateY(0); }
100% { transform: rotateX(180deg) rotateY(180deg); } }
|