关于 emilkowal-animations
面向 Web 界面动画开发的参考技能,依据 Emil Kowalski 的指导、开源库及课程内容整理。58 条分级规则涵盖缓动、交互、性能、无障碍和 Tailwind CSS v4。
主要功能
- 01涵盖八类的 58 条规则
- 02缓动与时长指导
- 03动画属性与变换
- 04手势及交互模式
- 05无障碍与减少动态效果实践
- 06Tailwind CSS v4 工具类
适用场景
- 01为 React 组件添加动画
- 02选择缓动曲线与时长
- 03实现滑动和拖动交互
- 04检查动画的无障碍性与性能
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ pproenca/ dot-skills --skill emilkowal-animations安装后在 Claude Code 中输入/emilkowal-animations确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
metadata.jsonassets/templates/_template.mdreferences/_sections.mdease-context-matters.mdease-custom-curves.mdease-in-out-onscreen.mdease-ios-drawer.mdease-out-default.mdease-spring-config.mdease-spring-natural.mdinteract-damping.mdinteract-friction-upward.mdinteract-interruptible.mdinteract-momentum-dismiss.mdinteract-multitouch.mdinteract-pointer-capture.mdinteract-scroll-drag-conflict.mdinteract-snap-points.mdinteract-touch-hover.mdpolish-blur-bridge.mdpolish-clip-path-tabs.mdpolish-dont-remove-all.mdpolish-framer-hook.mdpolish-hover-gap-fill.mdpolish-opacity-fallback.mdpolish-reduced-motion.mdpolish-scroll-reveal.mdpolish-stagger-children.mdpolish-toast-stacking.mdprops-avoid-css-variables.md详细介绍
Emil Kowalski 动画最佳实践
基于 Emil Kowalski 的经验、开源库(Sonner、Vaul)及其 animations.dev 课程编写的 Web 界面动画综合指南。涵盖 8 个类别中的 58 条规则,并按影响程度排序。
适用场景
在以下情况下参考这些指南:
- 为 React 组件添加动画
- 选择缓动曲线或时间值
- 实现基于手势的交互(滑动、拖拽)
- 构建 toast 通知或抽屉组件
- 优化动画性能
- 确保动画的无障碍性
- 使用 Tailwind CSS v4 工具类实现上述任意效果(参见
tw-类别)
按优先级排列的规则类别
| 优先级 | 类别 | 影响程度 | 前缀 |
|---|---|---|---|
| 1 | 缓动选择 | CRITICAL | ease- |
| 2 | 时间与时长 | CRITICAL | timing- |
| 3 | 属性选择 | HIGH | props- |
| 4 | 变换技巧 | HIGH | transform- |
| 5 | 交互模式 | MEDIUM-HIGH | interact- |
| 6 | 策略性动画 | MEDIUM | strategy- |
| 7 | 无障碍性与润色 | MEDIUM | polish- |
| 8 | Tailwind v4 工具类 | MEDIUM | tw- |
快速参考
1. 缓动选择(CRITICAL)
ease-out-default- 默认使用 ease-out 缓动ease-custom-curves- 使用自定义 cubic-bezier,而非内置 CSS 缓动ease-in-out-onscreen- 对屏幕上的移动使用 ease-in-outease-spring-natural- 使用弹簧动画实现自然运动ease-spring-config- 配置弹簧动画的时长和弹性ease-ios-drawer- 抽屉组件使用 iOS 风格的缓动ease-context-matters- 根据动画场景选择合适的缓动
2. 时间与时长(CRITICAL)
timing-300ms-max- UI 动画时长控制在 300ms 以内timing-faster-better- 更快的动画能提升感知性能timing-asymmetric- 按下和释放时使用非对称时长timing-tooltip-delay- 首次显示 tooltip 时延迟,之后立即显示timing-drawer-500ms- 抽屉动画使用 500ms 时长
3. 属性选择(HIGH)
props-transform-opacity- 仅对 transform 和 opacity 设置动画props-hardware-accelerated- 主线程繁忙时使用硬件加速动画props-will-change- 使用 will-change 防止 1px 偏移props-avoid-css-variables- 拖拽动画避免使用 CSS 变量props-clip-path-performant- 使用 clip-path 实现不影响布局的显现效果
4. 变换技巧(HIGH)
transform-scale-097- 按下按钮时将其缩放至 0.97transform-never-scale-zero- 绝不从 scale(0) 开始动画transform-percentage-translate- translateY 使用百分比值transform-origin-aware- 根据变换原点调整动画transform-scale-children- 缩放变换会影响子元素transform-3d-preserve- 3D 变换效果使用 preserve-3dtransform-starting-style- 使用 @starting-style 为进入状态添加动画
5. 交互模式(中高)
interact-interruptible- 让动画可中断interact-momentum-dismiss- 使用基于惯性的关闭方式interact-damping- 在边界处为拖动添加阻尼interact-scroll-drag-conflict- 解决滚动与拖动冲突interact-snap-points- 实现感知速度的吸附点interact-friction-upward- 允许向上拖动并添加摩擦力interact-pointer-capture- 在拖动操作中使用指针捕获interact-multitouch- 拖动时忽略额外的触摸点interact-touch-hover- 通过指针媒体查询控制悬停动画
6. 动画策略(中)
strategy-keyboard-no-animate- 绝不为键盘触发的操作添加动画strategy-frequency-matters- 添加动画前考虑交互频率strategy-purpose-required- 每个动画都必须有明确目的strategy-feedback-immediate- 对所有操作提供即时反馈strategy-marketing-exception- 营销网站是例外strategy-cohesion- 让动效符合组件的个性strategy-review-fresh-eyes- 慢动作回看动画,并在次日再次审视
7. 无障碍与润色(中)
polish-reduced-motion- 遵循 prefers-reduced-motion 设置polish-opacity-fallback- 使用透明度作为减少动态效果时的回退方案polish-framer-hook- 在 Framer Motion 中使用 useReducedMotion Hookpolish-dont-remove-all- 减少动态效果时仍保留柔和动画polish-blur-bridge- 使用模糊效果衔接动画状态polish-clip-path-tabs- 使用 clip-path 实现标签页切换过渡polish-toast-stacking- 使用缩放和偏移实现 Toast 堆叠polish-scroll-reveal- 在适当的阈值触发滚动动画polish-hover-gap-fill- 填补可悬停元素之间的空隙polish-stagger-children- 错开子元素动画以实现编排
8. Tailwind v4 工具类(中等)
使用合适的 Tailwind CSS v4 工具类来表达上述原则。仅适用于 Tailwind v4 项目;上述原生 CSS 和 Framer Motion 规则仍是权威依据。
tw-ease-duration-defaults- 显式设置 ease-out 和小于 300ms 的持续时间tw-custom-easing-theme- 将自定义缓动曲线注册为 @theme 令牌tw-press-scale- 使用 active:scale-[0.97] 提供按钮按压反馈tw-asymmetric-timing- 使用 active:duration 分别设置按压和释放的时长tw-starting-enter- 使用 starting: 变体为进入状态添加动画tw-reduced-motion- 使用 motion-safe / motion-reduce 控制是否启用移动效果tw-origin-aware- 使用 origin-* 工具类设置变换原点tw-will-change- 仅在活动手势期间应用 will-change-transform
关键值参考
| 值 | 用途 |
|---|---|
cubic-bezier(0.23, 1, 0.32, 1) | UI 交互的强缓出效果 |
cubic-bezier(0.77, 0, 0.175, 1) | 屏幕内移动的强缓入缓出效果 |
cubic-bezier(0.32, 0.72, 0, 1) | iOS 风格抽屉/面板动画 |
scale(0.97) | 按钮按压反馈 |
scale(0.95) | 最小进入缩放比例(绝不使用 scale(0)) |
200ms ease-out | 标准 UI 过渡效果 |
300ms | UI 动画的最长持续时间 |
500ms | 抽屉动画持续时间 |
0.11 px/ms | 惯性关闭的速度阈值 |
100px | 滚动显现的视口阈值 |
14px | Toast 堆叠偏移量 |
按元素设置持续时间
根据元素的出现频率和移动幅度选择持续时间。UI 动画应控制在 300ms 以内。
| 元素 | 持续时间 |
|---|---|
| 按钮按压反馈 | 100–160ms |
| 工具提示、小型弹出框 | 125–200ms |
| 下拉菜单、选择框 | 150–250ms |
| 模态框、抽屉 | 200–500ms |
| 营销 / 说明内容 | 可以更长 |
参考文件
| 文件 | 说明 |
|---|---|
| references/_sections.md | 类别定义和排序 |
| assets/templates/_template.md | 新规则模板 |
| metadata.json | 版本和参考信息 |
评论
支持 Markdown