Praxis der Vue Global Custom-Anweisung Modal Drag

Praxis der Vue Global Custom-Anweisung Modal Drag

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-modale Komponente kann auf V-Drag eingestellt werden

...
<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 erzielen

Dies 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:
  • Details der benutzerdefinierten Vue-Anweisung
  • Eine detaillierte Anleitung zu benutzerdefinierten Anweisungen in Vue
  • Verstehen Sie die Verwendung von benutzerdefinierten Anweisungen für Vue2.x und Vue3.x und das Prinzip der Hook-Funktionen
  • Grundlegende Verwendung von benutzerdefinierten Anweisungen in Vue
  • Detaillierte Erläuterung der benutzerdefinierten Anweisungen für die Vue.js-Direktive
  • Benutzerdefinierte Vue-Anweisungen zum Erzielen eines vierseitigen Streckungs- und diagonalen Streckungseffekts beim Ziehen von Popup-Fenstern
  • Detaillierte Erläuterung der benutzerdefinierten Vue-Anweisungen

<<:  Verwendung von benutzerdefinierten Nginx-Variablen und integrierten vordefinierten Variablen

>>:  Zusammenfassung gängiger MySQL-Funktionsbeispiele [Aggregatfunktionen, Zeichenfolgen, Zahlen, Zeit- und Datumsverarbeitung usw.]

Artikel empfehlen

Ubuntu16.04 erstellt eine php5.6-Webserverumgebung

Ubuntu 16.04 installiert standardmäßig die PHP7.0...

Verwendung des Linux-Befehls ls

1. Einleitung Der Befehl ls dient zum Anzeigen de...

Lösen Sie den Konflikt zwischen Docker und VMware

1. Docker-Startproblem: Problem gelöst: Sie müsse...

Implementierung der vertikalen Zentrierung mit unbekannter Höhe in CSS

Dieser Artikel stellt hauptsächlich die Implement...

Die vollständige Liste der MIME-Typen

Was ist ein MIME-TYP? 1. Zunächst müssen wir vers...

JS implementiert einen einfachen Zähler

Verwenden Sie HTML, CSS und JavaScript, um einen ...

mysql 5.7.5 m15 winx64.zip Installations-Tutorial

So installieren und konfigurieren Sie mysql-5.7.5...

CSS realisiert den Prozessnavigationseffekt (drei Methoden)

CSS realisiert den Prozessnavigationseffekt. Der ...