菜单

JavaScript 对象动画

相关源文件

本文档解释了如何使用 anime.js 为 JavaScript 对象属性设置动画。与 DOM 动画(参见 CSS 动画)不同,JavaScript 对象动画允许您为普通 JavaScript 对象的数值属性设置动画,而不是 DOM 元素。此技术对于创建不直接与元素视觉表现相关的动画非常有用,这些动画反而可以控制应用程序逻辑、数据模型或驱动其他程序化行为。

概述

Anime.js 可以通过随时间直接修改对象属性值来为 JavaScript 对象属性设置动画。该库使用与 DOM 动画相同的动画引擎和缓动函数,但将补间值直接应用于对象属性,而不是 CSS 属性或特性。

来源: lib/anime.esm.js889-971

架构

在 anime.js 架构中,JavaScript 对象动画遵循与 DOM 动画不同的代码路径。当目标不是 DOM 元素时,该库将动画值直接应用于对象属性。

目标类型检测

Anime.js 通过检查目标是 DOM 元素还是 JavaScript 对象来确定如何为其设置动画

来源: lib/anime.esm.js318-326 lib/anime.esm.js897-903

该库使用 isDomSymbol Symbol 来识别 DOM 元素。如果目标不具有此 Symbol,则将其视为 JavaScript 对象,并且动画使用 tweenTypes.OBJECT 类型。

动画过程

JavaScript 对象的动画过程在值应用方式上与 DOM 动画不同

来源: lib/anime.esm.js902-905 lib/anime.esm.js953-954

用途

基本对象动画

为 JavaScript 对象属性设置动画

您可以像使用 DOM 动画一样,使用任何标准动画参数(持续时间、缓动、延迟等)。

来源: lib/anime.esm.js897-905

读取动画值

由于对象属性在动画过程中实时更新,您可以随时访问它们的当前值

来源: lib/anime.esm.js997-999

为多个对象设置动画

您可以同时为多个 JavaScript 对象设置动画

来源: lib/anime.esm.js59-65

实现细节

值处理

对于 JavaScript 对象动画,该库会确定值的类型(数字、单位、颜色、复杂类型)并相应地进行处理

来源: lib/anime.esm.js909-940 lib/anime.esm.js953-954

对象属性与 DOM 属性

实现上的主要区别在于值的应用方式

目标类型值应用方法代码实现
JavaScript 对象直接属性赋值tweenTarget[tweenProperty] = value
DOM CSS 属性DOM 样式对象tweenStyle[tweenProperty] = value
DOM 特性setAttribute 方法tweenTarget.setAttribute(tweenProperty, value)
DOM 变换Style transform 属性通过缓存对象更新 transform 属性
CSS 变量setProperty 方法tweenStyle.setProperty(tweenProperty, value)

来源: 952-970

高级技巧

为嵌套属性设置动画

尽管 anime.js 不直接支持为嵌套对象属性设置动画,但您可以在属性名称中使用点表示法并手动解析它

更好的方法是直接使用对嵌套对象的引用

来源: lib/anime.esm.js897-905

与 DOM 动画结合

您可以在同一动画中同时为 DOM 元素和 JavaScript 对象设置动画

但是,请注意,DOM 元素特有的属性(例如 translateX)对于 JavaScript 对象将被忽略,反之亦然。

来源: 897-905 953-970

与回调函数结合使用

JavaScript 对象动画在与回调函数结合使用时特别有用

来源: lib/anime.esm.js997-999

用例

JavaScript 对象动画特别适用于

  1. 在画布上进行自定义绘图:为控制画布绘图的属性设置动画
  2. 数据可视化:为数据点或图表属性设置动画
  3. 游戏开发:控制角色位置、分数或游戏状态
  4. WebGL 和 3D 动画:为摄像机位置、旋转或对象属性设置动画
  5. 虚拟滚动:创建自定义滚动行为
  6. 物理模拟:为速度、加速度等物理属性设置动画
  7. 应用程序状态转换:平滑地在应用程序状态之间转换

性能考量

JavaScript 对象动画通常比 DOM 动画性能更好,因为

  1. 它不会触发 DOM 重绘或回流
  2. 它直接操作 JavaScript 值,无需 DOM 交互
  3. 它避免了样式解析和 CSS 渲染的开销

但是,您如何处理动画值仍然可能影响性能。例如,如果您在 update 回调中更新 DOM 元素,您可能仍然会触发重绘。

来源: 953-954

局限性

  1. 不支持自动嵌套属性:您需要直接指定嵌套对象
  2. 不支持自动单位转换:与 CSS 属性不同,对象属性没有默认单位
  3. 不支持 DOM 特有功能:对于对象动画,像 transform 或 color 这样的属性需要手动处理

总结

anime.js 中的 JavaScript 对象动画提供了一种强大的方式来为非视觉属性设置动画并驱动应用程序逻辑。通过随时间直接修改 JavaScript 对象属性,您可以创建控制应用程序行为、与视觉动画协调或驱动超越 DOM 操作的复杂交互的动画。