Einfaches Drag & Drop mit reinem HTML5, CSS und JavaScript
Melden
In diesem Tutorial lernst du, wie du eine einfache Drag & Drop-Funktion mit purem HTML, CSS und JavaScript erstellst. Wir nutzen dafür die native HTML5 Drag & Drop API.
Was wir bauen
Wir erstellen zwei Boxen. In einer befindet sich ein Element, das du mit der Maus in die andere Box ziehen kannst.
1. Das HTML-Gerüst
Zuerst brauchen wir die Container (Ziele) und das Element, das bewegt werden soll.
Wichtig: Das Attribut draggable="true" macht ein Element beweglich.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Drag and Drop Tutorial</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<!-- Box 1 -->
<div class="drop-zone" id="zone-1">
<div class="drag-item" id="item-1" draggable="true">Zieh mich!</div>
</div>
<!-- Box 2 -->
<div class="drop-zone" id="zone-2"></div>
</div>
<script src="script.js"></script>
</body>
</html>
2. Das CSS (Styling)
Damit wir sehen, was passiert, geben wir den Boxen ein Design.
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #f0f0f0;
}
.container {
display: flex;
gap: 20px;
}
.drop-zone {
width: 200px;
height: 200px;
border: 2px dashed #ccc;
background-color: white;
display: flex;
justify-content: center;
align-items: center;
transition: background-color 0.3s;
}
.drag-item {
width: 100px;
height: 100px;
background-color: #3498db;
color: white;
display: flex;
justify-content: center;
align-items: center;
cursor: grab;
border-radius: 8px;
}
/* Klasse für den Zustand, wenn ein Item über der Zone schwebt */
.drop-zone.hover {
background-color: #e1f5fe;
border-color: #3498db;
}
3. Das JavaScript (Die Logik)
Hier passiert die Magie. Wir müssen drei Ereignisse (Events) abfangen.
- dragstart: Wenn der User anfängt zu ziehen.
- dragover: Damit das System weiß, dass man hier etwas ablegen darf (Standardmäßig ist das nämlich verboten).
- drop: Wenn der User die Maustaste loslässt.
const item = document.querySelector('.drag-item');
const zones = document.querySelectorAll('.drop-zone');
// 1. Start des Ziehvorgangs
item.addEventListener('dragstart', (e) => {
// Wir speichern die ID des Elements im "dataTransfer" Objekt
e.dataTransfer.setData('text/plain', e.target.id);
// Optional: Ein kleiner Effekt beim Ziehen
setTimeout(() => {
e.target.style.display = 'none'; // Versteckt das Original-Element kurzzeitig
}, 0);
});
// 2. Ende des Ziehvorgangs (falls man doch nicht droppt)
item.addEventListener('dragend', (e) => {
e.target.style.display = 'flex';
});
// 3. Logik für die Ziel-Zonen
zones.forEach(zone => {
// Notwendig: Standardverhalten verhindern, um Drop zu erlauben
zone.addEventListener('dragover', (e) => {
e.preventDefault();
zone.classList.add('hover');
});
// Visuelles Feedback entfernen, wenn man die Zone verlässt
zone.addEventListener('dragleave', () => {
zone.classList.remove('hover');
});
// Das eigentliche Loslassen
zone.addEventListener('drop', (e) => {
e.preventDefault();
zone.classList.remove('hover');
// Die ID des Elements holen
const id = e.dataTransfer.getData('text/plain');
const draggableElement = document.getElementById(id);
// Das Element in die neue Zone verschieben
zone.appendChild(draggableElement);
});
});
Zusammenfassung der wichtigsten Punkte:
draggable="true": Ohne dieses Attribut im HTML lässt sich nichts bewegen.e.preventDefault(): Das ist der wichtigste Teil imdragover. Ohne diesen Aufruf lässt der Browser keinen "Drop" zu (das Symbol zeigt meist ein Verbotsschild).dataTransfer: Dieses Objekt ist wie eine Zwischenablage, die Daten vom Startpunkt zum Zielpunkt transportiert.
Profi-Tipps für später:
- Touch-Support: Die native API funktioniert leider schlecht auf Smartphones. Für Mobile-Apps solltest du Bibliotheken wie SortableJS oder Dragula nutzen.
- UX: Nutze CSS-Klassen (
hover), um dem Nutzer sofort zu zeigen, wo er das Element loslassen kann. - Listen: Wenn du ganze Listen sortieren willst, ist es oft einfacher, den Index der Elemente zu tauschen, anstatt das DOM-Element manuell zu verschieben.