关于 auto-animate
面向前端开发者的 AutoAnimate 使用技能,介绍如何为 React、Vue、Svelte 和原生 JavaScript 界面添加元素变化动画,并提供 SSR 与常见问题处理示例。
主要功能
- 01为增删和排序添加动画
- 02支持 React、Vue、Svelte 与原生 JS
- 03提供 SSR 安全用法
- 04尊重减少动态效果偏好
- 05附带组件模板与故障排查
适用场景
- 01制作列表筛选和排序动画
- 02为手风琴展开添加过渡
- 03让通知消息淡入淡出
- 04动画显示表单校验提示
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ secondsky/ claude-skills --skill auto-animate安装后在 Claude Code 中输入/auto-animate确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/example-template.txtreferences/auto-animate-vs-motion.mdcss-conflicts.mdexample-reference.mdssr-patterns.mdscripts/example-script.shinit-auto-animate.shtemplates/accordion.tsxfilter-sort-list.tsxform-validation.tsxreact-basic.tsxreact-typescript.tsxtoast-notifications.tsxvite-ssr-safe.tsx详细介绍
AutoAnimate
状态:已可用于生产 ✅ 上次更新:2026-08-03 依赖项:无(适用于任何 React 配置) 最新版本:@formkit/[email protected]
快速开始(2 分钟)
1. 安装 AutoAnimate
bun add @formkit/auto-animate
这样做的原因:
- Gzip 压缩后仅 3.28 KB(Motion 为 22 KB)
- 零依赖
- 与框架无关(React、Vue、Svelte、原生 JS)
2. 添加到组件中
import { useAutoAnimate } from "@formkit/auto-animate/react";
export function MyList() {
const [parent] = useAutoAnimate(); // 1. Get ref
return (
<ul ref={parent}> {/* 2. Attach to parent */}
{items.map(item => (
<li key={item.id}>{item.text}</li> {/* 3. That's it! */}
))}
</ul>
);
}
重要提示:
- ✅ 列表项始终使用唯一且稳定的键
- ✅ 父元素必须始终渲染(不能有条件地渲染)
- ✅ AutoAnimate 会自动遵循
prefers-reduced-motion - ✅ 添加、移除和重新排序操作均可生效
3. 在生产环境中使用(兼容 SSR)
适用于 Cloudflare Workers 或 Next.js:
// Use client-only import to prevent SSR errors
import { useState, useEffect } from "react";
export function useAutoAnimateSafe<T extends HTMLElement>() {
const [parent, setParent] = useState<T | null>(null);
useEffect(() => {
if (typeof window !== "undefined" && parent) {
import("@formkit/auto-animate").then(({ default: autoAnimate }) => {
autoAnimate(parent);
});
}
}, [parent]);
return [parent, setParent] as const;
}
避免已知问题
此技能可避免 10+ 个已记录的问题:
问题 #1:SSR/Next.js 导入错误
错误:"Can't import the named export 'useEffect' from non EcmaScript module"
来源:https://github.com/formkit/auto-animate/issues/55
原因:AutoAnimate 使用了服务器上不可用的 DOM API
避免方法:使用动态导入(参见 templates/vite-ssr-safe.tsx)
问题 #2:有条件地渲染父元素
错误:父元素采用条件渲染时,动画不起作用 来源:https://github.com/formkit/auto-animate/issues/8 原因:ref 无法附加到不存在的元素上 避免方法:
// ❌ Wrong
{showList && <ul ref={parent}>...</ul>}
// ✅ Correct
<ul ref={parent}>{showList && items.map(...)}</ul>
问题 #3:缺少唯一键
错误:项目动画不正确或闪烁
来源:官方文档
原因:React 无法追踪哪些项目发生了变化
避免方法:始终使用唯一且稳定的键(key={item.id})
问题 #4:Flexbox 宽度问题
错误:元素会直接跳到目标宽度,而非平滑地过渡
来源:官方文档
原因:flex-grow: 1 会等待周围内容
避免方法:为需要动画的元素指定明确的宽度,而不是使用 flex-grow
问题 #5:表格行显示问题
错误:移除行时表格结构会损坏
来源:https://github.com/formkit/auto-animate/issues/7
原因:Display: table-row 与动画冲突
避免方法:将其应用于 <tbody> 而非单独的行,或使用基于 div 的布局
问题 #6:Jest 测试错误
错误:"Cannot find module '@formkit/auto-animate/react'"
来源:https://github.com/formkit/auto-animate/issues/29
原因:Jest 无法正确解析 ESM 导出
避免方法:在 jest.config.js 中配置 moduleNameMapper
问题 #7:esbuild 兼容性
错误:"Path '.' not exported by package" 来源:https://github.com/formkit/auto-animate/issues/36 原因:ESM/CommonJS 条件不匹配 避免方法:配置 esbuild,以便正确处理 ESM 模块
问题 #8:CSS 定位副作用
错误:添加 AutoAnimate 后布局损坏
来源:官方文档
原因:父元素会自动获得 position: relative
避免方法:在 CSS 中考虑定位变化,或显式设置定位
问题 #9:Vue/Nuxt 注册错误
错误:"Failed to resolve directive: auto-animate" 来源:https://github.com/formkit/auto-animate/issues/43 原因:插件注册不正确 避免方法:在 Vue/Nuxt 配置中正确设置插件(参见 references/)
问题 #10:Angular ESM 问题
错误:构建失败,并提示 "ESM-only package" 来源:https://github.com/formkit/auto-animate/issues/72 原因:CommonJS 构建环境 避免方法:为 Angular Package Format 配置 ng-packagr
何时使用 AutoAnimate,何时使用 Motion
适合使用 AutoAnimate 的情况:
- ✅ 简单的列表过渡效果(添加/移除/排序)
- ✅ 手风琴展开/折叠
- ✅ Toast 通知淡入/淡出
- ✅ 表单验证消息出现/消失
- ✅ 倾向于零配置
- ✅ 包体积至关重要(3.28 KB)
- ✅ 应用于现有代码或第三方代码
- ✅ 可接受“够用”的动画
适合使用 Motion 的情况:
- ✅ 复杂的编排动画
- ✅ 手势控制(拖动、滑动、悬停)
- ✅ 基于滚动的动画
- ✅ 弹簧物理动画
- ✅ SVG 路径动画
- ✅ 需要关键帧控制
- ✅ 动画变体/编排
- ✅ 自定义缓动曲线
经验法则:90% 的情况下使用 AutoAnimate,主视觉或交互式动画则使用 Motion。
关键规则
始终做到
✅ 使用唯一且稳定的键 - key={item.id},不要用 key={index}
✅ 让父元素保留在 DOM 中 - 父级 ref 元素始终渲染
✅ SSR 时仅在客户端使用 - 在服务器环境中使用动态导入
✅ 尊重无障碍要求 - 保持 disrespectUserMotionPreference: false
✅ 在禁用动画时进行测试 - 确认界面不使用动画也能正常运行
✅ 使用明确的宽度 - 避免在动画元素上使用 flex-grow
✅ 对表格应用于 tbody - 不要应用于单独的行
切勿这样做
❌ 有条件地渲染父元素 - {show && <ul ref={parent}>}
❌ 将索引用作键 - key={index} 会破坏动画
❌ 忽略 SSR - 会导致 Cloudflare Workers/Next.js 出错
❌ 强制播放动画 - disrespectUserMotionPreference: true 会破坏无障碍体验
❌ 直接为表格添加动画 - 使用 tbody 或基于 div 的布局
❌ 省略唯一键 - 正确播放动画的必要条件
❌ 使用复杂动画 - 改用 Motion
配置
AutoAnimate 默认无需配置。可选的自定义设置:
import { useAutoAnimate } from "@formkit/auto-animate/react";
const [parent] = useAutoAnimate({
duration: 250, // milliseconds (default: 250)
easing: "ease-in-out", // CSS easing (default: "ease-in-out")
// disrespectUserMotionPreference: false, // Keep false!
});
建议:除非有具体的设计要求,否则使用默认设置。
使用捆绑资源
模板(templates/)
可直接复制粘贴的示例:
react-basic.tsx- 包含添加/移除/随机排序功能的简单列表react-typescript.tsx- 带自定义配置的类型化设置filter-sort-list.tsx- 动画筛选和排序accordion.tsx- 可展开的分区toast-notifications.tsx- 淡入/淡出的消息form-validation.tsx- 错误消息动画vite-ssr-safe.tsx- Cloudflare Workers/SSR 模式
参考资料(references/)
auto-animate-vs-motion.md- 选择使用哪种方案的指南css-conflicts.md- Flexbox、表格和定位相关注意事项ssr-patterns.md- Next.js、Nuxt、Workers 解决方案
脚本(scripts/)
init-auto-animate.sh- 自动化设置脚本
Cloudflare Workers 兼容性
AutoAnimate 与 Cloudflare Workers Static Assets 完全兼容:
✅ 仅在客户端运行 - 在浏览器中运行,不在 Worker 运行时中运行 ✅ 无 Node.js 依赖项 - 纯浏览器代码 ✅ 适合边缘环境 - 压缩后为 3.28 KB ✅ 兼容 SSR - 使用动态导入(参见 templates/)
Vite 配置:
export default defineConfig({
plugins: [react(), cloudflare()],
ssr: {
external: ["@formkit/auto-animate"],
},
});
无障碍
AutoAnimate 会自动遵循 prefers-reduced-motion:
/* User's system preference */
@media (prefers-reduced-motion: reduce) {
/* AutoAnimate disables animations automatically */
}
重要:切勿设置 disrespectUserMotionPreference: true,这会破坏无障碍体验。
官方文档
- 官方网站:https://auto-animate.formkit.com
- GitHub:https://github.com/formkit/auto-animate
- npm:https://www.npmjs.com/package/@formkit/auto-animate
- React 文档:https://auto-animate.formkit.com/react
- 视频教程:Laracasts 视频(参见 README)
软件包版本(已于 2026-08-03 验证)
{
"dependencies": {
"@formkit/auto-animate": "^0.10.0"
},
"devDependencies": {
"react": "^19.2.0",
"vite": "^7.3.0"
}
}
生产环境示例
此技能基于生产环境测试:
- 包体积:压缩后为 3.28 KB
- 设置时间:2 分钟(使用 Motion 则需 15 分钟)
- 错误:0(已避免所有 10 个已知问题)
- 验证结果:✅ 兼容 Vite、Tailwind v4、Cloudflare Workers、React 19
已测试场景:
- ✅ 筛选/排序列表
- ✅ 手风琴组件
- ✅ Toast 通知
- ✅ 表单验证消息
- ✅ SSR/Cloudflare Workers
- ✅ 无障碍(prefers-reduced-motion)
故障排除
问题:动画无法正常运行
解决方案:检查以下常见问题:
- 父元素是否始终在 DOM 中?(而非有条件地渲染)
- 项目是否具有唯一且稳定的键?
- ref 是否附加到动画子元素的直接父元素上?
问题:SSR/Next.js 出错
解决方案:使用动态导入:
useEffect(() => {
if (typeof window !== "undefined") {
import("@formkit/auto-animate").then(({ default: autoAnimate }) => {
autoAnimate(parent);
});
}
}, [parent]);
问题:项目闪现而非动画显示
解决方案:添加唯一键:key={item.id},而非 key={index}
问题:Flexbox 宽度问题
解决方案:使用明确的宽度,而非 flex-grow: 1
问题:表格行不播放动画
解决方案:将 ref 应用于 <tbody>,而非单个 <tr> 元素
完整设置检查清单
- 已安装
@formkit/[email protected] - 正在使用 React 19+(或 Vue/Svelte)
- 已为父元素添加 ref
- 父元素始终处于渲染状态(非条件渲染)
- 列表项具有唯一且稳定的键
- 已使用
prefers-reduced-motion测试 - 使用 Cloudflare Workers/Next.js 时确保 SSR 安全
- 没有 Flexbox 宽度问题
- 开发服务器运行无错误
- 生产构建成功
有问题?遇到故障?
- 查看
templates/中的可运行示例 - 查看
references/auto-animate-vs-motion.md,了解库对比 - 查看
references/ssr-patterns.md,了解 SSR 变通方案 - 查看官方文档:https://auto-animate.formkit.com
- 查看 GitHub 问题:https://github.com/formkit/auto-animate/issues
已可用于生产环境? ✅ 是 — 13.6k 星,积极维护,零依赖。