# 动画设计

动画能够有效强化界面层级感和空间方位感。本文档将阐述添加动画时应遵循的设计原则。

## 核心原则

### 起始原点

- 动画可锚定界面元素，例如菜单可从触发按钮位置缩放展开
- 动画可构建空间感知，例如侧边栏从屏幕边缘滑入，暗示其始终隐藏于屏幕之外
- 设计动画时需遵循真实物理规律。想象界面元素由实体材料构成——当它们不在屏幕上时位于何处？用动画来呈现这种空间关系

### 响应速度

- 动画绝不应阻碍用户交互，必须保持快速响应，通常在0.2秒内完成
- 用户无需等待动画完成即可进行交互操作
- 确保动画性能优化。优先使用CSS `transform`属性，通过GPU渲染实现流畅效果
- 若无法实现快速高性能的动画效果，宁可不使用动画

### 简洁克制

- 非弹性材料不做弹跳动画
- 避免旋转、折叠或曲线路径动画，保持简洁直观

### 统一规范

建立统一的动画物理规则，使所有元素的动效保持协调一致、符合预期。动画应当匹配用户心理预期，否则可能不适配当前场景。

若已有现成动画效果，请直接复用。

## 无障碍考量

- 动画需保持克制，注意可能引发前庭功能障碍用户不适的情况（详见[运动触发前庭障碍研究](https://www.ncbi.nlm.nih.gov/pubmed/29017000)）
- 避免对正在向辅助技术报告内容的区域（如正在接收更新的`aria-live`区域）添加动画，这可能导致技术解析动态变化区域时产生混乱
- 杜绝非用户直接触发的动画
- 确保动画遵循操作系统层级的"减弱动态效果"设置，可通过[`prefers-reduced-motion`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/@media/prefers-reduced-motion)媒体查询实现。Gutenberg提供`@reduce-motion`混合宏，需与含CSS`animate`属性的规则配合使用

## 复用动画库

通用`Animate`组件用于驱动界面各区域的动画效果。具体可用动画请参阅[组件文档](/packages/components/src/animate/README.md)。