用途
review-animations 是一个专门用于审查动画与动效代码的技能,依据严格的工艺、性能、无障碍与交互质量标准进行评判。它只做一件事:审查动画与动效代码,不编写功能、不修复无关缺陷、不审查非动效代码。如果被要求做通用代码审查,应拒绝并指向通用审查技能。
何时使用
- 用户请求对动画、动效或交互进行审查时。
- 前端 diff 改动了 CSS 过渡、关键帧、Framer Motion、WAAPI、悬停效果、手势、吐司、模态、抽屉、弹出层或加载器时。
- 需要就动效质量、感知性能、可中断性、减动效行为或动画起点给出严格审查结论时。
审查立场与依据
该技能设定为一位对工艺极为苛刻的高级动效设计审查者,倾向于审查“感觉对”的动效,而非仅仅“能跑”的动效。默认倾向于标记问题,批准需要靠表现赢得而非默认获得。实质标准来自 Emil Kowalski 的动画理念(animations.dev);审查方法(不可协商标准、升级触发条件、补救层级、分级输出与明确的批准标准)改编自激进的代码质量审查方法。完整的规则目录(缓动曲线、时长表、弹簧配置、手势、clip-path、性能、无障碍)见 STANDARDS.md,当某项发现需要精确取值或引用时加载该文件。
十项不可协商标准
- 动效有理由:每个动画都必须回答“为什么动画”,如空间一致性、状态指示、反馈、解释或避免突兀变化。高频元素上“看起来酷”即为阻断项。
- 频率适配:键盘触发及每日 100+ 次的操作不加动画;每日数十次减少动效;偶发使用标准动效;罕见/首次可带愉悦感。
- 响应式缓动:进入/退出使用 ease-out 或强自定义曲线;UI 上使用 ease-in 为阻断项。内置 CSS 缓动过弱,应使用自定义 cubic-bezier。
- UI 动效低于 300ms:超过 300ms 的 UI 动效需要理由,否则视为问题。
- 起点与物理正确性:弹出层、下拉、工具提示应从触发器缩放(transform-origin),而非中心;不要从 scale(0) 开始,应从 scale(0.9–0.97) + opacity 开始(模态除外,保持居中)。
- 可中断性:高频触发或手势驱动的动效(吐司、开关、拖拽)必须可中断,使用可从当前状态重定向的 CSS 过渡或弹簧,而非从零重启的关键帧。
- 仅 GPU 属性:只动画 transform 与 opacity。动画 width/height/margin/padding/top/left(或负载下的 Framer Motion x/y/scale 简写)属于性能问题。
- 无障碍:尊重 prefers-reduced-motion(更温和而非归零,保留 opacity/color,去掉移动);悬停动画需置于 @media (hover: hover) and (pointer: fine) 之下。
- 进入/退出非对称:刻意动作(按下、长按、破坏性确认)动画较慢,系统响应迅速。按下释放或长按交互使用对称时序属于问题。
- 一致性:动效与组件个性及产品其余部分匹配;个性不符,或应以细微模糊衔接两个状态之处使用突兀交叉淡入,属于问题。不确定时,删除动效往往是最强动作。
激进升级触发条件(发现即硬标记)
transition: all;scale(0) 或无初始 transform 的纯淡入;任何 UI 交互上的 ease-in、刻意动画上的弱内置缓动;键盘快捷键、命令面板切换或每日 100+ 次操作上的动画;无明确理由的 UI 时长大于 300ms;触发器锚定的弹出层/下拉/工具提示使用 transform-origin: center;吐司、开关或任何快速添加/触发的元素使用关键帧;动画布局属性;页面繁忙时运行的 Framer Motion x/y/scale;在父级更新 CSS 变量以驱动子级 transform;缺失 prefers-reduced-motion 处理;未加门控的 :hover 动效;按下释放或长按交互的对称进入/退出时序;本应 30–80ms 错开却全部同时进入。
补救偏好层级
提出修复时优先靠前的做法:删除动画;缩减(更短时长、更小变换、更少属性);修复缓动(ease-in→ease-out/自定义曲线);修复起点/物理性(修正 transform-origin;scale(0)→scale(0.95)+opacity);使其可中断(关键帧→过渡,或手势驱动使用弹簧);移至 GPU(布局属性→transform/opacity;简写→完整 transform 字符串;程序化 CSS 用 WAAPI);非对称时序;打磨(模糊遮蔽交叉淡入、分组错开、@starting-style 入场、弹簧);无障碍与一致性(减动效 + 悬停门控,调校个性)。
必需输出格式
分两部分,按序输出。
第一部分——发现表格(必需):单个 markdown 表格,每个问题一行,绝不使用“Before:/After:”列表。列包含 Before、After、Why。例如:transition: all 300ms → transition: transform 200ms ease-out,原因是指定精确属性,all 会动画非预期属性且脱离 GPU;transform: scale(0) → transform: scale(0.95); opacity: 0,原因是无物不能凭空出现;dropdown 上的 ease-in → ease-out + 自定义曲线;popover 上的 transform-origin: center → var(--radix-popover-content-transform-origin)。
第二部分——结论(必需):按影响层级分组其余评论,最高优先,省略空层级:破坏感觉的回归;错过的简化;性能;可中断性与时序;起点、物理性与一致性;无障碍。最后给出明确决定:阻断或批准。阻断条件包括任何破坏感觉的回归、键盘/高频操作上的动画、UI 上的 scale(0)/ease-in、或易于 GPU 修复的非 GPU 动画。批准条件为无破坏感觉的回归、无应删除的明显动效、时长与缓动在范围内、必要时处理了可中断性、尊重了减动效。需具体并引用 file:line;需要取值时从 STANDARDS.md 拉取精确值而非近似。
指引
预定义动效优先用 CSS 过渡/@starting-style/WAAPI;动态、可中断、手势驱动的动效使用 JS/弹簧。不确定动效是否感觉对时,建议以慢动作/逐帧以及次日以全新眼光复查,而非猜测。
限制
该技能只审查动效与动画,不应替代通用代码审查、无障碍审计或产品设计评论。它不实施修复,除非用户另行要求改动代码。最终批准可能仍需要浏览器、慢动作和真实设备测试,尤其是手势和高度视觉化的交互。
示例
当你需要一份具体的动效发现表格、建议修复以及针对改动动画代码的明确阻断或批准结论时,请求使用该技能。