☰
Amicro动效Hooks进阶指南:use-stagger、use-scroll-progress与use-web-haptics让动画更自然
2026/10/3 7:04:18 网站建设 项目流程

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):

类型振动模式适用场景
light10msTab 切换、轻量点击
medium25ms开关切换
heavy50ms长按、重要操作
success15 / 60 / 15ms点赞、提交成功
warning30 / 60 / 30ms表单提醒
error60ms × 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 秒上手:安装与使用步骤

  1. 确保环境满足:Node.js ≥ 18,React 18 / 19,Tailwind CSS 3 或 4,安装motion包(依赖要求见 package.json)。
  2. 复制 Hook 源码:把 use-stagger.ts、use-scroll-progress.ts、use-web-haptics.ts 拷入项目的hooks/目录即可,三者均无第三方依赖;
  3. 或走 shadcn 注册表:在项目的components.json中配置@amicro命名空间后,执行npx shadcn add @amicro/use-scroll-progress这类命令即可自动安装(参考 README.md);
  4. 组合使用:用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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询