文档

文档

React

手势

手势

Motion 通过一套简单而强大的 UI 手势扩展了 React 的基本事件监听器集合。

motion 组件目前支持 hovertappandraginView

每个手势都有一组事件监听器和一个 while- 动画属性。

动画属性

motion 组件提供多种手势动画属性:whileHoverwhileTapwhileFocuswhileDragwhileInView。 这些可以定义动画目标,以便在手势活动时临时动画到这些目标。

<motion.button
  whileHover={{
    scale: 1.2,
    transition: { duration: 1 },
  }}
  whileTap={{ scale: 0.9 }}
/>

所有属性都可以设置为要动画到的值的目标,或者通过 variants 属性定义的任何变体的名称。 变体将像往常一样向下传递给子组件。

<motion.button
  whileTap="tap"
  whileHover="hover"
  variants={buttonVariants}
>
  <svg>
    <motion.path variants={iconVariants} />
  </svg>
</motion.button>

手势

Hover

hover 手势检测指针何时悬停在组件上方或离开组件。

它与 onMouseEnteronMouseLeave 的不同之处在于,hover 保证仅在实际鼠标事件发生时触发(而不是浏览器生成的模拟触摸输入的鼠标事件)。

<motion.a
  whileHover={{ scale: 1.2 }}
  onHoverStart={event => {}}
  onHoverEnd={event => {}}
/>

Tap

tap 手势检测 主指针(如鼠标左键单击或第一个触摸点)在同一组件上按下并释放。

<motion.button whileTap={{ scale: 0.9, rotate: 3 }} />

当 tap 或单击在开始的同一组件上结束时,它将触发 tap 事件;如果 tap 或单击在组件外部结束,则触发 tapCancel 事件。

如果可点击的组件是可拖动组件的子组件,则如果指针在手势期间移动超过 3 像素,它将自动取消 tap 手势。

可访问性

具有 tap 事件的元素是键盘可访问的。

任何具有 tap 属性的元素都能够接收焦点,并且可以使用 Enter 键在聚焦的元素上触发 tap 事件。

  • 按下 Enter 键将触发 onTapStartwhileTap

  • 释放 Enter 键将触发 onTap

  • 如果元素在 Enter 键释放之前失去焦点,则会触发 onTapCancel

Pan

pan 手势识别指针何时在组件上按下并移动超过 3 像素。 当指针释放时,pan 手势结束。

<motion.div onPan={(e, pointInfo) => {}} />

Pan 目前没有相关的 while- 属性。

注意: 为了使 pan 手势与触摸输入正确配合使用,元素需要禁用 x/y 轴或两个轴上的触摸滚动,使用 touch-action CSS 规则。

Drag

drag 手势将指针移动应用于组件的 x 和/或 y 轴。

<motion.div drag whileDrag={{ scale: 1.2, backgroundColor: "#f00" }} />

默认情况下,当拖拽结束时,元素将使用结束速度执行惯性动画。

这可以通过将 dragMomentum 设置为 false 来禁用,或者通过 dragTransition 属性来更改。

约束

还可以设置 dragConstraints,可以是一个对象,其中包含以像素为单位的 topleftrightbottom 值。

<motion.div
  drag="x"
  dragConstraints={{ left: 0, right: 300 }}
/>

或者,它可以接受对另一个使用 React 的 useRef hook 创建的组件的 ref。 此 ref 应该同时传递给可拖动组件的 dragConstraints 属性,以及您要用作约束的组件的 ref

const MyComponent = () => {
  const constraintsRef = useRef(null)

  return (
     <motion.div ref={constraintsRef}>
         <motion.div drag dragConstraints={constraintsRef} />
     </motion.div>
  )
}

默认情况下,将元素拖动到约束之外会产生一定的弹性。 这可以通过将 dragElastic 设置为介于 01 之间的值来更改,其中 0 等于无运动,1 等于约束外的完全运动。

方向锁定

可以通过设置 dragDirectionLock 将元素锁定到其拖动的第一个轴。

<motion.div
  drag
  dragDirectionLock
  onDirectionLock={callback}
/>

每次拖拽手势开始时,都会检测指针移动的方向,并且该元素将仅在此轴上可拖动。

