Skip to content

Drag Items

The Drag Items component allows you to create draggable and reorderable items within a container. It provides a flexible way to implement drag-and-drop functionality for lists and other UI elements.

No additional dependencies required.

<ul data-role="drag-items">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<!-- With drag markers -->
<ul data-role="drag-items" data-draw-drag-marker="true">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<!-- Disabled dragging initially -->
<ul data-role="drag-items" data-can-drag="false">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<!-- Custom drag item selector -->
<div data-role="drag-items" data-drag-item=".item">
<div class="item">Item 1</div>
<div class="item">Item 2</div>
<div class="item">Item 3</div>
</div>
ParameterTypeDefaultDescription
dragItemsDeferrednumber0Delay in milliseconds before initialization
targetstring/objectnullTarget element for dropping items
dragItemstring”li”Selector for draggable items
dragMarkerstring”.drag-item-marker”Selector for drag marker
drawDragMarkerbooleanfalseWhether to draw drag markers
clsDragItemAvatarstring""Additional CSS class for drag avatar
clsDragItemstring""Additional CSS class for drag item
canDragbooleantrueWhether dragging is enabled
  • on() - Enables dragging functionality.
const dragItems = Metro.getPlugin('#myList', 'drag-items');
dragItems.on();
  • off() - Disables dragging functionality.
const dragItems = Metro.getPlugin('#myList', 'drag-items');
dragItems.off();
  • toggle() - Toggles dragging functionality on/off.
const dragItems = Metro.getPlugin('#myList', 'drag-items');
dragItems.toggle();
  • destroy() - Removes event handlers and cleans up the component.
const dragItems = Metro.getPlugin('#myList', 'drag-items');
dragItems.destroy();
EventDescription
onDragStartItemTriggered when dragging starts
onDragMoveItemTriggered when dragging moves
onDragDropItemTriggered when item is dropped
onTargetTriggered when over a target
onTargetInTriggered when entering a target (planned but not implemented)
onTargetOutTriggered when leaving a target (planned but not implemented)
onDragItemsCreateTriggered when component is created
$("#myList").on("drag-start-item", function(e, data){
console.log("Started dragging:", data.dragItem);
});
// Or using the options
<ul data-role="drag-items" data-on-drag-drop-item="myDropFunction">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<script>
function myDropFunction(e, data) {
console.log("Item dropped:", data.dragItem);
}
</script>

The component uses the following CSS variables from the Metro UI framework:

VariableDefault (Light)Dark ModeDescription
@transparenttransparenttransparentUsed for background color
@white#ffffff#ffffffUsed for marker color
@dark#1d1d1d#1d1d1dUsed for dark theme marker
@blue#4390df#4390dfUsed for avatar background
@zindex-absolute20002000Used for z-index
@primaryColor#5c92fa#5c92faUsed for box-shadow
/* Custom styling for drag markers */
.my-list .drag-item-marker {
border-top-color: red;
}
.my-list .drag-item-marker::before,
.my-list .drag-item-marker::after {
background-color: red;
}
/* Custom styling for dragged item avatar */
.my-list .dragged-item-avatar {
background-color: purple;
opacity: 0.5;
}
  • .drag-items-target - Applied to the container element
  • .dragged-item - Applied to the item being dragged (opacity: 0.3)
  • .drag-item-marker - Styling for the drag marker (hamburger icon)
  • .dragged-item-avatar - Styling for the avatar element that follows the cursor during dragging
  • .drag-marker-dark - Dark theme variant for the drag marker

You can set global defaults for all Drag Items components:

Metro.dragItemsSetup({
dragItem: "div",
drawDragMarker: true,
clsDragItemAvatar: "custom-avatar"
});