1. 适合用帧动画的场景
有时候想要的动画并不是缩小、放大或者变个颜色之类的这么简单,比如我们需要一个复杂的形变加上复杂的运动轨迹,此时过渡动画就有些相形见绌了。虽然 Canvas 或 SVG 能够实现复杂逻辑的动画效果,但是毕竟不是人人都会这种技术。而且有时候开发时间有限,没有时间用代码来绘制一个炫酷动画,所以这个时候帧动画,配上雪碧图就是最完美的选择。
我们用一张条形雪碧图来试一下:

2. 过渡动画
首先使用过渡动画看看会是什么效果:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Animate</title> <style> /* 清除默认样式 */ * { padding: 0; margin: 0; } /* 这段代码是为了居中显示,不是重点,看不懂的话可以无视 */ body { height: 100vh; display: flex; align-items: center; justify-content: center; } .animate { width: 216.6px; height: 300px; /* 指定背景图 */ background: url(http://img.mukewang.com/wiki/5ed9b321092b587026000300.jpg); /* 使用预先定义好的动画 */ animation: change-position 3s linear both; } /* 定义动画 */ @keyframes change-position { from { background-position: 0 } to { background-position: -2600px } } </style> </head> <body> <div class="animate"></div> </body> </html> 运行结果:

过渡动画确实是好,但是在这种情况下真的不适合用它。
3. 帧动画
我们需要的是一张图片一张图片的去显示,也就是一帧代表一张图片,我们换成帧动画再来试一下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Animate</title> <style> /* 清除默认样式 */ * { padding: 0; margin: 0; } /* 这段代码是为了居中显示,不是重点,看不懂的话可以无视 */ body { height: 100vh; display: flex; align-items: center; justify-content: center; } .animate { width: 216.6px; height: 300px; /* 指定背景图 */ background: url(http://img.mukewang.com/wiki/5ed9b321092b587026000300.jpg); /* 使用预先定义好的动画 */ animation: change-position .8s steps(12) infinite; } /* 定义动画 */ @keyframes change-position { from { background-position: 0 } to { background-position: -2600px } } </style> </head> <body> <div class="animate"></div> </body> </html> 运行结果:

这次看起来是不是就是我们想要的结果了呢。帧动画有些类似于我们小时候翻书,翻书翻得快了里面的图案似乎就动起来了:

所以设置一个合理的翻书时间是很有必要的,翻书时间太长就代表翻的慢了,图像就不会那么的连贯。
4. 小结
如果点燃一根香烟,然后拿着它快速的在眼前转个圈,你会惊奇的发现好像出现了一个圆形的火圈,这就是视觉暂留现象。
用一个专业点的说法就是:
人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残留的视觉称"后像",视觉的这一现象则被称为"视觉暂留"。
平时去电影院看的电影就是利用了这一原理,胶片快速的切换,在人眼里就好像图案在动。
甚至电子屏幕也是这个原理,玩吃鸡游戏的时候刷新率越高的屏幕显示就越顺畅,理解了这些你就理解了帧动画的原理。

手撕红黑树 ·
2026 imooc.com All Rights Reserved |