Focus

focus 手势按照与以下相同的规则检测组件何时获得或失去焦点CSS :focus-visible 选择器.

通常,这是指 input 以任何方式接收焦点时,以及其他元素通过可访问的方式(例如通过键盘导航)接收焦点时。

<motion.a whileFocus={{ scale: 1.2 }} href="#" />

事件传播

子组件可以使用 Capture React 属性阻止指针事件传播到父 motion 组件。

例如,子组件可以通过将 e.stopPropagation() 传递给 onPointerDownCapture 来阻止拖拽和 tap 手势及其相关的 while 动画在父组件上触发。

<motion.div whileTap={{ scale: 2 }}>
  <button onPointerDownCapture={e => e.stopPropagation()} />
</motion.div>

注意:SVG 滤镜

手势在 SVG filter 组件上无法识别,因为这些元素没有物理存在,因此不接收事件。

相反,您可以将 while- 属性和事件处理程序添加到父组件,并使用变体来动画这些元素。

const MyComponent = () => {
  return (
    <motion.svg whileHover="hover">
      <filter id="blur">
        <motion.feGaussianBlur
          stdDeviation={0}
          variants={{ hover: { stdDeviation: 2 } }}
        />
      </filter>
    </motion.svg>
  )
}

Motion 通过一套简单而强大的 UI 手势扩展了 React 的基本事件监听器集合。

motion 组件目前支持 hovertappandraginView

每个手势都有一组事件监听器和一个 while- 动画属性。

动画属性

motion 组件提供多种手势动画属性:whileHoverwhileTapwhileFocuswhileDragwhileInView。 这些可以定义动画目标,以便在手势活动时临时动画到这些目标。

<motion.button
  whileHover={{
    scale: 1.2,
    transition: { duration: 1 },
  }}
  whileTap={{ scale: 0.9 }}
/>

所有属性都可以设置为要动画到的值的目标,或者通过 variants 属性定义的任何变体的名称。 变体将像往常一样向下传递给子组件。

<motion.button
  whileTap="tap"
  whileHover="hover"
  variants={buttonVariants}
>
  <svg>
    <motion.path variants={iconVariants} />
  </svg>
</motion.button>

手势

Hover

hover 手势检测指针何时悬停在组件上方或离开组件。

它与 onMouseEnteronMouseLeave 的不同之处在于,hover 保证仅在实际鼠标事件发生时触发(而不是浏览器生成的模拟触摸输入的鼠标事件)。

<motion.a
  whileHover={{ scale: 1.2 }}
  onHoverStart={event => {}}
  onHoverEnd={event => {}}
/>

Tap

tap 手势检测 主指针(如鼠标左键单击或第一个触摸点)在同一组件上按下并释放。

<motion.button whileTap={{ scale: 0.9, rotate: 3 }} />

当 tap 或单击在开始的同一组件上结束时,它将触发 tap 事件;如果 tap 或单击在组件外部结束,则触发 tapCancel 事件。

如果可点击的组件是可拖动组件的子组件,则如果指针在手势期间移动超过 3 像素,它将自动取消 tap 手势。

可访问性

具有 tap 事件的元素是键盘可访问的。

任何具有 tap 属性的元素都能够接收焦点,并且可以使用 Enter 键在聚焦的元素上触发 tap 事件。

  • 按下 Enter 键将触发 onTapStartwhileTap

  • 释放 Enter 键将触发 onTap

  • 如果元素在 Enter 键释放之前失去焦点,则会触发 onTapCancel

Pan

pan 手势识别指针何时在组件上按下并移动超过 3 像素。 当指针释放时,pan 手势结束。

<motion.div onPan={(e, pointInfo) => {}} />

Pan 目前没有相关的 while- 属性。

注意: 为了使 pan 手势与触摸输入正确配合使用,元素需要禁用 x/y 轴或两个轴上的触摸滚动,使用 touch-action CSS 规则。

Drag

drag 手势将指针移动应用于组件的 x 和/或 y 轴。

<motion.div drag whileDrag={{ scale: 1.2, backgroundColor: "#f00" }} />

默认情况下,当拖拽结束时,元素将使用结束速度执行惯性动画。

