用途
Interaction Physics 用于为 UI 构建动效层,让每一次用户操作都获得物理化的响应:一致的时长、有意义的缓动,以及即时到达的反馈。其首要原则是:每个动画都必须承担一项职责——确认操作、引导注意力或解释状态变化。不承担任何职责的动效应被删除,而不是被调优。
该技能同时交付两份成果:一份项目级动画规范(使后续动效保持一致)和范围内交互的实现代码。
何时使用 / 何时不用
适用:悬停/按压/焦点反馈、进入/退出过渡(模态框、提示、页面、列表项)、表单反馈动画、动画审计、选择时长与缓动、prefers-reduced-motion 支持。
以下情况应转交其他技能:
- 需要决定显示哪种加载指示器以及何时显示 → skills/frontend-design/loading-states(本技能负责为其添加动画,该技能负责选择指示器)
- 乐观 UI、感知延迟、Core Web Vitals → skills/frontend-design/performance-optimization
- 渲染管线、布局抖动、帧预算 → skills/frontend-design/design-engineer-mindset
- 非动效的视觉打磨(间距、对比度、层级) → skills/frontend-design/visual-hierarchy-refactoring
第 0 步——先检查代码库,再只询问剩余问题
- 搜索现有动效:transition、animation、@keyframes、framer-motion、motion.、react-spring、gsap、Tailwind transition-/animate- 类。记录所有在用的时长和缓动——此处的不一致(例如悬停同时使用 150ms、200ms、250ms、300ms)通常就是第一个发现。
- 检查是否存在 prefers-reduced-motion 处理。缺失即为自动修复项。
- 确定动画载体:如果项目已使用动效库,就用它实现;否则默认使用 CSS 过渡/关键帧。绝不为 CSS 能实现的效果引入动效库。
- 找出失效交互:没有悬停/激活状态的按钮、无过渡直接出现的模态框/提示、突然弹出的表单错误。
- 询问用户(仅当无法推断时,一次性批量询问):期望的个性(沉稳/专业 vs 活泼——若产品领域明显可直接推断)和范围(全应用通盘 vs 特定流程)。如果用户说“应用感觉卡顿”,不要追问——直接审计、说明假设并继续。
工作流程
1. 先编写动画规范
在动代码之前先固定词汇。标准时长类别:
| 类别 | 时长 | 缓动 | 适用于 |
|---|---|---|---|
| 微反馈 | 150–250ms | ease-out | 悬停、按压、焦点、切换、颜色/状态变化 |
| 结构性过渡 | 300–500ms | 进入 ease-out,退出 ease-in | 模态框、抽屉、页面、手风琴、提示 |
| 注意力 | 500–1000ms | ease-in-out | 警报、脉冲、一次性强调 |
| 连续 | 约 1s 循环 | linear | 旋转器、不确定进度 |
决策规则:
- 按方向选择缓动:进入元素减速(ease-out);退出元素加速(ease-in);屏幕内移动使用 ease-in-out;只有机械循环使用 linear。像 cubic-bezier(0.34, 1.56, 0.64, 1) 这样的弹性曲线仅用于刻意的活泼感——一个应用中最多一两处。
- 按时长和距离选择时长:小元素短距离移动取范围下限(悬停着色:150–200ms);大表面或长距离取上限(全屏抽屉:400–500ms)。工具提示和模态框不能共用同一时长。
- 退出快于进入(约为进入时长的 75%)——用户已经决定离开。
- 将第 0 步发现的不一致值收敛为最多 3–4 个命名令牌(例如 --duration-fast: 200ms; --duration-base: 300ms; --duration-slow: 450ms),定义为 CSS 变量或主题令牌。
2. 用四部分解剖法规定每个微交互
对范围内每个交互说明:触发器(用户操作/系统事件)→ 规则(什么变化、时长、缓动)→ 反馈(用户感知到什么)→ 循环与模式(是否重复、能否中断)。可中断性规则:对于用户能快速切换的任何内容,状态驱动的过渡(CSS transition 或动效库)优于发射后不管的关键帧——半开的菜单必须平滑反向,而不是重新开始。
3. 在性能与无障碍约束下实现
- 只动画 transform 和 opacity(对合成器友好)。绝不直接动画 width、height、top、left 或 box-shadow;通过交叉淡化伪元素的 opacity 来伪造阴影动画。仅对小控件可接受动画 background-color。
- 在同一次变更中交付 reduced-motion 块——基线见 references/patterns.md。装饰性动效消失;信息性动效(进度)可保留为仅 opacity。
- 反馈绝不只依赖动效:每个动画状态变化都搭配颜色/文本/图标变化,使其在 reduced-motion 下依然有效。
- 键盘对等:每个 :hover 效果都要有 :focus-visible 等价物。
- 闪烁绝不快于每秒 3 次(癫痫风险——这是 WCAG 要求,不是风格偏好)。
典型微反馈示例(完整图库——按钮、表单验证、提示、模态框、页面过渡——见 references/patterns.md):
button {
transition: background-color 200ms ease-out, transform 200ms ease-out;
}
button:hover:not(:disabled) { background-color: var(--color-primary-dark); }
button:active:not(:disabled) { transform: scale(0.98); }
button:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 2px; }
4. 验证
尽可能运行应用(或推演渲染路径):确认过渡触发、退出有动画(常见遗漏——元素在退出动画前就卸载了)、快速切换不卡顿或重启、reduced-motion 媒体查询确实抑制了移动。
必需输出格式
交付两份成果:
-
代码——使用项目现有动效载体和令牌实现的过渡/动画。
-
动画规范(markdown,成为项目的动效参考):
## Motion tokens
| Token | Value | Easing | Used for |
| --duration-fast | 200ms | ease-out | hover, press, focus, toggles |
| --duration-base | 300ms | ease-out/ease-in | toasts, dropdowns, accordions |
| --duration-slow | 450ms | ease-out/ease-in | modals, drawers, page transitions |
## Interaction inventory
| Interaction | Trigger | Motion | Duration/easing | Status |
| Button hover | pointer/focus | bg tint + scale on press | fast / ease-out | implemented |
| Modal open | click | fade + 20px rise | slow / ease-out | implemented |
| Toast exit | timeout/dismiss | slide right + fade | base×0.75 / ease-in | implemented |
## Audit findings (for audit engagements)
| Issue | Location | Fix |
| 5 different hover durations | [files] | collapsed to --duration-fast |
| No reduced-motion support | global | baseline block added |
## Deliberately not animated
[List, with one-line reasons — restraint is part of the spec]
质量标准(交付前检查)
- 交付代码中的每个动画都对应一个目的(确认/引导/解释)——被质疑时能说出它
- 所有时长来自规范的令牌;触及文件中不留魔法数字
- 进入 = ease-out,退出 = ease-in,循环 = linear——无例外,除非说明理由
- 只动画 transform/opacity(小控件颜色变化除外)
- prefers-reduced-motion 块存在且有效
- 每个 :hover 状态都有 :focus-visible 对应项
- 动画状态变化同时改变颜色/文本/图标(动效不是唯一信号)
- 无任何闪烁超过每秒 3 次;无无限装饰循环
硬性禁止:禁止滚动劫持;禁止在文本输入按键时动画;CSS 足够时不添加动效库;禁止动画布局属性。
集成
- skills/frontend-design/component-architecture → 提供本技能要动画的组件状态(悬停/激活/加载/禁用);若存在令牌系统,在其中添加令牌。
- skills/frontend-design/loading-states → 决定显示哪种指示器;本技能提供其微光/旋转/进度动效。
- skills/frontend-design/performance-optimization ← 消费规范中“只动画合成器属性”的约束;若动画仍掉帧则回传发现。
- skills/frontend-design/accessibility-excellence ← 审计所交付内容的 reduced-motion 和闪烁频率合规性。
参考
references/patterns.md —— 完整实现图库:完整按钮状态集、表单验证、骨架/旋转器/进度动效、提示进入/退出、页面与模态框过渡、reduced-motion 基线块。编写实际 CSS 时阅读它。