Enable Drag
<div draggable="true">Drag me</div>
Attribute |
Purpose |
draggable |
Enables native drag behavior |
Default |
Only applies to <img> , <a> , selected text |
Drag Events (source)
Event |
When it fires |
dragstart |
When dragging starts |
drag |
While dragging (fires frequently) |
dragend |
When dragging ends (regardless of drop success) |
function handleDragStart(e: DragEvent) {
e.dataTransfer.setData('text/plain', 'hello');
}
Drop Events (target)
Event |
When it fires |
dragenter |
A draggable enters a valid drop target |
dragover |
A draggable is over a drop target |
dragleave |
Leaves drop target |
drop |
Released inside drop target |
Important: dragover
must call e.preventDefault()
to allow drop.
dataTransfer
API
Used to store and retrieve data during a drag operation.
- Files from OS: use
e.dataTransfer.files
- DOM elements: use
dataTransfer.setData()
manually
// Set data (dragstart)
e.dataTransfer.setData('text/plain', 'someData');
// Get data (drop)
const data = e.dataTransfer.getData('text/plain');
Method |
Description |
setData(type, value) |
Save data during drag |
getData(type) |
Retrieve data on drop |
types |
Array of available MIME types |
files |
List of dragged files (FileList) |
React Example (Text Drag & Drop)
onDragOver
must call preventDefault()
to enable onDrop
function DragSource() {
return (
<div
draggable
onDragStart={(e) => e.dataTransfer.setData('text/plain', 'hello')}
>
Drag me
</div>
);
}
function DropTarget() {
function handleDrop(e: React.DragEvent) {
e.preventDefault();
const value = e.dataTransfer.getData('text/plain');
console.log('Dropped value:', value);
}
return (
<div
onDrop={handleDrop}
onDragOver={(e) => e.preventDefault()}
className="border p-4"
>
Drop here
</div>
);
}