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

Detailliertes Tutorial zur Installation von ElasticSearch 6.x im Docker

Ziehen Sie zuerst das Image (oder erstellen Sie e...

Ist es notwendig, dem Img-Bild-Tag ein Alt-Attribut zuzuweisen?

Fügen Sie dem img-Bild-Tag ein Alt-Attribut hinzu?...

Detaillierter Prozess der Installation von nginx1.9.1 auf centos8

1.17.9 Wirklich leckerer Nginx-Download-Adresse: ...

JavaScript-Canvas zum Erzielen eines farbenfrohen Uhreffekts

Verwenden Sie Leinwand, um eine bunte Uhr zu schr...

So ändern Sie die CentOS-Serverzeit auf die Peking-Zeit

1. Ich habe ein VPS- und CentOS-System gekauft un...

MySQL-Trigger: Beispielanalyse zum Erstellen mehrerer Trigger

Dieser Artikel beschreibt anhand eines Beispiels ...

Erfahrung mit parallelen React-Funktionen (gleichzeitiger Front-End-Modus)

React ist eine Open-Source-JavaScript-Bibliothek,...

Detaillierte Erklärung zu sinnvollen Einstellungen des MySQL sql_mode

Sinnvolle Einstellung des MySQL sql_mode sql_mode...

So aktualisieren Sie https unter Nginx

Kaufzertifikat Sie können es beim Cloud Shield Ce...

Fünf praktische Tipps zur Gestaltung von Webformularen

1. Mobile Auswahl der Formulartexteingabe: Wenn i...

So stellen Sie nginx mit Docker bereit und ändern die Konfigurationsdatei

Nginx mit Docker bereitstellen, so einfach ist da...

So schreiben Sie eleganten JS-Code

Inhaltsverzeichnis Variable Verwenden Sie aussage...

Langsame MySQL-Abfragen und Protokolleinstellungen und -tests

1. Einleitung Durch Aktivieren des Slow Query Log...