news 2026/10/14 9:38:28

Web Animation API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Web Animation API

7.2 Web Animations API

Web Animations API(简称 WAAPI)是 W3C 标准化的原生 JavaScript 动画接口,它将 CSS 动画、SVG 动画的底层能力统一暴露给 JavaScript,既保留了 CSS 动画的 GPU 加速、合成线程渲染的性能优势,又具备 JavaScript 的动态性与可控性。

它弥补了 CSS 动画难以动态传参、无法实时控制播放流程的不足,是复杂交互动画、动态业务动效的标准实现方案。


7.2.1 element.animate() 基础用法

element.animate()是 WAAPI 的核心入口方法,用于在 DOM 元素上快速创建并播放动画,直接传入关键帧与配置参数即可生成动画实例,无需预定义 CSS 规则。

一、核心语法

const animation = element.animate(keyframes, options);

  • 参数1:keyframes:动画关键帧集合,定义动画各阶段的样式状态
  • 参数2:options:动画配置参数,控制时长、次数、缓动等全局行为
  • 返回值:Animation实例对象,用于后续的播放控制与状态监听
二、关键帧的两种写法
1. 数组形式(多帧完整写法)

数组中每个对象对应一个关键帧,浏览器自动均匀分配帧的时间位置,适合 2 帧以上的复杂动画。