这可以通过将 dragMomentum 设置为 false 来禁用,或者通过 dragTransition 属性来更改。

约束

还可以设置 dragConstraints,可以是一个对象,其中包含以像素为单位的 topleftrightbottom 值。

<motion.div
  drag="x"
  dragConstraints={{ left: 0, right: 300 }}
/>

或者,它可以接受对另一个使用 React 的 useRef hook 创建的组件的 ref。 此 ref 应该同时传递给可拖动组件的 dragConstraints 属性,以及您要用作约束的组件的 ref

const MyComponent = () => {
  const constraintsRef = useRef(null)

  return (
     <motion.div ref={constraintsRef}>
         <motion.div drag dragConstraints={constraintsRef} />
     </motion.div>
  )
}

默认情况下,将元素拖动到约束之外会产生一定的弹性。 这可以通过将 dragElastic 设置为介于 01 之间的值来更改,其中 0 等于无运动,1 等于约束外的完全运动。

方向锁定

可以通过设置 dragDirectionLock 将元素锁定到其拖动的第一个轴。

<motion.div
  drag
  dragDirectionLock
  onDirectionLock={callback}
/>

每次拖拽手势开始时,都会检测指针移动的方向,并且该元素将仅在此轴上可拖动。

Focus

focus 手势按照与以下相同的规则检测组件何时获得或失去焦点CSS :focus-visible 选择器.

通常,这是指 input 以任何方式接收焦点时,以及其他元素通过可访问的方式(例如通过键盘导航)接收焦点时。

<motion.a whileFocus={{ scale: 1.2 }} href="#" />

事件传播

子组件可以使用 Capture React 属性阻止指针事件传播到父 motion 组件。

例如,子组件可以通过将 e.stopPropagation() 传递给 onPointerDownCapture 来阻止拖拽和 tap 手势及其相关的 while 动画在父组件上触发。

<motion.div whileTap={{ scale: 2 }}>
  <button onPointerDownCapture={e => e.stopPropagation()} />
</motion.div>

注意:SVG 滤镜

手势在 SVG filter 组件上无法识别,因为这些元素没有物理存在,因此不接收事件。

相反,您可以将 while- 属性和事件处理程序添加到父组件,并使用变体来动画这些元素。

const MyComponent = () => {
  return (
    <motion.svg whileHover="hover">
      <filter id="blur">
        <motion.feGaussianBlur
          stdDeviation={0}
          variants={{ hover: { stdDeviation: 2 } }}
        />
      </filter>
    </motion.svg>
  )
}

Motion 通过一套简单而强大的 UI 手势扩展了 React 的基本事件监听器集合。

motion 组件目前支持 hovertappandraginView

每个手势都有一组事件监听器和一个 while- 动画属性。

动画属性

motion 组件提供多种手势动画属性:whileHoverwhileTapwhileFocuswhileDragwhileInView。 这些可以定义动画目标,以便在手势活动时临时动画到这些目标。

<motion.button
  whileHover={{
    scale: 1.2,
    transition: { duration: 1 },
  }}
  whileTap={{ scale: 0.9 }}
/>

所有属性都可以设置为要动画到的值的目标,或者通过 variants 属性定义的任何变体的名称。 变体将像往常一样向下传递给子组件。

<motion.button
  whileTap="tap"
  whileHover="hover"
  variants={buttonVariants}
>
  <svg>
    <motion.path variants={iconVariants} />
  </svg>
</motion.button>

手势

Hover

hover 手势检测指针何时悬停在组件上方或离开组件。

它与 onMouseEnteronMouseLeave 的不同之处在于,hover 保证仅在实际鼠标事件发生时触发(而不是浏览器生成的模拟触摸输入的鼠标事件)。

<motion.a
  whileHover={{ scale: 1.2 }}
  onHoverStart={event => {}}
  onHoverEnd={event => {}}
/>

Tap

tap 手势检测 主指针(如鼠标左键单击或第一个触摸点)在同一组件上按下并释放。

<motion.button whileTap={{ scale: 0.9, rotate: 3 }} />

当 tap 或单击在开始的同一组件上结束时,它将触发 tap 事件;如果 tap 或单击在组件外部结束,则触发 tapCancel 事件。

