Skip to main content

05: Drag and Drop

Enabling dragging

Make any elements you want to drag as draggable, by setting the HTML attribute draggable to true on any elements you want to drag.

<div draggable="true" />

Drag DOM events

We have a couple of drag DOM events that we need to listen to for enabling a drag and drop behavior.

  • dragstart - fired when the user starts dragging an element or text selection. Only fires once, when the drag starts.
  • drag - fired when the user is dragging an element or text selection. Fires multiple times, as the user drags.
  • dragend - fired when the user has finished dragging an element or text selection. Fires once, when the drag ends.
  • dragenter - fired when a dragged element or text selection enters a valid drop target. Fires multiple times, as the dragged element enters a new drop target.
  • dragover - fired when a dragged element or text selection is being dragged over a valid drop target. Fires multiple times, as the dragged element is over a drop target.

dragstart

dragover

The dragover event is fired when dragging something over another element. By filling an implementation for this method, we can handle dropping elements into other elements.

container.addEventListener("dragover", (e) => {
e.preventDefault();
});
  • Doing e.preventDefault() prevents the default behavior of showing a not-allowed cursor when dragging over an element.

Drag Styling

Sortable Drag and Drop example

Bounding Box

The bounding box of an element lets us find it's width, height, and position relative to the viewport.

const box = element.getBoundingClientRect();

Here are some properties of the bounding box:

  • box.top - the top position of the element relative to the viewport.
  • box.left - the left position of the element relative to the viewport.
  • box.width - the width of the element.
  • box.height - the height of the element.

We can use these properties to find the coordinates of the center of an element:

const centerX = box.left + box.width / 2;
const centerY = box.top + box.height / 2;