Skip to content

useDraggable

使元素可拖拽,支持指针类型、轴向约束、容器边界检测。


函数签名

ts
function useDraggable(
  target: MaybeRefOrGetter<HTMLElement | SVGElement | null | undefined>,
  options?: UseDraggableOptions,
): {
  x: Ref<number>
  y: Ref<number>
  position: Ref<{ x: number; y: number }>
  isDragging: ComputedRef<boolean>
  style: ComputedRef<string>
}

基础用法

参数

参数说明类型默认值
target可拖拽的目标元素(ref / getter)MaybeRefOrGetter<HTMLElement | SVGElement>
options配置项UseDraggableOptions{}

UseDraggableOptions

参数说明类型默认值
exact仅在直接点击元素时开始拖拽MaybeRefOrGetter<boolean>false
preventDefault阻止默认事件MaybeRefOrGetter<boolean>false
stopPropagation阻止事件冒泡MaybeRefOrGetter<boolean>false
capture是否在捕获阶段触发事件booleantrue
draggingElementpointermove/pointerup 绑定的元素MaybeRefOrGetter<HTMLElement | Window | Document>window
containerElement拖拽边界计算容器MaybeRefOrGetter<HTMLElement>
handle触发拖拽的句柄元素MaybeRefOrGetter<HTMLElement>target
pointerTypes监听的指针类型('mouse' | 'touch' | 'pen')[]['mouse', 'touch', 'pen']
initialValue初始位置MaybeRefOrGetter<{ x: number; y: number }>{ x: 0, y: 0 }
axis拖拽轴向'x' | 'y' | 'both''both'
disabled禁用拖拽MaybeRefOrGetter<boolean>false
onStart拖拽开始回调,返回 false 可阻止(position, event) => void | false
onMove拖拽中回调(position, event) => void
onEnd拖拽结束回调(position, event) => void

返回值

属性说明类型
x水平位置Ref<number>
y垂直位置Ref<number>
position位置对象Ref<{ x: number; y: number }>
isDragging是否正在拖拽ComputedRef<boolean>
style可直接绑定到元素的 CSS 字符串(left:Xpx;top:Ypx;ComputedRef<string>

代码示例

ts
import { ref } from 'vue'
import { useDraggable } from 'ljf-hooks'

const el = ref<HTMLElement>()
const { x, y, style, isDragging } = useDraggable(el, {
  initialValue: { x: 100, y: 100 },
  axis: 'x', // 仅水平拖拽
})