mcpField
A
auto-animate

auto-animate

github.com/secondsky设计与 UI240245 次安装5 周前更新
代码仓库

关于 auto-animate

面向前端开发者的 AutoAnimate 使用技能,介绍如何为 React、Vue、Svelte 和原生 JavaScript 界面添加元素变化动画,并提供 SSR 与常见问题处理示例。

主要功能

  1. 01为增删和排序添加动画
  2. 02支持 React、Vue、Svelte 与原生 JS
  3. 03提供 SSR 安全用法
  4. 04尊重减少动态效果偏好
  5. 05附带组件模板与故障排查

适用场景

  1. 01制作列表筛选和排序动画
  2. 02为手风琴展开添加过渡
  3. 03让通知消息淡入淡出
  4. 04动画显示表单校验提示

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/secondsky/claude-skills --skill auto-animate

安装后在 Claude Code 中输入/auto-animate确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

assets/
example-template.txt
references/
auto-animate-vs-motion.md
css-conflicts.md
example-reference.md
ssr-patterns.md
scripts/
example-script.sh
init-auto-animate.sh
templates/
accordion.tsx
filter-sort-list.tsx
form-validation.tsx
react-basic.tsx
react-typescript.tsx
toast-notifications.tsx
vite-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,这会破坏无障碍体验。


官方文档


软件包版本(已于 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)

故障排除

问题:动画无法正常运行

解决方案:检查以下常见问题:

  1. 父元素是否始终在 DOM 中?(而非有条件地渲染)
  2. 项目是否具有唯一且稳定的键?
  3. 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 宽度问题
  • 开发服务器运行无错误
  • 生产构建成功

有问题?遇到故障?

  1. 查看 templates/ 中的可运行示例
  2. 查看 references/auto-animate-vs-motion.md,了解库对比
  3. 查看 references/ssr-patterns.md,了解 SSR 变通方案
  4. 查看官方文档:https://auto-animate.formkit.com
  5. 查看 GitHub 问题:https://github.com/formkit/auto-animate/issues

已可用于生产环境? ✅ 是 — 13.6k 星,积极维护,零依赖。

评论

支持 Markdown