DEV Community

Cover image for HTML5 Drag and Drop API 🌐
Himanay Khajuria
Himanay Khajuria

Posted on

2 1

HTML5 Drag and Drop API 🌐

π–£  HTML5 Drag and Drop API β†’ A Step-by-Step Guide

The HTML5 Drag and Drop API lets you move elements around a webpage using your mouse. This feature is super useful for creating interactive user experiences like file uploads, kanban boards and more! πŸ–±οΈπŸ’‘


πŸ€·πŸ»β€β™€οΈ What is Drag and Drop❓

Drag and Drop allows you to grab an element and move it somewhere else on the webpage. You can make any HTML element draggable using draggable="true".

πŸ”₯ Quick Summary

1️⃣ Make an item draggable β†’ draggable="true" πŸ—οΈ

2️⃣ Detect when dragging starts β†’ dragstart 🎬

3️⃣ Allow dropping β†’ dragover βœ…

4️⃣ Move the item β†’ drop 🎯


✨ Step 1: Make an Item Draggable

First, you need an element that can be dragged. Add the draggable="true" attribute to make it draggable.

πŸ’πŸ»β€β™€οΈ Example:

<p id="dragItem" draggable="true">Drag me!</p>
Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ Now, this paragraph can be dragged! πŸŽ‰


🎬 Step 2: Detect When Dragging Starts

When you start dragging, you need to store some data about the dragged element. This is done using the dragstart event.

πŸ’πŸ»β€β™€οΈ Example:

document.getElementById("dragItem").addEventListener("dragstart", function(event) {
    event.dataTransfer.setData("text", event.target.id); // Store the ID of the dragged item
});
Enter fullscreen mode Exit fullscreen mode

βœ… What happens here?

πŸ‘‰ When dragging starts, the element's ID is saved so we can use it later.


🚦 Step 3: Allow Dropping

By default, elements don't allow dropping. You must enable it using the dragover event.

πŸ’πŸ»β€β™€οΈ Example:

document.getElementById("dropArea").addEventListener("dragover", function(event) {
    event.preventDefault(); // This allows dropping
});
Enter fullscreen mode Exit fullscreen mode

βœ… Why is this needed?

πŸ‘‰ Without event.preventDefault(), the item cannot be dropped inside another element.


➡ 𖦏 Step 4: Handle the Drop

Once the item is dropped, you need to move it inside the drop area.

πŸ’πŸ»β€β™€οΈ Example:

document.getElementById("dropArea").addEventListener("drop", function(event) {
    event.preventDefault();
    let draggedItem = event.dataTransfer.getData("text"); // Get the ID of dragged item
    event.target.appendChild(document.getElementById(draggedItem)); // Move it to new place
});
Enter fullscreen mode Exit fullscreen mode

βœ… What happens here?

πŸ‘‰ Retrieves the ID of the dragged item and moves it inside the drop area.


πŸ› οΈ Step 5: Create a Drop Area

You need a container where the dragged item will be dropped.

πŸ’πŸ»β€β™€οΈ Example:

<div id="dropArea" style="width: 200px; height: 200px; border: 2px dashed black;">
    Drop Here
</div>
Enter fullscreen mode Exit fullscreen mode

πŸ’‘ Now, when you drag the item and drop it into this area, it will move inside!


πŸ† Complete Example πŸ‘‡

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Drag and Drop Example</title>
</head>
<body>

    <p id="dragItem" draggable="true">Drag me!</p>

    <div id="dropArea" style="width: 200px; height: 200px; border: 2px dashed black;">
        Drop Here
    </div>

    <script>
        // Step 2: Dragging starts
        document.getElementById("dragItem").addEventListener("dragstart", function(event) {
            event.dataTransfer.setData("text", event.target.id);
        });

        // Step 3: Allow dropping
        document.getElementById("dropArea").addEventListener("dragover", function(event) {
            event.preventDefault();
        });

        // Step 4: Handle the drop
        document.getElementById("dropArea").addEventListener("drop", function(event) {
            event.preventDefault();
            let draggedItem = event.dataTransfer.getData("text");
            event.target.appendChild(document.getElementById(draggedItem));
        });
    </script>

</body>
</html>
Enter fullscreen mode Exit fullscreen mode

🧠 Understanding dataTransfer.setData()

The dataTransfer.setData(format, data) method is used to store data when dragging an item.

πŸ’πŸ»β€β™€οΈ Example:

event.dataTransfer.setData("text", event.target.id);
Enter fullscreen mode Exit fullscreen mode

βœ… Explanation:

  • "text" β†’ Data type (could be "text/plain", "text/html", etc.).
  • event.target.id β†’ Saves the ID of the dragged item to be used later.

πŸ›‘ Why preventDefault() is Important?

By default, dropping is not allowed. We use event.preventDefault(); to enable it.

πŸ’πŸ»β€β™€οΈ Example:

document.getElementById("dropArea").addEventListener("dragover", function(event) {
    event.preventDefault(); // Allows dropping
});
Enter fullscreen mode Exit fullscreen mode

⚑βœͺ Why do we need it?

  • In dragover β†’ Enables dropping.
  • In drop β†’ Prevents unwanted browser actions (like opening a file). πŸ‘‰ Without preventDefault(), the item won’t be droppable.

✦ Full Flow Recap

πŸ“Œ Drag starts β†’ setData saves the ID.

πŸ“Œ Drag over drop area β†’ preventDefault enables dropping.

πŸ“Œ Drop happens β†’ getData retrieves ID and moves item.


πŸ“’ Learn More & Connect with Me!

🀩 Want to see this in action?

Check out my Technical Presentation πŸŽ₯:

πŸ”— View Presentation

πŸ’Ό Let’s connect on LinkedIn! πŸ‘₯πŸ’¬

β™‘ Happy Coding! β™‘

Sentry blog image

How I fixed 20 seconds of lag for every user in just 20 minutes.

Our AI agent was running 10-20 seconds slower than it should, impacting both our own developers and our early adopters. See how I used Sentry Profiling to fix it in record time.

Read more

Top comments (1)

Collapse
 
davidbremmen profile image
David Bremmen β€’

Great Artricle!

Cloudinary image

Optimize, customize, deliver, manage and analyze your images.

Remove background in all your web images at the same time, use outpainting to expand images with matching content, remove objects via open-set object detection and fill, recolor, crop, resize... Discover these and hundreds more ways to manage your web images and videos on a scale.

Learn more

πŸ‘‹ Kindness is contagious

Please leave a ❀️ or a friendly comment on this post if you found it helpful!

Okay