Web Animations API 通过 JavaScript 直接控制动画,由 Animation 和 KeyframeEffect 构成,支持动态关键帧、序列编排、实时控制与性能优化,可实现滚动联动等交互动画。

Web Animations API 提供了一种直接通过 JavaScript 控制动画的方式,既能实现复杂动画序列,又能保持良好的性能和精细的控制力。相比 CSS 动画或 transition,它在逻辑处理、动态调整和时序编排上更具优势。
理解 Animation 和 KeyframeEffect
每个动画由 Animation 对象和 KeyframeEffect 构成。KeyframeEffect 定义关键帧和目标元素,Animation 则管理播放状态。
创建一个基础动画:
const element = document.querySelector('.box');const effect = new KeyframeEffect(
element,
[
{ transform: 'translateX(0)' },
{ transform: 'translateX(100px)' }
],
{ duration: 1000, fill: 'forwards' }
);
const animation = new Animation(effect);
animation.play();
这种方式脱离了 CSS,完全由 JS 驱动,便于动态生成关键帧或响应用户交互。
编排复杂动画序列
通过控制多个 Animation 实例的播放时间,可以构建精确的动画流程。
例如,让三个方块依次移动:
const animateSequence = (elements, options) => {const animations = elements.map((el, index) => {
const effect = new KeyframeEffect(
el,
[{ transform: 'none' }, { transform: 'translateX(200px)' }],
{ ...options, delay: index * 300 }
);
return new Animation(effect);
});
animations.forEach(anim => anim.play());
return animations;
};
利用 delay 实现错峰启动,形成流畅的序列效果。也可以监听 onfinish 事件触发下一个阶段:
animation.onfinish = () => {// 启动下一组动画
};
实时控制与性能优化
Animation 对象提供 play()、pause()、reverse()、currentTime 等方法,可实现播放头控制、进度拖拽等高级交互。
示例:暂停并倒放动画
animation.pause();animation.reverse();
为提升性能,注意以下几点:
- 使用 transform 和 opacity 属性进行动画,避免触发布局重排
- 将频繁动画的元素提升为合成层(可添加 will-change: transform)
- 避免创建过多动画实例,可复用 KeyframeEffect 或及时终止不再需要的动画
结合时间线与外部状态管理
Web Animations API 允许将动画集成到应用状态中。比如用变量记录播放进度,或与滚动位置联动。
示例:同步动画进度到滚动条
window.addEventListener('scroll', () => {const scrollProgress = window.scrollY / (document.body.scrollHeight - window.innerHeight);
animation.currentTime = animation.effect.getTiming().duration * scrollProgress;
});
这样就能实现视差或滚动驱动的交互动画。
基本上就这些。掌握 Web Animations API 的核心在于理解其对象模型和时间控制机制。一旦熟悉,就能灵活构建高性能、可编程的动画系统。











