跳到主要内容
VibeStacks
工具条目首选

Motion

React 里最常用的动画库:用声明式的属性写进入、退出、布局变化和手势动画。

最后审阅
适用版本
Motion 14

适合

  • 元素进入与离开、列表重排、布局变化、拖拽和手势
  • 想让界面“有手感”,但不想手写时间轴和插值的 React 项目
  • 需要统一处理“减少动态效果”偏好的项目

不适合

  • 简单的悬停、颜色过渡(一行 CSS transition 就够了)
  • 复杂的时间轴编排和滚动叙事(可以考虑专门的时间轴动画库)

Motion(前身是 Framer Motion)让你把动画写成组件属性:initial 是起点,animate 是终点,exit 是离开时的样子。它负责插值、弹簧物理和中途打断,你只描述状态。

为什么是首选

  • 声明式,AI 写得准。 动画就是几个属性,AI 很少写错;比起手写 requestAnimationFrame,可读性也高得多。
  • 离开动画和布局动画。 AnimatePresence 让元素在卸载前播完离开动画;layout 属性让元素在位置或尺寸变化时平滑过渡——这两样用 CSS 很难做好。
  • 默认就用合适的物理。 弹簧动画可以被中途打断而不跳变,交互感更自然。
  • 尊重用户设置。 用 MotionConfig 的 reducedMotion="user" 就能跟随系统的“减少动态效果”偏好。

上手

pnpm add motion
import { motion } from 'motion/react';

export function Toast({ message }: { message: string }) {
  return (
    <motion.div initial={{ opacity: 0, y: 8 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0 }}>
      {message}
    </motion.div>
  );
}

需要知道的取舍

动画不是越多越好。给 AI 立规矩(见纪念品):只动画 transform 和 opacity、时长保持短、每个动画都要有目的。

纪念品

带走给你的 AI

把这份 AGENTS.md 放进项目,或直接粘贴给 AI 编程助手。

AGENTS.md
# AGENTS.md(动效部分)

## 工具
- 进入 / 离开 / 布局 / 手势动画用 Motion(`import { motion } from 'motion/react'`)。
- 简单的悬停和颜色变化用 CSS transition,不引入 Motion。

## 规则
- 只动画 `transform`(位移、缩放、旋转)和 `opacity`;不要动画宽高、边距、`top/left`。
- 界面反馈类动画时长 150–300ms;不要让用户等动画结束才能操作。
- 每个动画都要有目的:说明状态变化、引导注意力或表达空间关系。不确定时就不加。
- 在应用根部包一层 `<MotionConfig reducedMotion="user">`,跟随系统“减少动态效果”偏好。
- 列表项的离开动画放在 `<AnimatePresence>` 里,并给每项稳定的 `key`。
  • 主题文章

    功能组件与展示组件

    功能组件解决“能不能用”——表单、弹窗、菜单;展示组件解决“好不好看”——3D、动效、视觉风格。两类组件的选法完全不同。

  • 工具条目首选

    three.js

    Web 3D 的事实标准。在 React 里配合 React Three Fiber,用组件的方式写场景。

  • 工具条目首选

    shadcn/ui

    不是组件库,而是一套“复制进你仓库”的组件源码:可访问性交给经过验证的原语,外观用 Tailwind 随意改。