Es gibt 2 Möglichkeiten Elemente per Drag and Drop zu verschieben.
position:absolute
auszuzeichnen und die Position per Mausposition zu bestimmt.draggable="true"
wird eingesetzt. Damit ist ein Element zwar verschiebbar, aber man kann es noch nicht ablegen. Javascript bietet hier einige Events, Methoden und Eigenschaften.Hier 3 Beispiele, näheres dazu im Quelltext
Das dritte Beispiel baut auf dem zweiten Beispiel auf. In beiden Fällen wird die Verschiebe Funktion dem document zugewiesen. Im zweiten Beispiel gibt es nur ein Objekt, das verschoben werden kann. Im dritten Beispiel wird das angeklickte Objekt in einer Variablen currentObj
gespeichert.
Bilder, Anker, und markierter Text sind in HTML5 ziehbar aber man kann sie nicht ohne weiteres irgendwo ablegen. Mit dem HTML Attribut draggable="true"
kann man jedes Element ziehbar machen und jedes Element auch unziehbar machen durch draggable="false"
.
2022 wird das auf dem Android und iOS noch nicht unterstützt
Um eine drag & Drop Funktionalität zu erreichen ist es nötig per Javascript weitere Events hinzuzufügen.
Das dragstart
Event wird ausgelöst, sobald man ein Element zieht. Währenddessen werden einem dataTransfer Objekt verschiedene Informationen zugewiesen und dort gespeichert. Es lässt sich beispielsweise übermitteln welche ID das gezogene Element hat:
evt.dataTransfer.setData('text', evt.target.id);
An anderer Stelle (beispielsweise beim drop) kann man diese Information abrufen:
evt.dataTransfer.getData('text');
Damit man ein Element auch auf einem Zielelement ablegen kann, muss dieses mit Javascript ermöglicht werden.
Das Zielelement bekommt das HTML Attribut contenteditable="true"
Die Elemente input, textarea benötigen das Attribut nicht.
Man weist dem Zielelement ein dragover-Event
. zu. Das Standardverhalten des Browser beim dragover-Event ist, das Ablegen zu verhindern. Dieses Standardverhalten wird verhindert durch evt.preventDefault();
Somit wird das Ablegen auf dem Element ermöglicht.
function allowDrop(evt){ evt.preventDefault(); }
Das Zielelement bekommt ein drop Ereignis. Hier wird mittels des dataTransfer Objekts abgefragt, welches Element sich über dem Zielelement befindet. Man kann dieses Element nun ablegen, verschwinden lassen oder was auch immer.
function drop(ev) { ev.preventDefault(); var data = ev.dataTransfer.getData('text'); ev.target.appendChild(document.getElementById(data)); }
HTML
<div id="ziel" contenteditable="true"></div> <img id="drag1" src="img/teil1.png" alt="anlasser" draggable="true" > <img id="drag2" src="img/teil2.png" alt="pleuelstange" draggable="true">
Javascript
let ziel = document.getElementById("ziel"); let drag1 = document.getElementById("drag1"); let drag2 = document.getElementById("drag2"); ziel.addEventListener("dragover", allowDrop); ziel.addEventListener("drop", drop); drag1.addEventListener("dragstart", drag); drag2.addEventListener("dragstart", drag); function allowDrop(evt) { evt.preventDefault(); } function drag(evt) { evt.dataTransfer.setData('text', evt.target.id); } function drop(evt) { evt.preventDefault(); var data = evt.dataTransfer.getData('text'); evt.target.appendChild(document.getElementById(data)); }CSS
[draggable=true] { cursor: move; } [draggable=false] { cursor: not-allowed; } #ziel { background-image: url(img/eimer.png); background-repeat: no-repeat; width: 224px; height: 246px; }Beispiel