useDraggable

Tags:

A React Hook that helps to make element draggable.

Demo

Try to drag the float element.

Source
Drag to move
X: 320, Y: 320
Drag to move (inner)
X: 10, Y: 10

Usage

See API for more details.

Source

Click links below to view source on GitHub.

API

const draggable = useDraggable(elementTarget, options)

ElementTarget

ElementTarget is a union type that represents various kinds of elements that can be targeted.

See ElementTarget or ElementTarget Types for more details.

Options

export type UseDraggableOptions = { /** * Whether to drag the element only when the pointer is exactly on the target element. * * @defaultValue false */ exact?: boolean /** * Whether to prevent the default behavior of the pointer event. * * @defaultValue false */ preventDefault?: boolean /** * Whether to stop the propagation of the pointer event. * * @defaultValue false */ stopPropagation?: boolean /** * Whether to capture the pointer event. * * @defaultValue true */ capture?: boolean /** * The element that should be dragged. * * @defaultValue target */ handle?: ElementTarget /** * The element that should be dragged. * * @defaultValue window */ draggingElement?: ElementTarget | GlobalTarget /** * The element that should contain the draggable element. * * @defaultValue undefined */ containerElement?: ElementTarget /** * The types of pointer events that should be handled. * * @defaultValue ['mouse', 'touch', 'pen'] */ pointerTypes?: PointerType[] /** * The initial position of the draggable element. * * @defaultValue { x: 0; y: 0 } */ initialValue?: Position /** * The callback that is called when the dragging starts. */ onStart?: (position: Position, event: PointerEvent) => void | false /** * The callback that is called when the dragging moves. */ onMove?: (position: Position, event: PointerEvent) => void /** * The callback that is called when the dragging ends. */ onEnd?: (position: Position, event: PointerEvent) => void /** * The axis that the draggable element can be moved along. * * @defaultValue 'both' */ axis?: 'x' | 'y' | 'both' /** * Whether the draggable element is disabled. * * @defaultValue false */ disabled?: boolean }

Returns

export type UseDraggableReturns = { /** * The x-coordinate of the draggable element. */ x: number /** * The y-coordinate of the draggable element. */ y: number /** * The style that should be applied to the draggable element. */ style: CSSProperties /** * The position of the draggable element. */ position: Position /** * Whether the draggable element is being dragged. */ isDragging: boolean }