js, um Drag & Drop-Sortierdetails zu erreichen

js, um Drag & Drop-Sortierdetails zu erreichen

1. Einleitung

Das Sortieren per Drag-and-Drop sollte jedem vertraut sein. Wenn Sie normal arbeiten, können Sie Open-Source-Bibliotheken wie Sortable.js verwenden, um Ihre Anforderungen zu erfüllen. Aber haben Sie nach der Erfüllung der Anforderungen schon einmal darüber nachgedacht, wie Sie eine Drag-and-Drop-Sortierung realisieren können? Ich habe einige Zeit damit verbracht, es zu recherchieren, und teile es heute mit Ihnen.

2. Umsetzung

 {
    Rand: 0;
    Polsterung: 0;
    Box-Größe: Rahmenbox;
}

.Netz {
    Anzeige: Flex;
    Flex-Wrap: Umwickeln;
    Rand: 0 -15px -15px 0;
    Touch-Aktion: keine;
    Benutzerauswahl: keine;
}

.Rasterelement {
    Breite: 90px;
    Höhe: 90px;
    Zeilenhöhe: 88px;
    Textausrichtung: zentriert;
    Rand: 0 15px 15px 0;
    Hintergrund: #FFF;
    Rand: 1px durchgezogen #d6d6d6;
    Listenstil: keiner;
}

.aktiv {
    Hintergrund: #c8ebfb;
}

.clone-grid-item {
    Position: fest;
    links: 0;
    oben: 0;
    Z-Index: 1;
    Breite: 90px;
    Höhe: 90px;
    Zeilenhöhe: 88px;
    Textausrichtung: zentriert;
    Hintergrund: #FFF;
    Rand: 1px durchgezogen #d6d6d6;
    Deckkraft: 0,8;
    Listenstil: keiner;
}

<ul Klasse="Raster">
    <li Klasse="grid-item">Element1</li>
    <li class="grid-item">Element2</li>
    <li class="grid-item">item3</li>
    <li class="grid-item">Element4</li>
    <li class="grid-item">Artikel5</li>
    <li class="grid-item">item6</li>
    <li class="grid-item">Artikel7</li>
    <li class="grid-item">Artikel 8</li>
    <li class="grid-item">Artikel9</li>
    <li class="grid-item">item10</li>
</ul>

Verwenden des ES6-Klassenschreibens:

