mcpField
M
motion

motion

github.com/oakoss设计与 UI20147 次安装11 周前更新
代码仓库

关于 motion

Motion 是面向交互界面开发者的 React 动画库,提供声明式 API。它涵盖手势、滚动效果、布局过渡、SVG 绘制和弹簧动画,并提供包体积优化选项。

主要功能

  1. 01声明式 React 动画
  2. 02手势与拖动交互
  3. 03滚动触发及联动效果
  4. 04布局与共享元素过渡
  5. 05SVG 路径动画
  6. 06包体积优化选项

适用场景

  1. 01制作页面与布局过渡动画
  2. 02添加滚动联动效果或视差
  3. 03构建拖动、悬停和点击交互

安装

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

$npx skills add https://github.com/oakoss/agent-skills --skill motion

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

包含的文件

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

references/
accessibility-css.md
core-patterns.md
library-selection.md
nextjs-integration.md
performance.md
scroll-animations.md
troubleshooting.md

详细介绍

Motion

概述

Motion(包:motion,前身为 framer-motion)是标准的 React 动画库。请从 motion/react 导入。它提供用于手势、滚动联动动画、布局过渡、SVG 路径绘制和弹簧物理效果的声明式属性。它采用混合动画引擎(变换和不透明度使用 WAAPI,滚动联动效果使用 ScrollTimeline)。包体积范围为 2.3 KB(useAnimate mini)到 34 KB(完整版本),使用 LazyMotion 可优化至 4.6 KB。兼容 React 18.2+、React 19、Next.js App Router 和 Vite。

对于简单的列表添加/移除动画,请勿使用 Motion(改用 AutoAnimate,体积仅 3.28 KB)。请勿用于 3D(改用 Three.js / React Three Fiber)。

快速参考

模式API/属性
挂载时淡入initial、animate、transition
退出动画AnimatePresence + exit 属性(必须有唯一的 key)
交错列表使用 staggerChildren 的 variants
悬停/点击/聚焦whileHover、whileTap、whileFocus
拖拽drag、dragConstraints、dragElastic
滚动触发whileInView、viewport={{ once: true }}
滚动联动/视差useScroll + useTransform
进度指示器scrollYProgress + scaleX
布局动画layout 属性(FLIP 技术)
共享元素layoutId(不同视图间使用相同 ID)
布局组用 LayoutGroup 包裹同级列表
页面过渡AnimatePresence + key={pathname}
SVG 路径绘制在 motion.path 上使用 pathLength
动画计数器useSpring + useTransform
命令式控制useAnimate Hook 返回 [scope, animate]
自定义组件motion.create(Component) 包装任意组件
优化包体积LazyMotion + domAnimation + m 组件(4.6 KB)
减少动态效果MotionConfig reducedMotion="user"

常见错误

错误正确做法
在条件语句中使用 AnimatePresence保持 AnimatePresence 挂载;将条件内容放在其中
AnimatePresence 子元素缺少唯一的 key为每个直接子元素添加唯一的 key,以实现退出动画
Motion 动画属性与 Tailwind transition-* 类同时使用移除 Tailwind 过渡类,避免动画卡顿
从 framer-motion 导入使用 import { motion } from "motion/react"(于 2024 年末更名)
未进行虚拟化就为 50 个以上的项目添加动画对大型列表使用 react-window 或 @tanstack/react-virtual
简单动画也使用完整的 34 KB 包使用 LazyMotion + domAnimation(4.6 KB)或 useAnimate(2.3 KB)
Next.js App Router 中缺少 "use client"添加指令或使用 motion/react-client 导入
直接对 width/height 添加动画使用 layout 属性或 transform: scale,以启用 GPU 加速
未处理 prefers-reduced-motion使用 MotionConfig reducedMotion="user" 包裹应用

委派

  • 审核动画性能和打包体积:使用 Explore Agent 查找较大的导入项、缺少的 LazyMotion,以及会触发重排的属性
  • 构建复杂的多步骤动画:使用 Task Agent 实现滚动联动视差、共享布局过渡和交错序列
  • 为新项目规划动画架构:使用 Plan Agent 根据需求评估 Motion、AutoAnimate 或纯 CSS 方案

如果有 design-system 技能,请将动画令牌定义和动态设计指南委派给它。

参考资料

  • 核心模式 -- 动画模式:淡入、退出、交错、手势、模态框、手风琴、标签页、滚动、布局、拖动、SVG、加载
  • 滚动动画 -- useScroll、useTransform、滚动触发、视差、进度指示器、偏移配置
  • 性能 -- LazyMotion、useAnimate、硬件加速、虚拟化、生产环境检查清单
  • Next.js 集成 -- App Router 模式、motion/react-client、Pages Router、已知问题
  • 无障碍与 CSS -- prefers-reduced-motion、MotionConfig、useReducedMotion、CSS 关键帧、Tailwind 动画
  • 库选择指南 -- Motion 与 AutoAnimate 的决策指南,包含功能比较和使用场景建议
  • 故障排除 -- AnimatePresence 错误、Tailwind 冲突、布局异常、React 19 问题、命名迁移

评论

支持 Markdown