HTML Drag and Drop API

Make elements draggable and droppable

🖱️ What is Drag and Drop?

The Drag and Drop API allows users to drag elements around the page and drop them in different locations. It's great for interactive interfaces like file uploads and sortable lists.


<!-- Simple drag and drop example -->
<div id="drag1" draggable="true" ondragstart="drag(event)">
    Drag me!
</div>

<div id="drop1" ondrop="drop(event)" ondragover="allowDrop(event)">
    Drop here
</div>

<script>
function allowDrop(ev) {
    ev.preventDefault();
}

function drag(ev) {
    ev.dataTransfer.setData("text", ev.target.id);
}

function drop(ev) {
    ev.preventDefault();
    var data = ev.dataTransfer.getData("text");
    ev.target.appendChild(document.getElementById(data));
}
</script>
                                    

Drag and Drop Events

🎯

dragstart

When dragging begins

ondragstart="drag(event)"
🔄

dragover

While dragging over target

ondragover="allowDrop(event)"
📥

drop

When element is dropped

ondrop="drop(event)"

draggable

Makes element draggable

draggable="true"

🔹 Complete Drag and Drop Example

Here's a working drag and drop example:

<!DOCTYPE html>
<html>
<head>
<style>
.drag-item {
    width: 100px;
    height: 50px;
    background-color: #4CAF50;
    color: white;
    text-align: center;
    line-height: 50px;
    margin: 10px;
    cursor: move;
}

.drop-zone {
    width: 200px;
    height: 100px;
    border: 2px dashed #ccc;
    text-align: center;
    line-height: 100px;
    margin: 10px;
}

.drop-zone.dragover {
    background-color: #f0f0f0;
    border-color: #4CAF50;
}
</style>
</head>
<body>

<h2>Drag and Drop Demo</h2>

<div class="drag-item" draggable="true" ondragstart="drag(event)" id="item1">
    Item 1
</div>

<div class="drop-zone" ondrop="drop(event)" ondragover="allowDrop(event)" ondragenter="dragEnter(event)" ondragleave="dragLeave(event)">
    Drop Zone
</div>

<script>
function allowDrop(ev) {
    ev.preventDefault();
}

function dragEnter(ev) {
    ev.target.classList.add('dragover');
}

function dragLeave(ev) {
    ev.target.classList.remove('dragover');
}

function drag(ev) {
    ev.dataTransfer.setData("text", ev.target.id);
}

function drop(ev) {
    ev.preventDefault();
    ev.target.classList.remove('dragover');
    var data = ev.dataTransfer.getData("text");
    ev.target.appendChild(document.getElementById(data));
}
</script>

</body>
</html>

🔹 File Drag and Drop

You can also drag and drop files from the computer:

<div id="dropArea" ondrop="dropHandler(event)" ondragover="dragOverHandler(event)">
    Drop files here
</div>

<script>
function dragOverHandler(ev) {
    ev.preventDefault();
}

function dropHandler(ev) {
    ev.preventDefault();
    
    if (ev.dataTransfer.items) {
        for (let i = 0; i < ev.dataTransfer.items.length; i++) {
            if (ev.dataTransfer.items[i].kind === 'file') {
                const file = ev.dataTransfer.items[i].getAsFile();
                console.log('File name: ' + file.name);
            }
        }
    }
}
</script>

🧠 Test Your Knowledge

Which attribute makes an element draggable?