Vorwort
HTML5 bietet eine direkte Drag-and-Drop-API, die es uns erheblich erleichtert, den Drag-and-Drop-Effekt zu erzielen, ohne schreiben zu müssen Mit viel Code.js können Sie verschiedene Drag-and-Drop-Funktionen implementieren, indem Sie einfach auf das Drag-and-Drop-Ereignis des Elements hören.
Wenn Sie ein Element per Drag & Drop verschieben möchten, müssen Sie das ziehbare
-Attribut des Elements auf „true“ setzen. Wenn dieses Attribut „false“ ist, ist Drag & Drop nicht zulässig. Sowohl für das img-Element als auch für das a-Element ist das Draggable-Attribut standardmäßig auf true gesetzt, sodass sie direkt per Drag & Drop verschoben werden können. Wenn Sie diese beiden Elemente nicht per Drag & Drop verschieben möchten, setzen Sie das Attribut einfach auf false.
Drag-and-Drop-Ereignisse
Drag-and-Drop-Ereignisse werden von verschiedenen Elementen generiert. Wenn ein Element per Drag-and-Drop verschoben wird, durchläuft es möglicherweise viele Elemente, bevor es schließlich das Element erreicht, das Sie platzieren möchten. Hier bezeichne ich das per Drag & Drop gezogene Element vorübergehend als Quell-
-Objekt , das übergebene Element als Prozessobjekt und das angekommene Element als Zielobjekt. Verschiedene Objekte erzeugen unterschiedliche Drag-and-Drop-Ereignisse.
Quellobjekt:
Prozessobjekt:
- dragenter: Das Quellobjekt beginnt, in den Bereich des Prozessobjekts einzutreten.
- Dragover: Das Quellobjekt bewegt sich innerhalb des Geltungsbereichs des Prozessobjekts.
- dragleave: Das Quellobjekt verlässt den Gültigkeitsbereich des Prozessobjekts.
Zielobjekt:
- Drop: Das Quellobjekt wird per Drag & Drop in das Zielobjekt gezogen.
<p id="source" draggable="true">a元素</p><p id="process">b元素</p><p id="target">c元素</p><script>
var source = document.getElementById('source'), // a元素
process = document.getElementById('process'), // b元素
target = document.getElementById('target'); // c元素
source.addEventListener('dragstart',function(ev){ // dragstart事件由a元素产生
console.log('a元素开始被拖动');
},false) process.addEventListener('dragenter',function(ev){ // dragenter事件由b元素产生
console.log('a元素开始进入b元素');
},false) process.addEventListener('dragleave',function(ev){ // dragleave事件由b元素产生
console.log('a元素离开b元素');
},false) target.addEventListener('drop',function(ev){ // drop事件由c元素产生
console.log('a元素拖放到c元素了');
ev.preventDefault();
},false) document.ondragover = function(e){e.preventDefault();}</script>
Nach dem Login kopieren
dataTransfer-Objekt
stellt ein Das Datenübertragungsobjekt dataTransfer wird verwendet um Daten zwischen dem Quellobjekt und dem Zielobjekt zu übertragen. Als Nächstes lernen wir die Methoden und Eigenschaften dieses Objekts kennen, um zu verstehen, wie es Daten überträgt.
Diese Methode speichert Daten im dataTransfer-Objekt. Empfängt zwei Parameter. Der erste ist eine
-Zeichenfolge , die den Typ der zu speichernden Daten angibt:
- text/plain: Text .
- text/html: HTML-Text.
- text/
xml: XML-Text.
- text/uri-list: URL-Liste, jede URL ist eine Zeile.
Der zweite Parameter sind die zu speichernden Daten. Zum Beispiel:
event.dataTransfer.setData('text/plain','Hello World');
Nach dem Login kopieren
getData()
Diese Methode liest Daten aus dem dataTransfer-Objekt. Der Parameter ist der in setData angegebene Datentyp. Zum Beispiel:
event.dataTransfer.getData('text/plain');
Nach dem Login kopieren
Diese Methode löscht die dataTransfer-Objektdaten, die in gespeichert sind. Der Parameter ist optional und entspricht dem Datentyp. Wenn der Parameter leer ist, werden alle Datentypen gelöscht. Zum Beispiel:
event.dataTransfer.clearData();
Nach dem Login kopieren
setDragImage()
Diese Methode legt das Drag-and-Drop-Symbol mithilfe von fest img-Element. Empfängt drei Parameter, der erste ist das Symbolelement, der zweite ist die X-Achsenverschiebung des Symbolelements vom Mauszeiger und der dritte ist die Y-Achsenverschiebung des Symbolelements vom Mauszeiger. Zum Beispiel:
var source = document.getElementById('source'),
icon = document.createElement('img');icon.src = 'img.png';source.addEventListener('dragstart',function(ev){
ev.dataTransfer.setDragImage(icon,-10,-10)},false)
Nach dem Login kopieren
effect
beide Eigenschaften werden kombiniert, um den visuellen Effekt von Drag & Drop festzulegen.
Es ist erwähnenswert: IE unterstützt keine dataTransfer-Objekte. Ja, es wird unabhängig von der IE-Version nicht unterstützt.
Drag-and-Drop-Sortierung implementieren
Wir sind bereits mit der Verwendung der Drag-and-Drop-API vertraut. Lassen Sie uns eine einfache Drag-and-Drop-Sortierung implementieren, die auch in der Praxis üblich ist Projekte. Lassen Sie uns zunächst die Idee klären:
- In einer Liste kann jedes Element per Drag-and-Drop verschoben werden. Setzen Sie daher zunächst das Draggable-Attribut für jedes Element auf „true“.
- Hören Sie sich das Dragstart-Ereignis jedes Elements an und formatieren Sie das Quellobjekt, um es zu unterscheiden.
- Hören Sie sich das Dragenter-Ereignis jedes Elements an. Wenn das Quellobjekt in das aktuelle Element eintritt, fügen Sie das Quellobjekt vor dem Element hinzu. Auf diese Weise werden die folgenden Elemente vom Quellobjekt verdrängt, wodurch ein Sortiereffekt erzielt wird.
- Aber Sie werden feststellen, dass das Quellobjekt nicht an letzter Stelle, sondern nur an vorletzter Stelle stehen kann. Zu diesem Zeitpunkt müssen Sie das Dragleave-Ereignis abhören. Wenn das Prozessobjekt das letzte Element ist, verlässt das Quellobjekt das Prozessobjekt und fügt dann das Quellobjekt am Ende hinzu.
Der Hauptcode lautet wie folgt:
var source = document.querySelectorAll('.list'),
dragElement = null;for(var i = 0; i < source.length; i++){
source[i].addEventListener('dragstart',function(ev){
dragElement = this;
},false);
source[i].addEventListener('dragenter', function(ev){
if(dragElement != this){
this.parentNode.insertBefore(dragElement,this);
}
}, false)
source[i].addEventListener('dragleave', function(ev){
if(dragElement != this){
if(this == this.parentNode.lastElementChild || this == this.parentNode.lastChild){
this.parentNode.appendChild(dragElement);
}
}
}, false)};document.ondragover = function(e){e.preventDefault();}document.ondrop = function(e){e.preventDefault();}
Nach dem Login kopieren
Vollständige Codeadresse: Drag-Demo
兼容
主要是在IE中的兼容不太好,不过至少在IE10中能兼容上面的拖动排序。
而且在我简单的试验中发现,就是在 IE 中元素不设置 height 的时候,不会触发 dragleave 事件。
更重要的一点是在 ios 和安卓上,完全不兼容。不过还好,有一个插件能让它在移动端完美兼容。
插件地址:ios-html5-drag-drop-shim
只需要在原有的代码中引入该插件,即可在移动端上实现拖动了。
<script>var iosDragDropShim = { enableEnterLeave: true }</script><script src="vendor/ios-drag-drop.js"></script>
Nach dem Login kopieren
更多文章:lin-xin/blog
Das obige ist der detaillierte Inhalt vonDie Drag-and-Drop-API implementiert die Drag-and-Drop-Sortierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!