手势
Motion 通过一套简单而强大的 UI 手势扩展了 Vue 的基本事件监听器集合。
motion 组件目前支持 hover、press、pan、drag 和 inView。
每个手势都有一组事件监听器和一个 while- 动画 prop。
动画 props
motion 组件提供多种手势动画 props:whileHover、whilePress、whileFocus、whileDrag 和 whileInView。 这些可以定义动画目标,以便在手势处于活动状态时临时动画到这些目标。
<motion.button :whileHover="{ scale: 1.2, transition: { duration: 1 }, }" :whilePress="{ scale: 0.9 }" />
所有 props 既可以设置为要动画到的值目标,也可以设置为通过 variants prop 定义的任何变体的名称。 变体将像往常一样向下传递给子组件。
<motion.button whilePress="press" whileHover="hover" :variants="buttonVariants" > <svg> <motion.path :variants="iconVariants" /> </svg> </motion.button>
手势
悬停
悬停手势检测指针何时悬停在组件上方或离开组件。
它与 onMouseEnter 和 onMouseLeave 的不同之处在于,悬停保证仅由实际鼠标事件触发(而不是由触摸输入模拟的浏览器生成的鼠标事件)。
<motion.a :whileHover="{ scale: 1.2 }" @hoverStart="event => {}" @hoverEnd="event => {}"
按下
按下手势检测主指针(如鼠标左键单击或第一个触摸点)在同一组件上按下并释放。
<motion.button :whilePress="{ scale: 0.9, rotate: 3 }" />
当点击或单击在它开始的同一组件上结束时,它将触发 press 事件;如果按下或单击在组件外部结束,则触发 pressCancel 事件。
如果可按压组件是可拖动组件的子组件,则如果指针在手势期间移动超过 3 像素,它将自动取消按下手势。
可访问性
带有按下事件的元素是键盘可访问的。
任何带有 press prop 的元素都将能够接收焦点,并且可以使用 Enter 键在聚焦元素上触发按下事件。
按下
Enter键将触发onPressStart和whilePress释放
Enter键将触发onPress如果元素在
Enter键释放之前失去焦点,则会触发onPressCancel。
平移
平移手势识别指针何时在组件上按下并移动超过 3 像素。 当指针释放时,平移手势结束。
<motion.div @pan="(e, pointInfo) => {}" />
平移目前没有相关的 while- prop。
注意: 为了使平移手势与触摸输入正确配合工作,需要使用 touch-action CSS 规则禁用元素在 x/y 轴或两个轴上的触摸滚动。
拖动
拖动手势将指针移动应用于组件的 x 和/或 y 轴。
<motion.div drag :whileDrag="{ scale: 1.2, backgroundColor: '#f00' }" />
默认情况下,当拖动结束时,元素将使用结束速度执行惯性动画。
可以通过将 dragMomentum 设置为 false 来禁用此功能,或者通过 dragTransition prop 进行更改。
约束
也可以设置 dragConstraints,可以将其设置为具有 top、left、right 和 bottom 值的对象,以像素为单位测量。
<motion.div drag="x" :dragConstraints="{ left: 0, right: 300 }" />
或者,它可以接受 HTMLElement ref 值。 您可以使用 motion-v 中的 useDomRef 获取组件的 DOM ref 值,并将其同时传递给可拖动组件的 dragConstraints prop 和您要用作约束的组件的 ref。
<script setup> import { useDomRef } from "motion-v" const constraintsRef = useDomRef() </script> <template> <motion.div ref="constraintsRef"> <motion.div drag :dragConstraints="constraintsRef" /> </motion.div> </template>
默认情况下,将元素拖动到约束之外会产生一定的弹性。 可以通过将 dragElastic 设置为介于 0 和 1 之间的值来更改此行为,其中 0 等于无运动,1 等于约束之外的完全运动。
方向锁定
可以通过设置 dragDirectionLock 将元素锁定到它被拖动的第一个轴。
<motion.div drag dragDirectionLock @directionLock="callback" />
每次拖动手势开始时,都会检测到指针移动的方向,并且该元素将仅在此轴上可拖动。
焦点
焦点手势检测组件何时获得或失去焦点,其规则与CSS :focus-visible 选择器.
通常,这是指 input 通过任何方式接收焦点,以及其他元素通过可访问的方式(例如通过键盘导航)接收焦点时。
<motion.a :whileFocus="{ scale: 1.2 }" href="#" />
事件传播
子组件可以使用 Capture Vue props 阻止指针事件传播到父 motion 组件。
例如,子组件可以通过将 e.stopPropagation() 传递给 onPointerDownCapture 来阻止拖动和点击手势及其相关的 while 动画在父组件上触发。
<motion.div :whilePress="{ scale: 2 }"> <button @pointerDownCapture="e => e.stopPropagation()" /> </motion.div>
注意:SVG 滤镜
手势在 SVG filter 组件上无法识别,因为这些元素没有物理存在,因此不接收事件。
您可以改为将 while- props 和事件处理程序添加到父组件,并使用变体来动画这些元素。
<template> <motion.svg whileHover="hover"> <filter id="blur"> <motion.feGaussianBlur :stdDeviation="0" :variants="{ hover: { stdDeviation: 2 } }" /> </filter> </motion.svg> </template>
Motion 通过一套简单而强大的 UI 手势扩展了 Vue 的基本事件监听器集合。
motion 组件目前支持 hover、press、pan、drag 和 inView。
每个手势都有一组事件监听器和一个 while- 动画 prop。
动画 props
motion 组件提供多种手势动画 props:whileHover、whilePress、whileFocus、whileDrag 和 whileInView。 这些可以定义动画目标,以便在手势处于活动状态时临时动画到这些目标。
<motion.button :whileHover="{ scale: 1.2, transition: { duration: 1 }, }" :whilePress="{ scale: 0.9 }" />
所有 props 既可以设置为要动画到的值目标,也可以设置为通过 variants prop 定义的任何变体的名称。 变体将像往常一样向下传递给子组件。
<motion.button whilePress="press" whileHover="hover" :variants="buttonVariants" > <svg> <motion.path :variants="iconVariants" /> </svg> </motion.button>
手势
悬停
悬停手势检测指针何时悬停在组件上方或离开组件。
它与 onMouseEnter 和 onMouseLeave 的不同之处在于,悬停保证仅由实际鼠标事件触发(而不是由触摸输入模拟的浏览器生成的鼠标事件)。
<motion.a :whileHover="{ scale: 1.2 }" @hoverStart="event => {}" @hoverEnd="event => {}"
按下
按下手势检测主指针(如鼠标左键单击或第一个触摸点)在同一组件上按下并释放。
<motion.button :whilePress="{ scale: 0.9, rotate: 3 }" />
当点击或单击在它开始的同一组件上结束时,它将触发 press 事件;如果按下或单击在组件外部结束,则触发 pressCancel 事件。
如果可按压组件是可拖动组件的子组件,则如果指针在手势期间移动超过 3 像素,它将自动取消按下手势。
可访问性
带有按下事件的元素是键盘可访问的。
任何带有 press prop 的元素都将能够接收焦点,并且可以使用 Enter 键在聚焦元素上触发按下事件。
按下
Enter键将触发onPressStart和whilePress释放
Enter键将触发onPress如果元素在
Enter键释放之前失去焦点,则会触发onPressCancel。
平移
平移手势识别指针何时在组件上按下并移动超过 3 像素。 当指针释放时,平移手势结束。
<motion.div @pan="(e, pointInfo) => {}" />
平移目前没有相关的 while- prop。
注意: 为了使平移手势与触摸输入正确配合工作,需要使用 touch-action CSS 规则禁用元素在 x/y 轴或两个轴上的触摸滚动。
拖动
拖动手势将指针移动应用于组件的 x 和/或 y 轴。
<motion.div drag :whileDrag="{ scale: 1.2, backgroundColor: '#f00' }" />
默认情况下,当拖动结束时,元素将使用结束速度执行惯性动画。
可以通过将 dragMomentum 设置为 false 来禁用此功能,或者通过 dragTransition prop 进行更改。
约束
也可以设置 dragConstraints,可以将其设置为具有 top、left、right 和 bottom 值的对象,以像素为单位测量。
<motion.div drag="x" :dragConstraints="{ left: 0, right: 300 }" />
或者,它可以接受 HTMLElement ref 值。 您可以使用 motion-v 中的 useDomRef 获取组件的 DOM ref 值,并将其同时传递给可拖动组件的 dragConstraints prop 和您要用作约束的组件的 ref。
<script setup> import { useDomRef } from "motion-v" const constraintsRef = useDomRef() </script> <template> <motion.div ref="constraintsRef"> <motion.div drag :dragConstraints="constraintsRef" /> </motion.div> </template>
默认情况下,将元素拖动到约束之外会产生一定的弹性。 可以通过将 dragElastic 设置为介于 0 和 1 之间的值来更改此行为,其中 0 等于无运动,1 等于约束之外的完全运动。
方向锁定
可以通过设置 dragDirectionLock 将元素锁定到它被拖动的第一个轴。
<motion.div drag dragDirectionLock @directionLock="callback" />
每次拖动手势开始时,都会检测到指针移动的方向,并且该元素将仅在此轴上可拖动。
焦点
焦点手势检测组件何时获得或失去焦点,其规则与CSS :focus-visible 选择器.
通常,这是指 input 通过任何方式接收焦点,以及其他元素通过可访问的方式(例如通过键盘导航)接收焦点时。
<motion.a :whileFocus="{ scale: 1.2 }" href="#" />
事件传播
子组件可以使用 Capture Vue props 阻止指针事件传播到父 motion 组件。
例如,子组件可以通过将 e.stopPropagation() 传递给 onPointerDownCapture 来阻止拖动和点击手势及其相关的 while 动画在父组件上触发。
<motion.div :whilePress="{ scale: 2 }"> <button @pointerDownCapture="e => e.stopPropagation()" /> </motion.div>
注意:SVG 滤镜
手势在 SVG filter 组件上无法识别,因为这些元素没有物理存在,因此不接收事件。
您可以改为将 while- props 和事件处理程序添加到父组件,并使用变体来动画这些元素。
<template> <motion.svg whileHover="hover"> <filter id="blur"> <motion.feGaussianBlur :stdDeviation="0" :variants="{ hover: { stdDeviation: 2 } }" /> </filter> </motion.svg> </template>
Motion 通过一套简单而强大的 UI 手势扩展了 Vue 的基本事件监听器集合。
motion 组件目前支持 hover、press、pan、drag 和 inView。
每个手势都有一组事件监听器和一个 while- 动画 prop。
动画 props
motion 组件提供多种手势动画 props:whileHover、whilePress、whileFocus、whileDrag 和 whileInView。 这些可以定义动画目标,以便在手势处于活动状态时临时动画到这些目标。
<motion.button :whileHover="{ scale: 1.2, transition: { duration: 1 }, }" :whilePress="{ scale: 0.9 }" />
所有 props 既可以设置为要动画到的值目标,也可以设置为通过 variants prop 定义的任何变体的名称。 变体将像往常一样向下传递给子组件。
<motion.button whilePress="press" whileHover="hover" :variants="buttonVariants" > <svg> <motion.path :variants="iconVariants" /> </svg> </motion.button>
手势
悬停
悬停手势检测指针何时悬停在组件上方或离开组件。
它与 onMouseEnter 和 onMouseLeave 的不同之处在于,悬停保证仅由实际鼠标事件触发(而不是由触摸输入模拟的浏览器生成的鼠标事件)。
<motion.a :whileHover="{ scale: 1.2 }" @hoverStart="event => {}" @hoverEnd="event => {}"
按下
按下手势检测主指针(如鼠标左键单击或第一个触摸点)在同一组件上按下并释放。
<motion.button :whilePress="{ scale: 0.9, rotate: 3 }" />
当点击或单击在它开始的同一组件上结束时,它将触发 press 事件;如果按下或单击在组件外部结束,则触发 pressCancel 事件。
如果可按压组件是可拖动组件的子组件,则如果指针在手势期间移动超过 3 像素,它将自动取消按下手势。
可访问性
带有按下事件的元素是键盘可访问的。
任何带有 press prop 的元素都将能够接收焦点,并且可以使用 Enter 键在聚焦元素上触发按下事件。
按下
Enter键将触发onPressStart和whilePress释放
Enter键将触发onPress如果元素在
Enter键释放之前失去焦点,则会触发onPressCancel。
平移
平移手势识别指针何时在组件上按下并移动超过 3 像素。 当指针释放时,平移手势结束。
<motion.div @pan="(e, pointInfo) => {}" />
平移目前没有相关的 while- prop。
注意: 为了使平移手势与触摸输入正确配合工作,需要使用 touch-action CSS 规则禁用元素在 x/y 轴或两个轴上的触摸滚动。
拖动
拖动手势将指针移动应用于组件的 x 和/或 y 轴。
<motion.div drag :whileDrag="{ scale: 1.2, backgroundColor: '#f00' }" />
默认情况下,当拖动结束时,元素将使用结束速度执行惯性动画。
可以通过将 dragMomentum 设置为 false 来禁用此功能,或者通过 dragTransition prop 进行更改。
约束
也可以设置 dragConstraints,可以将其设置为具有 top、left、right 和 bottom 值的对象,以像素为单位测量。
<motion.div drag="x" :dragConstraints="{ left: 0, right: 300 }" />
或者,它可以接受 HTMLElement ref 值。 您可以使用 motion-v 中的 useDomRef 获取组件的 DOM ref 值,并将其同时传递给可拖动组件的 dragConstraints prop 和您要用作约束的组件的 ref。
<script setup> import { useDomRef } from "motion-v" const constraintsRef = useDomRef() </script> <template> <motion.div ref="constraintsRef"> <motion.div drag :dragConstraints="constraintsRef" /> </motion.div> </template>
默认情况下,将元素拖动到约束之外会产生一定的弹性。 可以通过将 dragElastic 设置为介于 0 和 1 之间的值来更改此行为,其中 0 等于无运动,1 等于约束之外的完全运动。
方向锁定
可以通过设置 dragDirectionLock 将元素锁定到它被拖动的第一个轴。
<motion.div drag dragDirectionLock @directionLock="callback" />
每次拖动手势开始时,都会检测到指针移动的方向,并且该元素将仅在此轴上可拖动。
焦点
焦点手势检测组件何时获得或失去焦点,其规则与CSS :focus-visible 选择器.
通常,这是指 input 通过任何方式接收焦点,以及其他元素通过可访问的方式(例如通过键盘导航)接收焦点时。
<motion.a :whileFocus="{ scale: 1.2 }" href="#" />
事件传播
子组件可以使用 Capture Vue props 阻止指针事件传播到父 motion 组件。
例如,子组件可以通过将 e.stopPropagation() 传递给 onPointerDownCapture 来阻止拖动和点击手势及其相关的 while 动画在父组件上触发。
<motion.div :whilePress="{ scale: 2 }"> <button @pointerDownCapture="e => e.stopPropagation()" /> </motion.div>
注意:SVG 滤镜
手势在 SVG filter 组件上无法识别,因为这些元素没有物理存在,因此不接收事件。
您可以改为将 while- props 和事件处理程序添加到父组件,并使用变体来动画这些元素。
<template> <motion.svg whileHover="hover"> <filter id="blur"> <motion.feGaussianBlur :stdDeviation="0" :variants="{ hover: { stdDeviation: 2 } }" /> </filter> </motion.svg> </template>
