关于 animate
animate 是为 Next.js 和 React 应用提供动画实现指导的技能,面向前端开发者。内容涵盖 CSS 动画、Framer Motion、缓动、性能与无障碍,并提供常见动效模式和参考资料。
主要功能
- 01CSS 动画与过渡建议
- 02Framer Motion 使用指导
- 03缓动与时长参考
- 04性能和无障碍注意事项
- 05常见交互动画模式
适用场景
- 01为界面元素添加悬停效果
- 02实现组件进入与退出动画
- 03制作布局或共享元素过渡
- 04选择滚动或拖拽动画方案
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ delphi-ai/ animate-skill --skill animate安装后在 Claude Code 中输入/animate确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdexamples/card-hover.tsxanimate-height.tsxtoast-stacking.tsxtext-reveal.tsxshared-layout.tsxapp-store-card.tsxmulti-step-flow.tsxfeedback-popover.tsxreferences/css-animations.mdframer-motion.mdeasing-and-timing.mdperformance-accessibility.md详细介绍
Next.js 动画
概述
此技能提供了在 Next.js 和 React 应用中实现流畅、高性能且易于访问的动画的全面指南。内容涵盖 CSS 动画、Framer Motion、缓动原则和无障碍注意事项。
快速参考
缓动速查表
| 动画类型 | 缓动方式 | 时长 |
|---|---|---|
| 元素进入 | ease-out | 200-300ms |
| 元素在屏幕上移动 | ease-in-out | 200-300ms |
| 元素退出 | ease-in | 150-200ms |
| 悬停效果 | ease | 150ms |
| 仅透明度变化 | linear | 不固定 |
CSS 自定义属性(推荐)
:root {
--ease-out-quint: cubic-bezier(.23, 1, .32, 1);
--ease-in-out-cubic: cubic-bezier(.645, .045, .355, 1);
--ease-out-cubic: cubic-bezier(.33, 1, .68, 1);
}
常见动画模式
1. 悬停上浮效果
.card {
transition: transform 200ms var(--ease-out-quint),
box-shadow 200ms var(--ease-out-quint);
}
.card:hover {
transform: translateY(-4px);
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15);
}
2. 按钮按压效果
.button {
transition: transform 100ms ease-out;
}
.button:active {
transform: scale(0.97);
}
3. 挂载时淡入(Framer Motion)
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.3, ease: [.23, 1, .32, 1] }}
>
Content
</motion.div>
4. 带退出动画的模态框
<AnimatePresence>
{isOpen && (
<motion.div
initial={{ opacity: 0, scale: 0.95 }}
animate={{ opacity: 1, scale: 1 }}
exit={{ opacity: 0, scale: 0.95 }}
transition={{ duration: 0.2, ease: "easeOut" }}
>
{children}
</motion.div>
)}
</AnimatePresence>
5. 标签页指示器(共享布局)
{tabs.map(tab => (
<button key={tab} onClick={() => setActive(tab)} className="relative px-4 py-2">
{tab}
{active === tab && (
<motion.div
layoutId="tab-indicator"
className="absolute inset-0 bg-blue-500 rounded -z-10"
transition={{ type: "spring", stiffness: 400, damping: 30 }}
/>
)}
</button>
))}
6. 列表交错动画
const container = {
hidden: { opacity: 0 },
visible: {
opacity: 1,
transition: { staggerChildren: 0.1 }
}
}
const item = {
hidden: { opacity: 0, y: 20 },
visible: { opacity: 1, y: 0 }
}
<motion.ul variants={container} initial="hidden" animate="visible">
{items.map(i => <motion.li key={i} variants={item}>{i}</motion.li>)}
</motion.ul>
黄金法则
- 退出速度快于进入:退出动画的时长应为进入动画的约 75%
- 只为 transform 和 opacity 添加动画:它们由 GPU 加速
- 200-300ms 是最佳范围:大多数动画都应在此范围内
- 始终遵循 prefers-reduced-motion:参见参考资料中的无障碍部分
- 对可中断的动画使用弹簧效果:用户中断动画时,能带来更好的体验
示例
课程中的完整可运行示例位于 examples/ 目录中:
| 示例 | 描述 | 关键技术 |
|---|---|---|
card-hover.tsx | 悬停时向上滑出的描述 | CSS 过渡、transform、opacity |
toast-stacking.tsx | 动画提示通知 | CSS 自定义属性、data-* 触发器 |
text-reveal.tsx | 字母交错动画 | @keyframes、animation-delay、calc() |
shared-layout.tsx | 元素位置/尺寸变形 | Framer Motion layoutId |
animate-height.tsx | 平滑改变高度 | useMeasure、动画高度 |
multi-step-flow.tsx | 定向步骤向导 | AnimatePresence、自定义变体 |
feedback-popover.tsx | 按钮展开为弹出框 | 嵌套 layoutId、表单状态 |
app-store-card.tsx | iOS 风格卡片展开 | 多个 layoutId 元素 |
如需使用示例,请通过以下命令阅读:Read examples/<name>.tsx
参考资料
如需详细文档,请阅读以下参考文件:
references/easing-and-timing.md- 缓动函数、计时指南、弹簧配置references/css-animations.md- 变换、过渡、关键帧、clip-pathreferences/framer-motion.md- Motion 组件、AnimatePresence、变体、布局动画、钩子references/performance-accessibility.md- 60fps 优化、prefers-reduced-motion、无障碍
何时使用哪种方案
| 场景 | 推荐方案 |
|---|---|
| 简单的悬停效果 | CSS 过渡 |
| 进入/退出动画 | Framer Motion + AnimatePresence |
| 布局变化 | Framer Motion layout 属性 |
| 共享元素过渡 | Framer Motion layoutId |
| 与滚动关联的动画 | Framer Motion useScroll |
| 复杂的编排式动画 | Framer Motion 变体 |
| 拖拽交互 | Framer Motion 拖拽手势 |
| 对性能要求严格 | 仅使用 transform 的 CSS |
依赖项
如需运行 Framer Motion 示例,请安装:
pnpm add framer-motion react-use-measure usehooks-ts
评论
支持 Markdown