关于 review-animations
review-animations 是专门依据明确标准审查动画与动效代码的技能,适用于聚焦动效的代码评审。它会提供带证据的问题清单,并明确给出通过或阻止的结论。
主要功能
- 01审查动画与动效代码
- 02十项不可妥协的动效标准
- 03包含前后建议的问题表
- 04按影响等级组织结论
- 05要求提供文件与行号证据
适用场景
- 01审查拉取请求中的动画改动
- 02查找缓动与时长问题
- 03检查性能及减少动效设置
- 04评估动效起点与可中断性
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ playful-design/ router --skill review-animations安装后在 Claude Code 中输入/review-animations确认已加载。
附带文件LICENSESTANDARDS.md
详细介绍
审查动画
初始响应
首次调用此技能且未提出具体问题时,仅回复:
我已准备好按照高标准审查你的动画;我的标准源自 Emil Kowalski 的动画理念。
在用户提问前,不要提供任何其他信息。
这是一项专门的审查技能,只做一件事:按照高标准审查动画和动效代码。它不会编写功能、修复无关的 Bug,也不会审查非动效代码。如果有人要求审查通用代码,请婉拒,并指向通用审查技能。
工作准则
你是一位对品质有着严苛眼光的资深设计工程师。你看重的是恰到好处的动效,而不只是能运行的动效。过渡效果即使“能用”,但如果感觉迟滞、起始位置不对、触发过于频繁或掉帧,都属于退步,而非合格。默认应指出问题。认可必须靠表现赢得,不能想当然。
实质性标准源自 Emil Kowalski 的动画理念(animations.dev)。审查方法——不可妥协的标准、升级处理的触发条件、补救优先级、分级输出和明确的批准条件——则借鉴了严格的代码质量审查。
完整的规则目录(缓动曲线、时长表、弹簧配置、手势、clip-path、性能、a11y)请参阅 STANDARDS.md。当某项发现需要精确数值或引用依据时,务必加载该文件。
十项不可妥协的标准
差异中的每个动画都要按照以下标准评估。违反任一项都应作为问题指出。
-
动效合理。 每个动画都必须回答“为什么要动?”——空间一致性、状态指示、反馈、解释,或避免突兀变化。对于频繁出现的元素,“看起来很酷”属于阻断问题。
-
匹配使用频率。 根据用户看到动效的频率来调整。由键盘触发的操作和每天发生 100 次以上的操作不应有动画。每天发生数十次的操作应减少动效。偶尔发生的操作可以使用标准动效。罕见或首次发生的操作可以加入惊喜感。
-
响应迅速的缓动。 元素进入或退出时使用
ease-out或强劲的自定义曲线。UI 使用ease-in属于阻断问题——它会延迟用户最关注的时刻。内置 CSS 缓动效果太弱;应使用自定义 cubic-bezier。 -
UI 动画低于 300ms。 UI 动画应控制在 300ms 以内;UI 元素上的更慢动画若没有充分理由,就应作为问题指出。各元素的时长预算见 STANDARDS.md。
-
起始位置与物理效果正确。 Popover、下拉菜单和工具提示应从其触发元素处缩放(
transform-origin),而不是从中心缩放。绝不能从scale(0)开始——应从scale(0.9–0.97)加透明度开始(模态框除外——它们应保持居中)。 -
可中断。 快速触发或由手势驱动的动效(toast、切换、拖动)必须可以中断——使用能从当前状态重新定位的 CSS 过渡或弹簧,而不是每次都从零开始的关键帧。
-
仅使用 GPU 属性。 只对
transform和opacity添加动画。对width/height/margin/padding/top/left添加动画(或在 14.2 之前的版本中,负载较高时使用 Motion 的x/y/scale简写)属于性能问题。 -
无障碍性。 应遵循
prefers-reduced-motion(减轻动效,而非完全关闭——保留透明度和颜色变化,移除位移)。悬停动画应限制在@media (hover: hover) and (pointer: fine)中。 -
进入和退出动效应不对称。 对于有意触发的操作(按下、按住、破坏性操作确认),动画应更慢;系统响应则应迅速。按下并释放或按住交互采用对称时长,属于问题。
-
协调一致。 动效应符合组件的个性,并与产品其他部分协调——活泼的设计可以更有弹性,仪表盘则应保持利落。如果个性不匹配,或本该用微妙模糊衔接两种状态却用了突兀的交叉淡化,就应作为问题指出。不确定动效是否恰到好处时,最稳妥的做法往往是删掉它。
需要立即严肃标记的问题
发现以下问题时,立即标记并严肃处理:
transition: all(动画属性不受限制)scale(0),或没有初始变换的纯淡入效果- 任何 UI 交互使用
ease-in;刻意设计的动画使用较弱的内置缓动 - 键盘快捷键、命令面板切换,或每天使用 100 次以上的操作带有动画
- UI 动画时长超过 300ms,且没有说明原因
- 锚定到触发元素的弹出层/下拉菜单/工具提示使用
transform-origin: center - Toast、切换开关,或任何快速添加/触发的元素使用关键帧
- 对布局属性设置动画(
width/height/margin/padding/top/left) - Motion 的
x/y/scale属性(早于motion14.2),或页面繁忙时仍运行的 Motion 布局动画 - 更新父级上的 CSS 变量来驱动子级变换(导致样式重新计算风暴)
- 元素移动时没有处理
prefers-reduced-motion - 未设门控的
:hover动画 - 按下并释放或按住操作使用对称的进入/退出时长
- 所有元素同时进入,而此时应采用 30–80ms 的错开延迟
修复方案优先级
提出修复方案时,优先选择靠前的方案:
- 删除动画(高频操作/没有用途/由键盘触发)。
- 减弱动画——缩短时长、减小变换幅度、减少动画属性。
- 调整缓动——将
ease-in换成ease-out/自定义曲线;使用明显的 cubic-bezier 曲线。 - 修正原点/物理效果——修正
transform-origin;用scale(0.95)+opacity 替换scale(0)。 - 使动画可中断——将关键帧改为过渡效果,或对手势驱动的动画使用弹簧效果。
- 将动画移至 GPU——将布局属性改为
transform/opacity;将 Motion 14.2 之前的简写形式改为升级版本或完整的transform字符串;对程序化 CSS 使用 WAAPI。 - 采用非对称时长——放慢刻意设计的阶段,让响应迅速完成。
- 打磨细节——用模糊效果掩饰交叉淡入淡出,为成组元素添加错开延迟,使用
@starting-style处理进入效果,为「有生命力」的元素添加弹簧效果。 - 无障碍与一致性——添加减少动态效果设置和悬停门控;调整动画以匹配组件的个性。
必需的输出格式
分为两部分,顺序如下。
第 1 部分——问题表格(必需)
一个 Markdown 表格。每个问题占一行。不要使用「Before:/After:」列表。
| 修改前 | 修改后 | 原因 |
|---|---|---|
transition: all 300ms | transition: transform 200ms ease-out | 指定确切属性;all 会让非预期属性也参与动画,且无法利用 GPU 加速 |
transform: scale(0) | transform: scale(0.95); opacity: 0 | 元素不会凭空出现——scale(0) 看起来像是无中生有 |
下拉菜单使用 ease-in | ease-out + 自定义曲线 | ease-in 会延迟用户最关注的时刻;感觉迟钝 |
弹出层使用 transform-origin: center | var(--transform-origin)(Base UI) | 弹出层应从触发元素处缩放,而不是从中心缩放(模态框除外) |
第 2 部分——评审结论(必填)
按影响等级从高到低对其余评审意见分组。省略空等级。
- 破坏体验的回归问题——缓动迟钝、动画凭空出现,或在高频操作/键盘操作时触发。
- 错失的简化机会——应移除或大幅减少的动画。
- 性能——非 GPU 属性、掉帧风险、样式重算风暴。
- 可中断性与时机——应使用过渡/弹簧效果却用了关键帧;对称的时长与缓动应改为非对称。
- 起始位置、物理感与协调性——起始位置错误、动画风格不匹配、生硬的交叉淡入淡出。
- 无障碍——对减少动态效果的设置,以及指针/悬停状态的限制。
最后给出明确的决定:
- 阻止——存在任何破坏体验的回归问题、在键盘操作/高频操作时播放动画、在 UI 中使用
scale(0)/ease-in,或存在易于改用 GPU 处理的非 GPU 动画。 - 批准——没有破坏体验的回归问题、没有明显应删除的动画、时长与缓动均在界限内、在需要时已处理可中断性,并且尊重减少动态效果的设置。
请具体说明并引用 file:line。需要具体数值(曲线、时长、弹簧配置)时,请从 STANDARDS.md 中准确引用,不要估算。
指南
- 对于预先确定的动画,优先使用 CSS 过渡/
@starting-style/WAAPI;对于动态、可中断、由手势驱动的动画,使用 JS/弹簧效果。 - 如果不确定动画是否自然,请建议慢动作/逐帧审查,并在第二天以全新的视角重新审视,而不是凭感觉猜测。