0Pricing
React Academy · 课时

使用 use-gesture 实现手势驱动动画

将 react-spring 与 @use-gesture/react 结合,构建由拖动、捏合和滚动驱动的动画

使用 use-gesture 实现手势驱动动画 是 CoddyKit 上的免费 React Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

@use-gesture/react 概览

@use-gesture/react 是一个手势识别库,旨在与 react-spring 无缝协作。它可以识别拖动、捏合、滚动、悬停、移动和滚轮手势,并提供经过规范化的手势状态,您可以将其直接传入弹簧设置函数,以实现流畅、基于物理效果的交互。

useDrag 手势状态

useDrag 钩子会在每次拖动事件发生时触发回调。该回调会接收一个手势状态对象,其中包含以下关键属性:位移(从拖动开始位置算起的总位移)、速度(当前速度)、方向(每个轴为 1 或 -1)、首次(拖动开始时为 true)、最后一次(拖动结束时为 true)以及事件(原始 DOM 事件)。

bind() 函数

所有 use-gesture 钩子都会返回一个 bind() 函数。调用 bind() 会返回一个事件处理器属性对象(onPointerDown、onTouchStart 等),您可以将其展开到要设为可交互的元素上。这是手势识别器与您的 DOM 元素之间的连接点。

将 useDrag 与 react-spring 结合

标准模式是:使用命令式 API 创建一个弹簧([springs, api] = useSpring(...)),然后使用 useDrag 在每次拖动事件中调用 api.start({ x: movement[0], y: movement[1] })。弹簧会平滑地跟随拖动位移,为原本僵硬的光标跟随效果增添自然的物理感。

释放时弹回

拖动结束时(手势状态中的 last: true),通常需要将元素弹回原始位置。在 if (last) 检查中调用 api.start({ x: 0, y: 0 })。react-spring 会通过弹簧物理效果将元素平滑地弹回——产生轻柔的回弹,而不是瞬间重置——让交互具有令人满意的真实感。

利用速度实现投掷与甩出

手势状态中的 velocity 值可以实现投掷效果。当用户以较高速度释放时,您可以让元素沿拖动方向甩出,而不是将其弹回。请检查 if (last && velocity[0] > threshold),然后将元素动画移动到最终的屏幕外位置。这对于滑动关闭交互至关重要。

拖动边界与限制

要将拖动限制在容器内部,请先限制位移值,再将其传递给弹簧:x: Math.max(-maxX, Math.min(maxX, movement[0]))。或者,使用 use-gesture 内置的 bounds 选项:useDrag(handler, { bounds: { left: -100, right: 100 } }),自动限制手势状态。

滑动关闭模式

移动端滑动关闭的实现方式是:使用 useDrag 跟踪水平方向的位移。如果用户释放时的速度高于阈值,OR 移动距离超过屏幕宽度的一半,就将卡片动画移动到屏幕外(api.start({ x: window.innerWidth })),然后将其从列表中移除。否则,将卡片弹回中心位置。

使用 usePinch 实现缩放交互

usePinch 可以识别触摸屏上的双指捏合手势,以及桌面端的 Ctrl+滚轮操作。手势状态包含 scale(相对于捏合开始时的当前缩放级别)和 origin(捏合的中心点)。将其连接到跟踪缩放比例的弹簧,即可在图像或地图上创建平滑且有边界的缩放交互。

useHover 与 useMove

useHover 会在指针进入或离开元素时触发,并提供一个 active 布尔值。useMove 会跟踪元素内的鼠标位置,并提供规范化坐标。两者都适合实现磁性悬停效果,让元素在光标靠近时轻微地向光标方向移动。

组合多个手势

use-gesture 钩子可以组合使用。您可以在同一个元素上同时使用 useDrag 和 usePinch:const bindDrag = useDrag(...); const bindPinch = usePinch(...),然后展开两个绑定函数:...bindDrag() ...bindPinch()。use-gesture 会自动区分不同的手势类型。

bind() 函数的用途

use-gesture 钩子返回的 bind() 函数有什么作用?

课程回顾:use-gesture 集成

@use-gesture/react 提供 useDrag、usePinch、useScroll、useHover 和 useMove。每个钩子都会返回一个 bind() 函数,其展开结果会将手势事件连接到 DOM 元素。手势状态提供位移、速度、方向、首次和最后一次等信息。将其与 react-spring 的命令式 api.start() 结合,可实现基于物理效果的交互动画。使用速度实现甩出或关闭,并使用边界限制移动范围。

常见问题解答

「使用 use-gesture 实现手势驱动动画」课时是免费的吗?

是的 — 「使用 use-gesture 实现手势驱动动画」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「使用 use-gesture 实现手势驱动动画」这节课中我会学到什么?

将 react-spring 与 @use-gesture/react 结合,构建由拖动、捏合和滚动驱动的动画 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「使用 use-gesture 实现手势驱动动画」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 React Academy 课中编写并运行代码吗?

能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. React Spring 基础:useSpring 钩子
  2. 动画组件与样式插值
  3. 使用 useTrail 和 useChain 实现序列动画
  4. 使用 use-gesture 实现手势驱动动画
← 返回 React Academy