Klasse Draggable {
    Konstruktor(Optionen) {
        this.parent = options.element; // Übergeordnetes Element this.cloneElementClassName = options.cloneElementClassName; // Klassenname des Klonelements this.isPointerdown = false;
        this.diff = { x: 0, y: 0 }; // Differenz im Verhältnis zur letzten Bewegung this.drag = { element: null, index: 0, lastIndex: 0 }; // Element ziehen this.drop = { element: null, index: 0, lastIndex: 0 }; // Element freigeben this.clone = { element: null, x: 0, y: 0 };
        dies.lastPointermove = { x: 0, y: 0 };
        this.rectList = []; // Wird verwendet, um die mit der Drag-Item-Methode getBoundingClientRect() erhaltenen Daten zu speichern this.init();
    }
    init() {
        dies.getRect();
        this.bindEventListener();
    }
    // Informationen zur Elementposition abrufen getRect() {
        diese.rectList.length = 0;
        für (const item von diesem.übergeordneten.untergeordneten Element) {
            dies.rectList.push(item.getBoundingClientRect());
        }
    }
    handlePointerdown(e) {
        // Wenn es ein Mausklick ist, reagiere nur auf die linke Taste, wenn (e.pointerType === 'mouse' && e.button !== 0) {
            zurückkehren;
        }
        wenn (e.Ziel === dieses.Elternteil) {
            zurückkehren;
        }
        dies.isPointerdown = true;
        Dies.übergeordnet.setPointerCapture(e.pointerId);
        this.lastPointermove.x = e.clientX;
        this.lastPointermove.y = e.clientY;
        dieses.drag.element = e.ziel;
        this.drag.element.classList.add('aktiv');
        dieses.clone.element = dieses.drag.element.cloneNode(true);
        dieses.clone.element.className = dieses.cloneElementClassName;
        this.clone.element.style.transition = "keine";
        const i = [].indexOf.call(dieses.übergeordnetes.untergeordnetes, dieses.drag.element);
        dies.clone.x = dies.rectList[i].left;
        dies.clone.y = dies.rectList[i].top;
        dies.drag.index = i;
        dies.drag.lastIndex = i;
        this.clone.element.style.transform = "translate3d(" + this.clone.x + "px, " + this.clone.y + "px, 0)";
        Dokument.Body.AppendChild(dieses.Klonelement);
    }
    handleZeigerbewegung(e) {
        wenn (dies.istPointerdown) {
            this.diff.x = e.clientX - this.lastPointermove.x;
            this.diff.y = e.clientY - this.lastPointermove.y;
            this.lastPointermove.x = e.clientX;
            this.lastPointermove.y = e.clientY;
            dies.clone.x += dies.diff.x;
            dies.klon.y += dies.diff.y;
            this.clone.element.style.transform = "translate3d(" + this.clone.x + "px, " + this.clone.y + "px, 0)";
            für (lass i = 0; i < this.rectList.length; i++) {
                // Kollisionserkennung, wenn (e.clientX > this.rectList[i].left && e.clientX < this.rectList[i].right &&
                    e.clientY > diese.rectList[i].oben und e.clientY < diese.rectList[i].unten) {
                    dieses.drop.element = dieses.parent.children[i];
                    dies.drop.lastIndex = i;
                    wenn (dieses.drag.element !== dieses.drop.element) {
                        wenn (dieser.drag.index < i) {
                            dieses.übergeordnetes.insertBefore(dieses.drag.element, dieses.drop.element.nextElementSibling);
                            dies.drop.index = i - 1;
                        } anders {
                            dieses.übergeordnetes.insertBefore(dieses.drag.element, dieses.drop.element);
                            dies.drop.index = i + 1;
                        }
                        dies.drag.index = i;
                        const dragRect = diese.rectList[diese.drag.index];
                        const lastDragRect = this.rectList[this.drag.lastIndex];
                        const dropRect = diese.rectList[diese.drop.index];
                        const lastDropRect = diese.rectList[diese.drop.lastIndex];
                        dies.drag.lastIndex = i;
                        this.drag.element.style.transition = "keine";
                        this.drop.element.style.transition = "keine";
                        this.drag.element.style.transform = 'translate3d(' + (lastDragRect.left - dragRect.left) + 'px, ' + (lastDragRect.top - dragRect.top) + 'px, 0)';
                        this.drop.element.style.transform = 'translate3d(' + (lastDropRect.left - dropRect.left) + 'px, ' + (lastDropRect.top - dropRect.top) + 'px, 0)';
                        this.drag.element.offsetLeft; // Neuzeichnen auslösen this.drag.element.style.transition = 'transform 150ms';
                        this.drop.element.style.transition = 'Transformation 150 ms';
                        this.drag.element.style.transform = "translate3d(0px, 0px, 0px)";
                        this.drop.element.style.transform = "translate3d(0px, 0px, 0px)";
                    }
                    brechen;
                }
            }
        }
    }
    handlePointerup(e) {
        wenn (dies.istPointerdown) {
            this.isPointerdown = falsch;
            this.drag.element.classList.remove('aktiv');
            dieses.klon.element.entfernen();
        }
    }
    handlePointercancel(e) {
        wenn (dies.istPointerdown) {
            this.isPointerdown = falsch;
            this.drag.element.classList.remove('aktiv');
            dieses.klon.element.entfernen();
        }
    }
    bindEventListener() {
        dies.handlePointerdown = dies.handlePointerdown.bind(dies);
        dies.handlePointermove = dies.handlePointermove.bind(dies);
        dies.handlePointerup = dies.handlePointerup.bind(dies);
        dies.handlePointercancel = dies.handlePointercancel.bind(dies);
        dies.getRect = dies.getRect.bind(dies);
        this.parent.addEventListener('Zeiger nach unten', this.handlePointerdown);
        this.parent.addEventListener('Zeigerbewegung', this.handlePointermove);
        this.parent.addEventListener('Zeiger nach oben', this.handlePointerup);
        this.parent.addEventListener('pointercancel', this.handlePointercancel);
        window.addEventListener('scrollen', this.getRect);
        window.addEventListener('Größe ändern', this.getRect);
        window.addEventListener('Orientierungsänderung', this.getRect);
    }
    unbindEventListener() {
        this.parent.removeEventListener('Zeiger nach unten', this.handlePointerdown);
        this.parent.removeEventListener('Zeigerbewegung', this.handlePointerbewegung);
        this.parent.removeEventListener('Zeiger nach oben', this.handlePointerup);
        this.parent.removeEventListener('Zeigerabbruch', this.handlePointerabbruch);
        window.removeEventListener('scrollen', this.getRect);
        window.removeEventListener('Größe ändern', this.getRect);
        window.removeEventListener('Ausrichtungsänderung', this.getRect);
    }
}
// Neues Draggable instanziieren({
    Element: document.querySelector('.grid'),
    cloneElementClassName: "Klon-Rasterelement"
});

