--- category: Elements --- # useDraggable Make elements draggable. ## Usage ```vue ``` Set `preventDefault: true` to override the default drag-and-drop behavior of certain elements in the browser. ```ts import { useDraggable } from '@vueuse/core' // ---cut--- const { x, y, style } = useDraggable(el, { preventDefault: true, // with `preventDefault: true` // you can disable the native behavior (e.g., for img) // and control the drag-and-drop, preventing the browser interference. }) ``` ## Component Usage ```vue ``` For component usage, additional props `storageKey` and `storageType` can be passed to the component and enable the persistence of the element position. ```vue ``` ## Type Declarations ```ts export interface UseDraggableOptions { /** * Only start the dragging when click on the element directly * * @default false */ exact?: MaybeRefOrGetter /** * Prevent events defaults * * @default false */ preventDefault?: MaybeRefOrGetter /** * Prevent events propagation * * @default false */ stopPropagation?: MaybeRefOrGetter /** * Whether dispatch events in capturing phase * * @default true */ capture?: boolean /** * Element to attach `pointermove` and `pointerup` events to. * * @default window */ draggingElement?: MaybeRefOrGetter< HTMLElement | SVGElement | Window | Document | null | undefined > /** * Element for calculating bounds (If not set, it will use the event's target). * * @default undefined */ containerElement?: MaybeRefOrGetter< HTMLElement | SVGElement | null | undefined > /** * Handle that triggers the drag event * * @default target */ handle?: MaybeRefOrGetter /** * Pointer types that listen to. * * @default ['mouse', 'touch', 'pen'] */ pointerTypes?: PointerType[] /** * Initial position of the element. * * @default { x: 0, y: 0 } */ initialValue?: MaybeRefOrGetter /** * Callback when the dragging starts. Return `false` to prevent dragging. */ onStart?: (position: Position, event: PointerEvent) => void | false /** * Callback during dragging. */ onMove?: (position: Position, event: PointerEvent) => void /** * Callback when dragging end. */ onEnd?: (position: Position, event: PointerEvent) => void /** * Axis to drag on. * * @default 'both' */ axis?: "x" | "y" | "both" /** * Disabled drag and drop. * * @default false */ disabled?: MaybeRefOrGetter /** * Mouse buttons that are allowed to trigger drag events. * * - `0`: Main button, usually the left button or the un-initialized state * - `1`: Auxiliary button, usually the wheel button or the middle button (if present) * - `2`: Secondary button, usually the right button * - `3`: Fourth button, typically the Browser Back button * - `4`: Fifth button, typically the Browser Forward button * * @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button#value * @default [0] */ buttons?: MaybeRefOrGetter } /** * Make elements draggable. * * @see https://vueuse.org/useDraggable * @param target * @param options */ export declare function useDraggable( target: MaybeRefOrGetter, options?: UseDraggableOptions, ): | { position: Ref< { x: number y: number }, | Position | { x: number y: number } > isDragging: ComputedRef style: ComputedRef x: Ref y: Ref } | { position: Ref< { x: number y: number }, | Position | { x: number y: number } > isDragging: ComputedRef style: ComputedRef x: Ref y: Ref } export type UseDraggableReturn = ReturnType ```