const keyframes = [ { opacity: 0, transform: 'translateY(30px)' }, // 起始帧(0%) { opacity: 1, transform: 'translateY(0)' } // 结束帧(100%) ];

也支持通过offset属性手动指定帧的百分比位置:

const keyframes = [ { opacity: 0, offset: 0 }, { opacity: 0.5, offset: 0.3 }, { opacity: 1, offset: 1 } ];
2. 对象形式(两帧简写)

仅需起始与结束两个状态时,可直接传入对象,浏览器自动解析为两帧动画,写法更简洁。

const keyframes = { opacity: [0, 1], transform: ['translateY(30px)', 'translateY(0)'] };
三、核心配置选项

options为动画全局配置,完整对应 CSS 动画的能力,同时支持更精细的时序控制。

配置项

类型

说明

对应 CSS 属性

duration

number

单次动画时长,单位毫秒

animation-duration

delay

number

动画延迟播放时间,单位毫秒

animation-delay

easing

string

动画缓动函数

animation-timing-function

iterations

number

播放次数,Infinity为无限循环

animation-iteration-count

direction

string

播放方向:normal/reverse/alternate

animation-direction

fill

string

填充模式:none/forwards/backwards/both

animation-fill-mode

endDelay

number

动画结束后的延迟时间,单位毫秒

无对应 CSS 属性

四、基础示例
const box = document.querySelector('.box'); // 创建并播放淡入上移动画 const fadeInAnim = box.animate( [ { opacity: 0, transform: 'translateY(20px)' }, { opacity: 1, transform: 'translateY(0)' } ], { duration: 500, easing: 'ease-out', fill: 'forwards' } );

7.2.2 动画控制:暂停、恢复、取消、反转

animate()返回的Animation实例提供了完整的播放控制方法,支持对动画进行实时的暂停、恢复、跳转、反转等操作,这是 WAAPI 相比 CSS 动画最核心的优势。

一、核心控制方法

方法

作用

说明

play()

播放动画

从当前暂停位置继续播放,或从头开始播放已取消的动画

pause()

暂停动画

冻结在当前帧,保留当前播放进度

cancel()

取消动画

终止动画并重置到初始状态,元素样式恢复到动画前

reverse()

反转播放

从当前位置反向播放,播放方向翻转

finish()

结束动画

直接跳转到动画结束状态,触发finish事件

二、播放状态属性

通过animation.playState可实时读取动画的当前状态,返回枚举值:

  • running:正在播放
  • paused:已暂停
  • finished:已完成
  • idle:空闲未播放
三、控制示例
const anim = box.animate([/* 关键帧 */], { duration: 1000 }); // 暂停播放 document.querySelector('#pauseBtn').addEventListener('click', () => { anim.pause(); console.log(anim.playState); // 'paused' }); // 恢复播放 document.querySelector('#playBtn').addEventListener('click', () => { anim.play(); }); // 反转播放 document.querySelector('#reverseBtn').addEventListener('click', () => { anim.reverse(); }); // 取消动画 document.querySelector('#cancelBtn').addEventListener('click', () => { anim.cancel(); });
四、finish 与 cancel 的核心区别
  • finish():直接跳到动画结束帧,保留动画结束后的样式(受 fill 影响),触发finish事件,属于正常结束。
  • cancel():直接终止动画,元素样式恢复到动画开始前的状态,触发cancel事件,属于强制中断。

7.2.3 动画时序与缓动控制

WAAPI 提供了比 CSS 动画更精细的时序控制能力与更灵活的缓动配置,支持精准到毫秒的进度跳转、单帧独立缓动等高级能力。

一、精准时序控制
1. 当前时间读写

通过animation.currentTime可以直接读取或设置动画的当前播放时间(单位毫秒),实现任意进度跳转、进度拖拽等交互,这是 CSS 动画无法实现的能力。

// 获取当前播放进度时间 console.log(anim.currentTime); // 250 // 直接跳转到 500ms 位置 anim.currentTime = 500;
2. 首尾延迟控制

除了常规的开始延迟delay,还支持endDelay结束延迟,在动画结束后、触发完成事件前插入等待时间,用于多动画序列的时间对齐。

element.animate(keyframes, { duration: 300, delay: 100, // 开始前延迟100ms endDelay: 200 // 结束后延迟200ms再触发完成事件 });
3. 迭代起始点

通过iterationStart可以设置动画从第几次迭代的什么位置开始播放,支持非整数次迭代,适合中途入场的循环动画。

// 无限循环动画,从第2.5次迭代开始播放 element.animate(keyframes, { iterations: Infinity, iterationStart: 2.5 });
二、缓动控制
1. 全局缓动

在 options 中配置easing,作用于整个动画的所有关键帧之间,与 CSS 缓动完全兼容。

{ easing: 'cubic-bezier(0.4, 0, 0.2, 1)' // 自定义贝塞尔曲线 }

支持所有 CSS 缓动关键字:linear、ease、ease-in、ease-out、ease-in-out,以及steps()阶跃函数。

2. 单帧独立缓动

WAAPI 支持给单个关键帧设置easing,缓动作用于当前帧到下一帧之间,实现同一段动画中不同阶段不同的运动曲线,灵活性远超 CSS 动画。

const keyframes = [ { transform: 'translateX(0)', easing: 'ease-in' }, // 0%-50% 加速 { transform: 'translateX(100px)', easing: 'ease-out' }, // 50%-100% 减速 { transform: 'translateX(200px)' } ];
三、动画事件

WAAPI 提供 Promise 化的事件与传统事件两种方式,监听动画生命周期节点:

// Promise 方式:动画完成回调 anim.finished.then(() => { console.log('动画播放完成'); }); // 传统事件方式 anim.addEventListener('finish', () => { console.log('动画结束'); }); anim.addEventListener('cancel', () => { console.log('动画被取消'); });
四、适用场景
  • 需要动态控制播放、暂停、进度的交互动画
  • 参数动态计算的业务动效,如根据数据决定动画幅度
  • 多动画序列编排、精准时间对齐的复杂动效
  • 无法通过 CSS 类切换实现的动态生成动画
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 9:38:27

无人自助拼豆系统核心技术选型与落地开发全流程实战指南

无人自助拼豆系统概述 无人自助拼豆系统是一种基于物联网与软件开发技术的智能设备管理系统,旨在为用户提供便捷的拼豆服务。该系统通常包括用户端、管理后台及硬件设备之间的交互逻辑,实现从用户操作到数据采集、处理和反馈的全流程自动化。 在设计与开…

作者头像 李华
网站建设 2026/10/14 9:37:57

从模糊标题到落地系统:实时事件分析(REA)架构拆解与实战

1. 从“rea”这个标题说起:一个被低估的万能缩写 第一次看到“rea”这个标题的时候,我脑子里蹦出来的第一反应是——这到底是个啥?是某个工具的缩写?是某个项目的代号?还是某个技术栈的简称?说实话&#xf…

作者头像 李华
网站建设 2026/10/14 9:37:25

数组与单链表的本质差异:从内存布局到工程选型

1. 这不是“背概念”,而是真正搞懂线性表的底层呼吸感 你翻开教材,看到“线性表是n个数据元素的有限序列”,心里一沉——又来了,又是这种教科书式定义。但其实, 线性表List从来就不是抽象符号,它是所有程序…

作者头像 李华
网站建设 2026/10/14 9:37:25

Spring Boot事务管理:核心原理与实战优化

1. Spring Boot事务管理核心概念解析在真实业务场景中,数据一致性是系统设计的生命线。去年我们团队就曾因为事务处理不当,导致订单状态与库存数据出现严重不一致,最终不得不人工修复上万条异常数据。这次教训让我深刻认识到,掌握…

作者头像 李华
网站建设 2026/10/14 9:36:24

Flutter滑杆控件设计与实现全解析

1. 滑杆交互控件的核心价值与应用场景滑杆(Slider)作为现代UI设计中最基础的交互控件之一,其价值在于将抽象的数字调整转化为直观的空间操作。不同于传统的输入框需要用户精确输入数值,滑杆通过视觉化的拖拽方式,让参数…

作者头像 李华
网站建设 2026/10/14 9:36:00

litellm 统一多模型调用实战:从碎片化适配到生产级路由

1. 从一个真实困境说起:多模型调用的碎片化之痛如果你做过任何跟大语言模型相关的应用开发,大概率经历过这样一个阶段:项目初期只接了一家模型服务,代码写得干净利落,几十行就能跑通。可一旦业务方说“能不能也试试另一…

作者头像 李华