Hintergrund Das Projekt, an dem ich kürzlich gearbeitet habe, wurde mit Vue2 erstellt, und das UI-Framework verwendet antdV. Im Projekt werden viele modale Dialogfelder verwendet. Dann sagte das Produkt eines Tages plötzlich: „Warum kann dieses Dialogfeld nicht verschoben werden? Es blockiert meine Sicht auf die Informationen.“ Es gibt keine Möglichkeit, wenn eine Nachfrage besteht, müssen wir es tun. Dies ist die neue Generation von Arbeitern. Zuerst habe ich auf der offiziellen Website von antdV nachgesehen, welche Konfigurationseigenschaften und -methoden es von Modal gibt und ob es Eigenschaften oder Methoden gibt, mit denen sich dieses Problem direkt lösen lässt. Ich habe jedoch keine gefunden. Der zweite Schritt bestand darin, Baidu zu fragen. Es gab einige entsprechende Blogs, aber im Allgemeinen waren sie zu unterschiedlich und schwer zu verstehen. Dann entdeckte ich eine interessante Möglichkeit, globale benutzerdefinierte Spezifikationen zu verwenden, und begann, das Problem selbst zu lösen. Umsetzungsideen Zunächst möchten wir hauptsächlich den Effekt des Verschiebens des Dialogfelds nach dem Drücken der linken Taste vervollständigen, wenn sich die Maus auf dem Kopfteil des Modalfelds befindet. Hier müssen wir das Header-Element abrufen und auf seine Methode onmousedown hören. Dann berechnen wir während der Methode onmousedown die Höhe und Breite des Dialogfelds, um Begrenzungen festzulegen, die verhindern, dass es sich vom Bildschirm wegbewegt. Dann hören wir auf die Methode document.onmousemove, um die Richtung und Entfernung der Mausbewegung zu berechnen, und passen dann die Position des Dialogfelds basierend darauf an. Code-Implementierung Vue von „vue“ importieren // Popup-Fenster Drag-Eigenschaften/** * @directive benutzerdefinierte Attribute * @todo Pop-up-Drag-Attribute * @desc V-Drag hinzufügen unter Verwendung von beliebigem HTML, das im Pop-up geladen wird * @param .ant-modal-header Die Eigenschaften der Popup-Fensterüberschrift, die zum Ziehen verwendet wird* @param .ant-modal Die zu ziehenden Eigenschaften*/ Vue.directive('drag', (el, binding, vnode, oldVnode) => { // eingefügt (el, binding, vnode, oldVnode) { Vue.nextTick(() => { const isThemeModal = el.classList.contains('grid-theme') const dialogHeaderEl = isThemeModal ? el.querySelector('.ant-tabs-bar') : document.querySelector('.ant-modal-header') const dragDom = isThemeModal ? el.querySelector('.ant-modal') : document.querySelector('.ant-modal') //dialogHeaderEl.style.cursor = 'verschieben'; dialogHeaderEl.style.cssText += ';cursor:bewegen;' // dragDom.style.cssText += ';top:0px;' // Holen Sie sich die ursprünglichen Attribute, d. h. dom element.currentStyle firefox google window.getComputedStyle(dom element, null); const sty = (Funktion () { wenn (Fenster.Dokument.aktuellerStil) { return (dom, attr) => dom.aktuellerStyle[attr] } anders { return (dom, attr) => getComputedStyle(dom, false)[attr] } })() dialogHeaderEl.onmousedown = (e) => { // Maus gedrückt, berechne den Abstand zwischen dem aktuellen Element und dem sichtbaren Bereich const disX = e.clientX - dialogHeaderEl.offsetLeft const disY = e.clientY - dialogHeaderEl.offsetTop const screenWidth = document.body.clientWidth // Aktuelle Breite des Textkörpers const screenHeight = document.documentElement.clientHeight // Höhe des sichtbaren Bereichs (sollte der Textkörperhöhe entsprechen, kann aber in manchen Umgebungen nicht ermittelt werden) const dragDomWidth = dragDom.offsetWidth // Dialogfeldbreite const dragDomheight = dragDom.offsetHeight // Dialogfeldhöhe const minDragDomLeft = dragDom.offsetLeft const maxDragDomLeft = Bildschirmbreite – dragDom.offsetLeft – dragDomWidth – (isThemeModal? 10: 0) const minDragDomTop = dragDom.offsetTop const maxDragDomTop = Bildschirmhöhe – dragDom.offsetTop – dragDomheight – (isThemeModal? 10: 0) // Holen Sie sich den Wert mit dem regulären Ausdruck px, um let styL = sty(dragDom, 'left') zu ersetzen. lass styT = sty(dragDom, 'oben') // Beachten Sie, dass im IE der erste erhaltene Wert die eigenen 50 % der Komponente sind und der Wert nach dem Verschieben px zugewiesen wird wenn (styL.includes('%')) { // eslint-disable-next-line kein nutzloses Escape styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100) // eslint-disable-next-line kein nutzloses Escape styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100) } anders { styL = +styL.replace(/\px/g, '') styT = +styT.replace(/\px/g, '') }; document.onmousemove = Funktion (e) { // Berechnen Sie die Bewegungsdistanz durch Ereignisdelegierung let left = e.clientX - disX let top = e.clientY - disY // Randverarbeitung if (-(left) > minDragDomLeft) { links = -(minDragDomLeft) } sonst wenn (links > maxDragDomLeft) { links = maxDragDomLeft } wenn (-(oben) > minDragDomTop) { oben = -(minDragDomTop) } sonst wenn (oben > maxDragDomTop) { oben = maxDragDomTop } // Aktuelles Element verschieben dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;` } Dokument.onmouseup = Funktion (e) { document.onmousemove = null document.onmouseup = null } } }) }) Komponentenaufruf ... <a-modal v-model="sichtbar" title="Eingabeaufforderung" :maskClosable="false" @cancel="handleCancle" @ok="handleOk" v-drag> <p>Möchten Sie das Feld wirklich löschen?</p> </a-modal> ... Ergebnisse erzielenDies ist das Ende dieses Artikels über die Praxis der globalen benutzerdefinierten Vue-Direktive Modal Drag. Weitere relevante Vue Modal Drag-Inhalte finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Verwendung von benutzerdefinierten Nginx-Variablen und integrierten vordefinierten Variablen
Ubuntu 16.04 installiert standardmäßig die PHP7.0...
1. Einleitung Der Befehl ls dient zum Anzeigen de...
1. Docker-Startproblem: Problem gelöst: Sie müsse...
Gespeicherte Prozeduren 1. Erstellen Sie eine ges...
Dieser Artikel stellt hauptsächlich die Implement...
Was ist ein MIME-TYP? 1. Zunächst müssen wir vers...
Fragen Sie zuerst die MySQL-Quelle ab Docker-Such...
Verwenden Sie HTML, CSS und JavaScript, um einen ...
Inhaltsverzeichnis Transaktionsisolationsebene Wa...
So installieren und konfigurieren Sie mysql-5.7.5...
Inhaltsverzeichnis 1. Ursache 2. Geräteinformatio...
Wie unten dargestellt: SELECT Anzahl(DISTINCT(a.r...
von Nehmen wir als Beispiel den im Bild gezeigten...
Bereitstellungsumgebung: Hier wird ein Docker-Con...
CSS realisiert den Prozessnavigationseffekt. Der ...