Demo: jsdemo.codeman.top/html/dragga…

3. Warum nicht die HTML-Drag-and-Drop-API verwenden?

Da die native HTML Drag-and-Drop API auf Mobilgeräten nicht verwendet werden kann, wird PointerEvent Ereignis verwendet, um die Drag-Logik zu implementieren und so sowohl mit PC als auch mit Mobilgeräten kompatibel zu sein.

4. Zusammenfassung

Die Grundfunktion der Drag-and-Drop-Sortierung ist zwar implementiert, es gibt aber noch viele Mängel. Funktionen wie verschachteltes Ziehen, Ziehen über Listen hinweg und automatisches Scrollen beim Ziehen nach unten sind nicht implementiert.

Dies ist das Ende dieses Artikels über die Einzelheiten der Implementierung von Drag & Drop-Sortierung mit js. Weitere relevante Inhalte zur Implementierung von Drag & Drop-Sortierung mit js finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den verwandten Artikeln weiter unten. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Antdesign-vue kombiniert mit sortablejs, um die Funktion zum Ziehen und Sortieren von zwei Tabellen zu erreichen
  • Quellcodebeispiel für die Drag-and-Drop-Sortierung von Bildern basierend auf js
  • React.js-Komponente implementiert Drag & Drop-Sortierkomponentenfunktionsprozessanalyse
  • Elementui-Tabellenkomponente + sortablejs zum Implementieren von Beispielcode für die Zeilensortierung per Drag & Drop
  • Implementierung der Drag-and-Drop-Sortierung basierend auf dem AngularJS-Drag-and-Drop-Plugin ngDraggable.js
  • Analyse des Anwendungsbeispiels für das JS-Drag-and-Drop-Sortier-Plugin Sortable.js
  • React.js-Komponente implementiert Drag-and-Drop-Kopie und sortierbaren Beispielcode
  • JS implementiert einfachen Beispielcode zum Sortieren per Drag & Drop von Bildern

<<:  25 Beispiele für die Verwendung kreisförmiger Elemente im Webdesign

>>:  Verwenden Sie reines CSS, um einen Switch-Effekt zu erzielen

Artikel empfehlen

Installationsprozess der React Native-Umgebung

React-Native-Installationsprozess 1.npx react-nat...

Die Verwendung und Methoden von async und await in JavaScript

asynchrone Funktion und await-Schlüsselwort in JS...

So erhöhen Sie die Ladegeschwindigkeit von HTML-Seiten

(1) Reduzieren Sie HTTP-Anfragen. (Ressourcendate...

Diskussion über Web-Nachahmung und Plagiat

Einige Monate nachdem ich 2005 in die Branche eing...

Lösung für den ES-Speicherüberlauf beim Starten von Docker

Fügen Sie die Datei jvm.options zur Elasticsearch...

Detaillierte Anweisungen zur Installation von SuPHP auf CentOS 7.2

Standardmäßig wird PHP unter CentOS 7 als Apache ...

So konvertieren Sie zusätzlichen Text in HTML in Auslassungspunkte

Wenn Sie zusätzlichen Text in HTML als Auslassung...

Detaillierte Erläuterung des Befehls zum Bereinigen des MySQL-Datenbank-Binlogs

Überblick Heute werde ich hauptsächlich erklären,...

JavaScript fügt Prototyp-Methodenimplementierung für integrierte Objekte hinzu

Die Reihenfolge, in der Objekte Methoden aufrufen...

So verwenden Sie worker_threads zum Erstellen neuer Threads in nodejs

Einführung Wie im vorherigen Artikel erwähnt, gib...

Fünf Möglichkeiten zum Durchlaufen von JavaScript-Arrays

Inhaltsverzeichnis 1. for-Schleife: grundlegend u...

Feste Tabellenbreite table-layout: fest

Damit die Tabelle den Bildschirm (den verbleibende...