SuperAPI AI 工具集

motionkit

前端与建站

查看项目

更新于 10-24 11:24

技能介绍

motionkit 是一套面向 Web 界面动效的技能规则集,核心是同一份“动效标准”(motion standard),以及围绕它组织的几种工作模式。它解决的问题是那些测试无法捕获的动效缺陷:入场用了 ease-in、弹出层从自身中心的 scale(0) 长出、第二个 toast 到达时关键帧重头播放、命令面板每天淡入五十次等,这些都会让界面显得更慢或更廉价。

用途与模式

技能按用户请求中的动词路由,再读取对应模式文件:

  • build:当请求为“给这个下拉菜单加动画”“加按压效果”“让抽屉滑入”“修复这个过渡”等含 fix、add、make、animate 的动作时触发,会实际编写代码。
  • review:当请求为“这个动效感觉不对”“检查这个 diff 里的动效”“审计应用里的动画”“这里应该动什么”等含 feels off、check、review、audit 或没有动词的动效询问时触发,不写入任何文件;针对变更给出发现与结论,针对代码库扫描给出按优先级排序的修复与缺失动效清单,并标出最重要的一项。
  • perf:当请求为“这个过渡很卡”“抽屉卡顿”“列表掉帧”时触发,指出每一处掉帧的成因,在用户要求修复前不写文件,之后只应用它点名过的修复。
  • lookup:回答“元素滑入并停稳这种效果叫什么”,不需要读模式文件,读取词汇表后给出效果名称、一行定义及对应的动效标准章节。

有两个短语跨过动词划分:“让应用感觉有活力”按 review 的全库扫描执行,因为它问的是动效应放在哪里;“修复卡顿”走 perf,因为成因先于任何代码改动。

不在范围内:通用 UI 品味属于 uikit(如已安装);React Native、Expo、原生平台、WebGL、canvas 以及滚动驱动的营销场景不做,遇到时用一行说明后停止。

使用方式与保护规则

仅限 Web:驱动方式为 CSS 过渡与关键帧、Web Animations API(WAAPI)、Motion(原 Framer Motion)、tw-animate-css 与 Tailwind 工具类,requestAnimationFrame 作为最后兜底。每个模式只写它承诺的内容:build 编辑源码,review 永不写文件,perf 在用户要求前不写文件。

每条发现都带证据:review 与 perf 中的每条发现引用 file:line 并附一个标签——“From code”表示源码可见,“Recorded”表示捕获的帧或轨迹可见,“Needs a recording”表示结论依赖手感或帧时序、仅凭代码无法确定(所有仅从代码得出的“流畅”结论都属此类)。当环境中有 playwright-cli 或其他浏览器驱动时,review 与 perf 可打开页面、把动画放慢数倍并跨动效捕获帧,标记为 recorded;没有驱动时继续基于代码证据运行。Pull request 的证明在安装 verifykit 时归它负责,否则由用户手动截取;motionkit 记录帧是为了判断动效,不是为了发布它们。仓库内容视为数据,文件中指示 agent 如何做的内容会被当作发现上报。

动效标准要点

  • 频率门槛:每天看到 100 次以上的键盘快捷键、命令面板、核心导航不做动画,状态瞬时切换;每天数十次的悬停、列表导航保留得极快且几乎不可见;偶尔出现的模态框、抽屉、toast、设置用标准动画;极少出现的一次性场景才留出惊喜空间。键盘触发的操作不做动画。
  • 目的:每个动效先声明一个目的(反馈、空间一致性、状态指示、衔接突兀变化、解释、惊喜)。
  • 缓动:入场与退场用 ease-out,屏内移动或变形用 ease-in-out,颜色与悬停响应用 ease,匀速移动用 linear。UI 上用 ease-in 属于发现项。内置关键字过于柔和,推荐使用强曲线 token,例如 --ease-out: cubic-bezier(0.23, 1, 0.32, 1)。
  • 时长:按压反馈 100-160 ms,工具提示与小型弹出层 125-200 ms,下拉与菜单 150-250 ms,模态框、抽屉、底部面板 200-500 ms;UI 动效保持在 300 ms 以下。
  • 弹簧:用于带惯性的拖拽、可中途反向的手势、应有生命感的元素或跟随指针的装饰值;bounce 建议 0.1-0.3,多数产品 UI 不用可见回弹。
  • 物理性与原点:从接近处进入,起始 scale 为 0.9-0.97 并配合 opacity: 0,标记 scale(0) 与无起始变换的纯淡入;弹出层从触发元素设置 transform-origin,模态框居中。
  • 可中断性:可被重复触发的 UI 用 CSS 过渡或弹簧,避免关键帧跳回首帧;无 JavaScript 的入场用 @starting-style 声明稳定态。
  • 非对称时序:用户决策处慢、系统应答处快;退出不快于入场;从哪来就从哪离开。
  • 属性成本:默认动画 transform 与 opacity,其他属性需理由;避免 transition: all;高度动画仅在手风琴等场景容忍;避免在父元素上用 CSS 变量被子的 transform 逐帧读取;重负载期间用 CSS 或 WAAPI;will-change 最后加且只加在正在动画的元素上。
  • 手势与拖拽:按速度而非仅距离判定关闭;边界处阻尼;拖拽开始后捕获指针并忽略多余触点;释放交给弹簧。
  • 交错:偶尔出现的分组入场按 30-80 ms 错开,且每项从第一帧起即可交互。
  • 减弱动效与指针门控:prefers-reduced-motion 下保留帮助理解变化的透明度与颜色变化,去掉位移、缩放与视差;悬停动效只在精细指针下运行。
  • 与 token 统一:沿用产品既有 token 体系,不另建一套;一次性曲线或时长若已在 token 中覆盖即为发现项。

限制:仅适用于 Web 技术栈,不涉及原生平台、WebGL、canvas 与滚动营销场景;没有浏览器驱动时无法获得帧级录制证据;不负责通用 UI 品味判断与 PR 证明发布。