本文档阐述了 anime.js 的内部架构,包括其类层次结构、核心组件以及它们如何协同工作以创建动画。它为希望了解 anime.js 内部工作原理的开发人员提供了该库设计和实现细节的技术概览。
有关在项目中如何使用 anime.js 的信息,请参阅概述。有关动画引擎实现的详细信息,请参阅动画引擎。
Anime.js 围绕精心设计的类层次结构构建,实现了基于时间的动画系统。该架构将计时逻辑与渲染操作分离,使该库能够通过统一的 API 动画各种目标类型(DOM 元素、CSS 属性、SVG 元素和 JavaScript 对象)。
来源:lib/anime.esm.js663-702 lib/anime.esm.js760-761
类层次结构展示了 anime.js 如何通过继承构建功能
来源:lib/anime.esm.js673-757 types/index.js340-416
来源:lib/anime.esm.js310-341 lib/anime.esm.js428-457
Clock 类是 anime.js 中计时系统的基础。它管理:
fps 属性控制帧率speed 属性控制播放速度来源:lib/anime.esm.js673-756 types/index.js340-416
Engine 扩展了 Clock 并管理动画循环。它:
来源:lib/anime.esm.js1380-1461 types/index.js419-471
render 和 tick 函数构成了动画更新系统的核心。
render:根据当前时间更新单个动画的状态tick:处理动画及其子动画(对于时间轴)渲染系统根据以下因素决定何时更新动画:
来源:lib/anime.esm.js760-1042 lib/anime.esm.js1052-1206 types/index.js428-673
动画管道展示了 anime.js 如何从创建到渲染处理动画:
animate() 时,会创建一个 JSAnimation 实例来源:lib/anime.esm.js5810-6021 types/index.js428-673
补间动画系统处理单个属性的动画。补间动画负责:
补间动画系统支持不同的值类型:
| 值类型 | 描述 | 示例 |
|---|---|---|
| NUMBER(数字) | 直接数值 | 42 |
| UNIT(单位) | 带单位的数字 | 42px, 10% |
| COLOR(颜色) | 颜色值(任意格式) | #FFF, rgba(255,0,0,1) |
| COMPLEX(复合) | 包含多个数字的字符串 | rect(10px, 20px, 30px, 40px) |
以及属性类型:
| 属性类型 | 描述 | 应用于 |
|---|---|---|
| OBJECT(对象) | JavaScript 对象属性 | object.property |
| ATTRIBUTE(属性) | DOM 元素属性 | element.setAttribute() |
| CSS | CSS 样式属性 | element.style.property |
| TRANSFORM(变换) | CSS 变换属性 | translateX、rotate 等 |
| CSS_VAR(CSS 变量) | CSS 自定义属性 | --property |
来源:lib/anime.esm.js310-327 types/index.js26-44 lib/anime.esm.js760-1042
时间轴允许动画序列化。主要方面包括:
来源:lib/anime.esm.js13106-13392
Anime.js 广泛使用链表来管理:
这种方法允许高效地插入、删除和遍历相关的动画元素。
链表操作的一个关键实用函数是:
来源:lib/anime.esm.js621-667 types/index.js289-334
Anime.js 通过以下几个阶段处理值:
来源:lib/anime.esm.js886-980 types/index.js546-617
Anime.js 采用模块化架构构建,支持多种 JavaScript 模块格式:
源代码以 ESM 格式编写,然后在构建过程中转换为其他格式。
构建过程在 package.json 文件中配置。
来源:package.json53-60 lib/anime.esm.js1-459
Anime.js 设计为可在浏览器和 Node.js 环境中运行。它会检测环境并相应地调整其行为。
这种架构使得 anime.js 可以用于:
来源:lib/anime.esm.js300-307 types/index.js11-16
Anime.js 使用一套全局常量和配置设置来控制其行为。
这些设置控制默认动画行为,并且可以在动画创建时被覆盖。
来源:lib/anime.esm.js412-449 types/index.js101-139
Anime.js 构建于精心设计的架构之上,该架构将计时、动画逻辑和值处理等关注点分离。以 Clock 类为起点的继承层次结构为计时操作提供了基础,并由 Engine、Timer、JSAnimation 和 Timeline 类进行扩展。
补间动画系统管理单个属性的动画,支持各种值类型和属性类型。渲染系统使用链表跟踪和管理动画,高效地仅更新需要更新的部分。
这种架构使 anime.js 能够通过统一的 API 动画各种目标(DOM 元素、CSS 属性、SVG 元素和 JavaScript 对象),同时保持高性能。