Amicro动效Hooks进阶指南:use-stagger、use-scroll-progress与use-web-haptics让动画更自然
【免费下载链接】Amicro--Micro-transitions-项目地址: https://gitcode.com/gh_mirrors/am/Amicro--Micro-transitions-
Amicro是一个基于 Motion 的 React 微交互与过渡动画组件库,内置了一组开箱即用的动效 Hooks:use-stagger负责列表错峰进场、use-scroll-progress实时追踪滚动进度、use-web-haptics为交互添加触觉振动反馈。掌握这 3 个 Hook,你的页面动画会从"生硬的同步切换"升级为"有节奏、有反馈"的自然体验。
3 个动效 Hook 各解决什么问题?
Amicro 把动效能力拆成了「组件 + Hooks」两层:组件负责视觉呈现,Hooks 负责计算与事件。这 3 个 Hook 都放在 registry/hooks/ 目录下,零依赖、可直接复制进任何 React / Next.js / Vite 项目。
| Hook | 一句话定位 | 典型场景 |
|---|---|---|
use-stagger | 批量计算子元素的动画延迟 | 卡片列表逐个进场 |
use-scroll-progress | 返回 0~1 的实时滚动进度 | 顶部进度条、滚动触发动画 |
use-web-haptics | 封装浏览器振动 API | 点赞、切换时的触觉反馈 |
use-stagger:为列表生成自然的"错峰"延迟
整组元素同时淡入总显笨重,而每个元素间隔 50ms 依次入场,节奏感立刻就有了。use-stagger的源码只有几十行(见 use-stagger.ts),接收元素数量和 3 个可选参数:
staggerDelay:相邻元素的间隔秒数,默认0.05,即 50ms 的舒适节奏;baseDelay:整体起始延迟,常用于等接口数据返回后再开始动画;from:动画起点,支持'first'(从头)、'last'(从尾)、'center'(从中心向两侧扩散)或任意数字下标。
返回值是一个延迟数组,直接喂给 Motion 的delay即可:
const delays = useStagger(items.length, { staggerDelay: 0.08, from: 'center' }); {items.map((item, i) => ( <motion.div key={item.id} initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.4, delay: delays[i] }} /> ))}💡 经验值:卡片类列表建议
0.05~0.1s;元素超过 10 个时适当调小,避免总时长过长。
use-scroll-progress:一行代码拿到滚动进度
滚动进度条、"读到一半"提示、随滚动变化的背景……这些都依赖同一个数据:当前滚动百分比。use-scroll-progress.ts 返回一个0~1的浮点数,用法极其简单:
const progress = useScrollProgress(); // 监听整个页面 const pct = Math.round(progress * 100); // 37 表示滚到了 37%几个值得注意的设计细节:
- 支持容器级监听:传入一个元素的
ref,即可追踪卡片、列表等局部容器的滚动,而不只是整页; - 性能友好:内部使用
passive: true注册 scroll 监听,不阻塞滚动线程; - 自动解绑:组件卸载时自动移除监听,不会产生内存泄漏。
配合库内的 progress-indicator.tsx 组件,可以立刻得到一个吸顶滚动进度条;也可以把progress乘到opacity、scale上,做出"滚得越远字越大"之类的联动效果。
use-web-haptics:让点击"有手感"
视觉动画之外,触觉是另一半"反馈"。use-web-haptics封装了浏览器的 Vibration API,把不同强度的振动整理成语义化的类型(见 use-web-haptics.ts):
| 类型 | 振动模式 | 适用场景 |
|---|---|---|
light | 10ms | Tab 切换、轻量点击 |
medium | 25ms | 开关切换 |
heavy | 50ms | 长按、重要操作 |
success | 15 / 60 / 15ms | 点赞、提交成功 |
warning | 30 / 60 / 30ms | 表单提醒 |
error | 60ms × 3 | 操作失败 |
用法就是"取函数、调函数":
const { trigger } = useWebHaptics(); const handleLike = () => { trigger('success'); // 点赞时手机轻轻"叮"一下 setLiked(true); };Amicro 的示例组件里就大量使用了它,比如 AnimatedToggle.tsx 在开关切换时触发medium、点赞按钮触发success(L117)。
两个安心细节:
- 优雅降级:桌面浏览器或 iOS Safari 不支持振动 API 时,
trigger直接返回false,不会报错,动画照常工作; - 异常兜底:内部有
try/catch,API 调用失败只会在控制台打印警告。
30 秒上手:安装与使用步骤
- 确保环境满足:Node.js ≥ 18,React 18 / 19,Tailwind CSS 3 或 4,安装
motion包(依赖要求见 package.json)。 - 复制 Hook 源码:把 use-stagger.ts、use-scroll-progress.ts、use-web-haptics.ts 拷入项目的
hooks/目录即可,三者均无第三方依赖; - 或走 shadcn 注册表:在项目的
components.json中配置@amicro命名空间后,执行npx shadcn add @amicro/use-scroll-progress这类命令即可自动安装(参考 README.md); - 组合使用:用
use-stagger控制进场节奏 → 用use-scroll-progress驱动滚动联动 → 关键点击加use-web-haptics,三层叠加就是完整的"自然感"配方。
避坑清单:常见使用建议
- ⚠️stagger 别设 0:
staggerDelay为 0 时所有元素同帧启动,错峰效果消失; - ⚠️进度条用
Math.round(progress * 100):use-scroll-progress返回的是0~1小数而非百分比,直接渲染会一直是0%; - ⚠️振动只在移动端生效:桌面端拿不到振动效果属正常现象,可结合视觉反馈(缩放、变色)做双通道提示;
- ✅中心扩散最吸睛:
from: 'center'适合 Hero 区的 logo 阵列、跑马灯等对称布局。
相关文件索引
| 文件 | 说明 |
|---|---|
| registry/hooks/use-stagger.ts | 错峰延迟计算 Hook |
| registry/hooks/use-scroll-progress.ts | 滚动进度 Hook(支持容器级) |
| registry/hooks/use-web-haptics.ts | 触觉反馈 Hook |
| src/hooks/useWebHaptics.ts | 站内示例使用的同一实现 |
| registry/ui/scroll/progress-indicator.tsx | 滚动进度条组件 |
| src/components/toggles/AnimatedToggle.tsx | 触觉反馈实战示例 |
掌握这 3 个 Hook 后,再配合库内的 fade-up、scroll-reveal 等过渡组件,就能快速搭出既有节奏感、又有触感的现代 React 界面。
【免费下载链接】Amicro--Micro-transitions-项目地址: https://gitcode.com/gh_mirrors/am/Amicro--Micro-transitions-
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考