关于 page-transitions
page-transitions 是用于路由变化、视图切换和导航动效的设计指南,面向构建网页或应用导航体验的设计师与开发者。它整理 12 条动画原则、过渡模式、时长参考和性能建议。
主要功能
- 01将 12 条动画原则用于页面过渡
- 02介绍淡入淡出、滑动与共享元素
- 03提供导航模式和时长参考
- 04涵盖性能与减少动态效果建议
适用场景
- 01为列表到详情页设计层级切换
- 02规划前进与返回的页面滑动
- 03为标签切换或模态框选择过渡
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dylantarre/ animation-principles --skill page-transitions安装后在 Claude Code 中输入/page-transitions确认已加载。
详细介绍
页面转场动画
将迪士尼 12 条动画原则应用于路由切换、视图转场和导航模式。
快速参考
| 原则 | 页面转场实现 |
|---|---|
| 挤压与拉伸 | 页面进入时的弹性效果 |
| 预备动作 | 新页面进入前先播放退出动画 |
| 演出布局 | 通过主视觉元素衔接视图 |
| 逐帧动画 / 关键姿势动画 | 共享元素与交叉淡化 |
| 跟随动作 / 重叠动作 | 导航后内容逐渐稳定 |
| 慢入 / 慢出 | 进入与退出使用不对称缓动 |
| 弧线 | 使用带弧度的滑动转场 |
| 次要动作 | 背景、导航状态变化 |
| 时间 | 转场总时长为 200-500ms |
| 夸张 | 仅用于强调时刻 |
| 扎实绘制 | 保持空间模型一致 |
| 吸引力 | 导航流畅且方向明确 |
原则应用
挤压与拉伸:新页面进入时可以带有轻微的弹性稳定效果。模态面板完全展开时可以稍微回弹。触发导航前,拉动操作可以先产生拉伸效果。
预备动作:当前页面先开始退出,新页面随后进入。轻微淡出或缩放可以为变化做好铺垫。页面切换前先更新导航指示器。
演出布局:共享元素 / 主视觉元素在视图间保持上下文连贯。常见元素(导航栏、页脚)保持稳定。让转场焦点落在新的内容区域。
逐帧动画与关键姿势动画:共享元素转场会连续变形(逐帧动画)。交叉淡化会在离散状态间切换(关键姿势动画)。根据内容之间的关联选择合适方式。
跟随动作与重叠动作:页面内容在到达初始位置后逐渐稳定。内容分阶段进入——先标题栏,再主体,最后页脚。图片加载后,在容器中轻微淡入。
慢入 / 慢出:退出:使用缓入(加速离开)。进入:使用缓出(减速进入)。组合使用时,共享元素采用缓入缓出。切勿使用线性效果——会让人觉得不自然。
弧线:滑动转场可以带有轻微弧度。堆栈导航意味着存在 Z 轴深度。圆形显现效果从触发点向外扩展。
次要动作:转场期间,标题栏更新标题。底部导航指示器移动。背景颜色变化。滚动位置随转场重置。
时间:快速转场:200-300ms。标准转场:300-400ms。复杂转场:400-500ms。模态框 / 面板:250-350ms。返回导航通常比前进导航更快。
夸张:将夸张效果留给关键时刻——例如新手引导、成就展示。常规导航应流畅而不过分戏剧化。用户会频繁导航。
扎实绘制:保持空间隐喻一致。如果页面堆叠,就保持 Z 轴顺序。如果页面滑动,方向就应保持一致。用户会根据转场建立心理模型。
吸引力:转场应让人觉得有帮助,而非炫技。快速、流畅且方向明确。用户应能理解自己从哪里来、到哪里去。
转场模式
交叉淡化(默认)
.page-exit {
opacity: 1;
}
.page-exit-active {
opacity: 0;
transition: opacity 200ms ease-in;
}
.page-enter {
opacity: 0;
}
.page-enter-active {
opacity: 1;
transition: opacity 200ms ease-out;
}
滑动(分层)
/* Forward navigation */
.page-enter {
transform: translateX(100%);
}
.page-enter-active {
transform: translateX(0);
transition: transform 300ms ease-out;
}
.page-exit-active {
transform: translateX(-30%);
transition: transform 300ms ease-in;
}
/* Back navigation - reversed */
.page-enter {
transform: translateX(-30%);
}
.page-exit-active {
transform: translateX(100%);
}
共享元素(主视觉)
// View Transitions API
document.startViewTransition(() => {
updateDOM();
});
// CSS for specific element
.hero-image {
view-transition-name: hero;
}
::view-transition-old(hero),
::view-transition-new(hero) {
animation-duration: 300ms;
}
时间参考
| 转场类型 | 时长 | 退出 | 进入 |
|---|---|---|---|
| 交叉淡化 | 200-300ms | 缓入 | 缓出 |
| 向前滑动 | 300-400ms | 缓入 | 缓出 |
| 返回滑动 | 250-350ms | 缓入 | 缓出 |
| 打开模态框 | 250-350ms | — | 缓出 |
| 关闭模态框 | 200-300ms | 缓入 | — |
| 共享元素 | 300-400ms | 不适用 | 缓入缓出 |
| 切换标签页 | 150-200ms | 即时 | 缓出 |
导航模式
| 模式 | 转场 | 方向 |
|---|---|---|
| 逐层深入(列表→详情) | 向左滑动 / 共享元素 | 向右 = 前进 |
| 标签栏 | 淡化 / 滑动 | 水平 |
| 底部面板 | 向上滑动 | 垂直 |
| 模态框 | 缩放 + 淡化 | Z 轴 |
| 返回按钮 | 前进转场的反向效果 | 向左 = 返回 |
性能
- 仅使用
transform和opacity - 硬件加速:
will-change: transform - 减弱动态效果:即时转场
- 在低性能设备上测试——转场不得造成阻塞
- View Transitions API:原生性能