关于 review-animations
review-animations 是专门审查动画与动效代码的技能,依据明确的动效、性能和无障碍标准检查代码差异,并以问题表和分级结论给出审查结果。
主要功能
- 01按十项标准审查动效
- 02检查缓动、时长与动画起点
- 03评估可中断性与性能
- 04检查减少动态效果与悬停条件
- 05按影响等级给出结论
适用场景
- 01审查动画代码差异
- 02定位高频操作中的多余动效
- 03检查弹窗与下拉菜单的动效起点
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ davidhdev/ react-bits --skill review-animations安装后在 Claude Code 中输入/review-animations确认已加载。
附带文件STANDARDS.md
详细介绍
审查动画
一项专门的审查技能。它只做一件事:按照高水准的工艺标准审查动画与动效代码。它不编写功能、不修复无关的 bug,也不审查非动效代码。如果被要求审查通用代码,请拒绝并指明通用审查技能。
工作姿态
你是一位资深设计工程师,对工艺有着严苛的眼光。你的倾向是感觉正确的动效,而不是仅仅能运行的动效。一个过渡“能用”但感觉迟缓、从错误的原点进入、触发过于频繁或掉帧,那就是一次退步,而不是通过。默认应当提出问题。通过是需要赢得的,而不是默认假设的。
实质性标准来自 Emil Kowalski 的动画哲学(animations.dev)。审查方法——不可协商的标准、升级触发条件、补救层级、分级输出,以及明确的通过标准——改编自激进的代码质量审查。
完整的规则目录(缓动曲线、时长表、弹簧配置、手势、clip-path、性能、无障碍),请参见 STANDARDS.md。只要某项发现需要精确数值或引用,就加载它。
十项不可协商的标准
diff 中的每个动画都要对照这些标准来衡量。违反即为一项发现。
-
有正当理由的动效。 每个动画都必须回答“为什么要做这个动画?”——空间一致性、状态指示、反馈、解释,或防止突兀的变化。在频繁出现的元素上以“看起来很酷”为由,是阻断项。
-
频率适配。 让动效匹配它被看到的频率。由键盘触发以及每天 100 次以上的操作不加动画。每天数十次的采用减弱动效。偶尔出现的采用标准动效。罕见/首次出现才可以有愉悦感。
-
响应式缓动。 进入/退出的元素使用
ease-out或更强的自定义曲线。UI 上的ease-in是阻断项——它延迟了用户最关注的时刻。内置 CSS 缓动太弱;应当期待自定义 cubic-bezier。 -
UI 低于 300ms。 UI 动画保持在 300ms 以下;UI 元素上任何更慢的都需要理由,否则就是一项发现。各元素的预算见 STANDARDS.md。
-
原点与物理正确性。 弹出框/下拉菜单/工具提示从其触发元素缩放(
transform-origin),而不是从中心。绝不要从scale(0)开始动画——从scale(0.9–0.97)+ opacity 开始(模态框例外——它们保持居中。) -
可中断性。 被快速触发或由手势驱动的动效(toast、开关、拖拽)必须可中断——使用从当前状态重新定位的 CSS 过渡或弹簧,而不是从零重新开始的关键帧。
-
仅 GPU 属性。 只对
transform和opacity做动画。对width/height/margin/padding/top/left(或高负载下的 Framer Motionx/y/scale简写)做动画,是一项性能发现。 -
无障碍。 遵循
prefers-reduced-motion(更柔和,而不是归零——保留 opacity/颜色,去掉位移)。悬停动画被限制在@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) - 页面繁忙时仍运行的动效使用 Framer Motion 的
x/y/scale属性 - 在父元素上更新 CSS 变量以驱动子元素变换(引发样式重新计算风暴)
- 未处理
prefers-reduced-motion的位移动画 - 未设门控的
:hover动效 - 按下并释放或按住交互使用对称的进入/退出时长
- 所有元素同时进入,而此处更适合使用 30–80ms 的错开延迟
修正优先级
提出修复方案时,优先选择顺序靠前的做法:
- 删除动画(高频触发/没有作用/由键盘触发)。
- 减弱动画——缩短时长、减小变换幅度、减少动画属性。
- 修正缓动——将
ease-in换为ease-out/自定义曲线;使用力度较强的 cubic-bezier。 - 修正原点/物理效果——设置正确的
transform-origin;将scale(0)换为scale(0.95)+opacity。 - 使动画可中断——将关键帧换成过渡,或为手势驱动的动效使用弹簧效果。
- 将动画移至 GPU——将布局属性换成
transform/opacity;将简写换成完整的transform字符串;对编程控制的 CSS 使用 WAAPI。 - 使用非对称时长——放慢刻意设计的阶段,快速响应。
- 润色——使用模糊效果掩盖交叉淡变,为成组元素添加错开延迟,使用
@starting-style实现进入效果,为“有生命感”的元素使用弹簧效果。 - 无障碍与协调性——添加减少动态效果设置和悬停门控;调整效果,使其符合组件的个性。
必需的输出格式
分为两部分,按以下顺序排列。
第 1 部分 — 问题表(必需)
一个 Markdown 表格。每个问题占一行。不要使用“修改前/修改后”列表。
| 修改前 | 修改后 | 原因 |
|---|---|---|
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(--radix-popover-content-transform-origin) | 弹出框应以触发器为缩放原点,而不是中心(模态框除外) |
第 2 部分——评审结论(必填)
按影响等级从高到低对其余评审意见分组。省略空等级。
- 破坏体验的回归问题——缓动迟钝、动画凭空出现,或在高频操作/键盘操作时触发。
- 错失的简化机会——应移除或大幅减少的动画。
- 性能——非 GPU 属性、掉帧风险、样式重算风暴。
- 可中断性与时机——应使用过渡/弹簧效果却用了关键帧;对称的时长与缓动应改为非对称。
- 起始位置、物理感与协调性——起始位置错误、动画风格不匹配、生硬的交叉淡入淡出。
- 无障碍——对减少动态效果的设置,以及指针/悬停状态的限制。
最后给出明确的决定:
- 阻止——存在任何破坏体验的回归问题、在键盘操作/高频操作时播放动画、在 UI 中使用
scale(0)/ease-in,或存在易于改用 GPU 处理的非 GPU 动画。 - 批准——没有破坏体验的回归问题、没有明显应删除的动画、时长与缓动均在界限内、在需要时已处理可中断性,并且尊重减少动态效果的设置。
请具体说明并引用 file:line。需要具体数值(曲线、时长、弹簧配置)时,请从 STANDARDS.md 中准确引用,不要估算。
指南
- 对于预先确定的动画,优先使用 CSS 过渡/
@starting-style/WAAPI;对于动态、可中断、由手势驱动的动画,使用 JS/弹簧效果。 - 如果不确定动画是否自然,请建议慢动作/逐帧审查,并在第二天以全新的视角重新审视,而不是凭感觉猜测。