如果可点击的组件是可拖动组件的子组件,则如果指针在手势期间移动超过 3 像素,它将自动取消 tap 手势。

可访问性

具有 tap 事件的元素是键盘可访问的。

任何具有 tap 属性的元素都能够接收焦点,并且可以使用 Enter 键在聚焦的元素上触发 tap 事件。

  • 按下 Enter 键将触发 onTapStartwhileTap

  • 释放 Enter 键将触发 onTap

  • 如果元素在 Enter 键释放之前失去焦点,则会触发 onTapCancel

Pan

pan 手势识别指针何时在组件上按下并移动超过 3 像素。 当指针释放时,pan 手势结束。

<motion.div onPan={(e, pointInfo) => {}} />

Pan 目前没有相关的 while- 属性。

注意: 为了使 pan 手势与触摸输入正确配合使用,元素需要禁用 x/y 轴或两个轴上的触摸滚动,使用 touch-action CSS 规则。

Drag

drag 手势将指针移动应用于组件的 x 和/或 y 轴。

<motion.div drag whileDrag={{ scale: 1.2, backgroundColor: "#f00" }} />

默认情况下,当拖拽结束时,元素将使用结束速度执行惯性动画。

这可以通过将 dragMomentum 设置为 false 来禁用,或者通过 dragTransition 属性来更改。

约束

还可以设置 dragConstraints,可以是一个对象,其中包含以像素为单位的 topleftrightbottom 值。

<motion.div
  drag="x"
  dragConstraints={{ left: 0, right: 300 }}
/>

或者,它可以接受对另一个使用 React 的 useRef hook 创建的组件的 ref。 此 ref 应该同时传递给可拖动组件的 dragConstraints 属性,以及您要用作约束的组件的 ref

const MyComponent = () => {
  const constraintsRef = useRef(null)

  return (
     <motion.div ref={constraintsRef}>
         <motion.div drag dragConstraints={constraintsRef} />
     </motion.div>
  )
}

默认情况下,将元素拖动到约束之外会产生一定的弹性。 这可以通过将 dragElastic 设置为介于 01 之间的值来更改,其中 0 等于无运动,1 等于约束外的完全运动。

方向锁定

可以通过设置 dragDirectionLock 将元素锁定到其拖动的第一个轴。

<motion.div
  drag
  dragDirectionLock
  onDirectionLock={callback}
/>

每次拖拽手势开始时,都会检测指针移动的方向,并且该元素将仅在此轴上可拖动。

Focus

focus 手势按照与以下相同的规则检测组件何时获得或失去焦点CSS :focus-visible 选择器.

通常,这是指 input 以任何方式接收焦点时,以及其他元素通过可访问的方式(例如通过键盘导航)接收焦点时。

<motion.a whileFocus={{ scale: 1.2 }} href="#" />

事件传播

子组件可以使用 Capture React 属性阻止指针事件传播到父 motion 组件。

例如,子组件可以通过将 e.stopPropagation() 传递给 onPointerDownCapture 来阻止拖拽和 tap 手势及其相关的 while 动画在父组件上触发。

<motion.div whileTap={{ scale: 2 }}>
  <button onPointerDownCapture={e => e.stopPropagation()} />
</motion.div>

注意:SVG 滤镜

手势在 SVG filter 组件上无法识别,因为这些元素没有物理存在,因此不接收事件。

相反,您可以将 while- 属性和事件处理程序添加到父组件,并使用变体来动画这些元素。

const MyComponent = () => {
  return (
    <motion.svg whileHover="hover">
      <filter id="blur">
        <motion.feGaussianBlur
          stdDeviation={0}
          variants={{ hover: { stdDeviation: 2 } }}
        />
      </filter>
    </motion.svg>
  )
}

手势

示例

超越基础

Motion+是一次性费用,终身会员资格。

除了高级 Motion 功能、抢先体验内容和私人 Discord 社区外,您还将解锁访问 90 多个高级示例的源代码的权限,这些示例将此页面上的 API 提升到一个新的水平。

加载中...
加载中...
保持关注

订阅以获取最新消息和更新。

保持关注

订阅以获取最新消息和更新。