Skip to content

Basic Draggable API Reference

Props

PropTypeDefaultDescription
positionXNumber200Initial X position in pixels
positionYNumber200Initial Y position in pixels
dragAlongWithCursorBooleanfalseIf true, component follows cursor movement automatically
placementString'bottom'Placement relative to position: 'bottom', 'top', 'left', 'right'

Slots

SlotPropsDescription
main{ startDrag: Function }Content to be displayed inside the draggable component. Receives startDrag function to initiate dragging

Events

EventPayloadDescription
onStartDrag-Emitted when dragging starts
onDragging-Emitted continuously while dragging (throttled)
onStopDrag-Emitted when dragging stops
setPosition{ positionX: Number, positionY: Number, placement: String }Emitted with new position after drag stops

Methods

The component doesn't expose any methods via template refs. Use the startDrag function provided via the slot props to initiate dragging.

Example Usage

vue
<template>
  <BasicDraggable
    :position-x="200"
    :position-y="200"
    :placement="'bottom'"
    :drag-along-with-cursor="false"
    @on-start-drag="handleStartDrag"
    @on-dragging="handleDragging"
    @on-stop-drag="handleStopDrag"
    @set-position="handleSetPosition"
  >
    <template #main="{ startDrag }">
      <div @mousedown="startDrag" class="draggable-content">
        <h3>Draggable Card</h3>
        <p>Click and drag me around!</p>
      </div>
    </template>
  </BasicDraggable>
</template>

<script setup>
import BasicDraggable from '@/components/BasicDraggable.vue';

const handleStartDrag = () => {
  console.log('Drag started');
};

const handleDragging = () => {
  console.log('Dragging...');
};

const handleStopDrag = () => {
  console.log('Drag stopped');
};

const handleSetPosition = (position) => {
  console.log('New position:', position);
  // Update position state if needed
};
</script>

Placement Options

The placement prop determines how the component is positioned relative to the specified coordinates:

  • 'bottom': Component is centered horizontally and positioned below the point (default)
  • 'top': Component is centered horizontally and positioned above the point
  • 'left': Component is centered vertically and positioned to the left of the point
  • 'right': Component is centered vertically and positioned to the right of the point

Styling

The component uses the following CSS classes:

  • .basic-draggable-floating-component-wrapper: The main container (fixed position)
  • .basic-draggable-floating-component-wrapper.left: Applied when placement is 'left'
  • .basic-draggable-floating-component-wrapper.right: Applied when placement is 'right'
  • .basic-draggable-floating-component-wrapper.top: Applied when placement is 'top'
  • .basic-draggable-floating-component-wrapper.bottom: Applied when placement is 'bottom'

Notes

  • The component automatically calculates REM to pixel conversion based on the root font size
  • Boundary constraints prevent dragging outside the viewport
  • The onDragging event is throttled to 16ms for performance
  • Position updates are emitted via setPosition event when dragging stops