动画
再也不能用定时器做动画
CSS动画
CSS动画是浏览器原生支持的动画实现方式,具有以下特点:
-
硬件加速:浏览器会自动优化,使用GPU加速
-
流畅度高:由浏览器内部调度,与刷新率同步
-
简单易用:只需定义关键帧和动画属性
-
性能优异:不会阻塞主线程
1 | .box { |
JS动画
计时器动画(setTimeout/setInterval)
使用计时器实现动画存在严重问题:
-
时间不精准:
- 受事件循环机制影响,回调可能被延迟执行
- 最小间隔时间受限(通常4ms)
-
帧率不稳定:
- 无法与屏幕刷新率同步
- 可能导致动画卡顿或跳帧
-
性能问题:
- 即使页面不可见也会继续执行
- 增加不必要的CPU负担
1 | // 不推荐的实现方式 |
requestAnimationFrame (RAF)
RAF是专为动画设计的API,特点包括:
-
与刷新率同步:
- 自动匹配显示器刷新率(通常60fps)
- 每次重绘前调用回调函数
-
高效节能:
- 页面不可见时自动暂停
- 浏览器可以优化执行
-
更流畅的动画:
- 避免过度渲染
- 减少不必要的计算
1 | function animate() { |
Web Animations API
现代浏览器提供的强大动画API:
-
声明式语法:
1
2
3
4
5
6
7
8element.animate([
{ transform: 'translateX(0)' },
{ transform: 'translateX(100px)' }
], {
duration: 1000,
easing: 'ease-in-out',
iterations: Infinity
}); -
优势特性:
- 与CSS动画相同的性能优势
- 提供精细控制(暂停、反转、变速等)
- 可以监听动画事件
- 返回Animation对象便于控制
-
时间轴控制:
1
2
3
4const animation = element.animate(/* ... */);
animation.pause(); // 暂停
animation.play(); // 播放
animation.cancel(); // 取消
最佳实践建议
-
优先使用CSS动画:简单动画首选CSS实现
-
复杂动画使用Web Animations API:需要程序控制时选择
-
必要时使用RAF:需要完全控制动画流程时
-
避免使用定时器动画:性能差且不精准
现代浏览器提供了多种高性能动画方案,开发者应该摒弃传统的定时器动画方式,选择更高效、更精准的动画实现技术。