--- 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; /** * 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; ```