EinführungDie aktuellen Anforderungen des Unternehmens an das Vue-Front-End-Projekt: Realisieren Sie das Ziehen von Popup-Fenstern, das Strecken um vier Seiten und das diagonale Strecken sowie die Verarbeitung der Popup-Fenstergrenzen. Ich habe die benutzerdefinierten Anweisungen von Vue verwendet, um die Datei drag.js zu schreiben und sie mit allen zu teilen, damit wir gemeinsam lernen können. Der folgende Code ist eine schematische Demo, die ich nur zu Referenzzwecken extrahiert habe. Dies ist mein erster technischer Austausch als Front-End-Neuling. Wenn es Fehler gibt, kritisieren und korrigieren Sie mich bitte! Seitenlayout<Vorlage> <div Klasse="Parameter" v-dialogDrag > <div class="title">Titel<div class="close"> <Bild src="../assets/schließen.png" alt="" > </div> </div> <div class="content">Inhaltsbereich</div> </div> </Vorlage> <style lang="less"> .parameter { Höhe: 569px; Breite: 960px; Position: absolut; links: 50%; oben: 50 %; Rand links: berechnet (-960px / 2); Rand oben: berechnet (-569px / 2); Z-Index: 999; Hintergrund: #fff; Box-Größe: Rahmenbox; Kastenschatten: 0px 12px 32px 0px rgba (0, 0, 0, 0,08); Rahmenradius: 2px; .Titel { Anzeige: Flex; Schriftgröße: 16px; Höhe: 48px; Zeilenhöhe: 48px; Hintergrund: #f5f5f5; Box-Größe: Rahmenbox; Box-Schatten: Einschub 0px -1px 0px rgba(0, 0, 0, 0,12); Rahmenradius: 2px 2px 0px 0px; Polsterung: 0 20px; Z-Index: 99; Schriftgröße: 16px; Schriftstärke: 500; Farbe: rgba(0, 0, 0, 0,85); .schließen { img { Breite: 10px; } margin-left: auto; // rechtsbündig} } .Inhalt { Anzeige: Flex; Inhalt ausrichten: zentriert; Elemente ausrichten: zentrieren; Höhe: berechnet (100 % – 48 Pixel); Box-Größe: Rahmenbox; Hintergrund: #fff; Überlauf: automatisch; } } </Stil> Die tatsächliche Wirkung des Seitenlayouts ist wie folgt: drag.js-DateiSie können die Datei drag.js global in main.js importieren oder sie separat in die Popup-Komponente importieren, um zu sehen, ob es andere Verwendungsszenarien gibt. Screenshot des Projektverzeichnisses main.js importiert drag.js global Vue von „vue“ importieren importiere ElementUI von „element-ui“; importiere „element-ui/lib/theme-chalk/index.css“; App aus „./App.vue“ importieren importiere '../drag.js' Vue.config.productionTip = falsch Vue.use(ElementUI); neuer Vue({ rendern: h => h(App), }).$mount('#app') Implementierung des Ziehens von Popup-Fenstern und BegrenzungsbeschränkungenVue von „vue“ importieren // v-dialogDrag: Popup-Fenster ziehen + horizontale Streckung + diagonale Streckung Vue.directive('dialogDrag', { binden(el) { // dialogHeaderEl ist die Titelleiste, binde das Mousedown-Ereignis zum Ziehen const dialogHeaderEl = el.querySelector('.title') // dragDom ist das an die Anweisung gebundene Dom-Element. Definieren Sie Variablen, um die Unterscheidung zu erleichtern const dragDom = el // Alle CSS-Attribute abrufen, Kompatibilitätsschreibmethode, d. h. Dom-Element.currentStyle, Firefox, Google, Window.getComputedStyle(Dom-Element, null); const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null) //Mausklickereignis definieren const moveDown = e => { // e.clientX, Y: X-, Y-Koordinaten der Maus relativ zum sichtbaren Fenster des Browsers // offsetTop, offsetLeft: Der Abstand des aktuellen Elements relativ zum oberen und linken Rand seines offsetParent-Elements. Hier hat der Titel keinen Positionierungsoffset, also ist er 0 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3s::::::333:33333333333333333333ag33333333333333333333333333333 es333333333333333333333333333333 es33 nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht dann dann dann dann aber33333333333333333333 nicht3 nicht3 nicht3 nicht3 nicht3 nicht3 nicht3 nicht3 dann3 dann3 aber3 dann3 nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht dann nichtie dasen aber aber abersossoss aberstens aberstensss aberten aber abers :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3s::::::333:33333333333333333333ag33333333333333333333333333333 es333333333333333333333333333333 es33 nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht dann dann dann dann aber33333333333333333333 nicht3 nicht3 nicht3 nicht3 nicht3 nicht3 nicht3 nicht3 dann3 dann3 aber3 dann3 nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht nicht dann nichtie dasen aber aber abersossoss aberstens aberstensss aberten aber abers ::::::::::: // Aus Kompatibilitätsgründen mit IE wenn (styL === 'auto') styL = '0px' sei styT = sty.top // 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 (sty.left.includes('%')) { styL = +document.body.clientWidth * (+styL.replace(/%/g, '') / 100) 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 } // Verschiebe das aktuelle Element dragDom.style.left = `${left + styL}px` dragDom.style.top = `${top + styT}px` // Verhindere, dass sich das Popup-Fenster bewegt, wenn die Maus angehoben wird. document.onmouseup = function () { document.onmousemove = null document.onmouseup = null } } dialogHeaderEl.onmousedown = nach unten bewegen } }) Mauszeiger-Hover-StilDas Popup-Fenster legt den Cursor nicht fest: Hover-Stil verschieben, da er sich auf den tatsächlichen Effekt des Ziehens im Browser bezieht. Wenn Sie die Verschiebung festlegen möchten, müssen Sie Randbeurteilungsbedingungen hinzufügen. Bestimmen Sie den Typ des Mauszeigers, Weitere Arten des Mauszeiger-Hoverns finden Sie bei MDN // Mouseover-Stil definieren const CURSORTYPE = { oben: 'n-resize', unten: 's-resize', links: 'w-resize', rechts: 'e-resize', // right_top wird zur einfacheren Datenverarbeitung in den folgenden Code geschrieben right_top: 'ne-resize', left_top: 'nw-Größe ändern', links_unten: 'sw-Größe ändern', rechts unten: 'se-resize', Standard: „Standard“, }; // Bestimmen Sie den Typ des Mouseover-Zeigers const checkType = obj => { const { x, y, links, oben, Breite, Höhe } = obj lass Typ wenn (x > links + Breite - 5 und el.scrollTop + y <= oben + Höhe - 5 und oben + 5 <= y) { Typ = "rechts" } sonst wenn (links + 5 > x und el.scrollTop + y <= oben + Höhe - 5 und oben + 5 <= y) { Typ = "links" } sonst wenn (el.scrollTop + y > oben + Höhe - 5 && x <= links + Breite - 5 && links + 5 <= x) { Typ = "unten" } sonst wenn (oben + 5 > y && x <= links + Breite - 5 && links + 5 <= x) { Typ = "oben" } sonst wenn (x > links + Breite - 5 und el.scrollTop + y > oben + Höhe - 5) { Typ = "rechts_unten" } sonst wenn (links + 5 > x && el.scrollTop + y > oben + Höhe - 5) { Typ = "links_unten" } sonst wenn (oben + 5 > y && x > links + Breite - 5) { Typ = "oben rechts" } sonst wenn (oben + 5 > y && links + 5 > x) { Typ = "links_oben" } Rückgabetyp || „Standard“ } Vierseitendehnung und DiagonaldehnungWährend des diagonalen Streckungsprozesses gab es eine kleine Abweichung in meinem Denken. Ich stellte fest, dass das Browserfenster diagonal in Richtung der X-Achse, der Y-Achse und der abgeschrägten Kante gestreckt werden kann, also teilte ich es zur Beurteilung in drei Situationen ein. Der eigentliche Popup-Fenstereffekt kann jedoch nur ein wenig gestreckt werden, was den Streckungsanforderungen nicht entspricht. Nachdem ich darüber nachgedacht hatte, stellte ich fest, dass die tatsächliche diagonale Streckung die Überlagerung der X- und Y-Achse und des Referenzvektors ist. Da es sich bei der diagonalen Streckung um eine Überlagerung der X-Achse und der Y-Achse handelt, erwägen wir, die Funktion zur vierseitigen Streckung zu kapseln und für die diagonale Streckung direkt die entsprechenden X- und Y-Achsen aufzurufen, um die Codemenge zu reduzieren. Bei der Datenübertragung müssen die Daten verpackt werden, da für die diagonale Streckung zwei Werte übergeben werden müssen, während für die vierseitige Streckung nur ein Wert erforderlich ist. Beispiel: Die rechte Seite überträgt die Daten // Randbedingungen bestimmen const boundageLimit = obj => { const { links, oben, Breite, Höhe, diffX, diffY, Bildschirmhöhe, Bildschirmbreite, arr } = obj if (arr[0] == 'rechts' || arr[1] == 'rechts') { if (Breite + diffX > Bildschirmbreite - links) { dragDom.style.width = Bildschirmbreite - links + 'px' } anders { dragDom.style.width = Breite + diffX + 'px' } } wenn (arr[0] == 'links' || arr[1] == 'links') { wenn (Breite - diffX > Breite + links) { dragDom.style.width = Breite + links + 'px' dragDom.style.left = - parseInt(sty.marginLeft) + 'px' } anders { dragDom.style.width = Breite - diffX + 'px' // left eigentlich = left + marginLeft. Bei der Berechnung muss marginLeft abgezogen werden. dragDom.style.left = left + diffX - parseInt(sty.marginLeft) + 'px' } } wenn (arr[0] == 'oben' || arr[1] == 'oben') { wenn (Höhe - diffY > Höhe + Spitze) { dragDom.style.height = Höhe + oben + 'px' dragDom.style.top = - parseInt(sty.marginTop) + 'px' } anders { dragDom.style.height = Höhe – diffY + „px“ // top eigentlich = top + marginTop. MarginTop muss bei der Berechnung abgezogen werden. dragDom.style.top = top + diffY - parseInt(sty.marginTop) + 'px' } } wenn (arr[0] == 'unten' || arr[1] == 'unten') { if (Höhe + diffY > Bildschirmhöhe - oben) { dragDom.style.height = Bildschirmhöhe – oben } anders { dragDom.style.height = Höhe + diffY + 'px' } } } dragDom.onmousedown = e => { const x = e.clientX const y = e.clientY const width = dragDom.clientWidth const height = dragDom.clientHeight const left = dragDom.offsetLeft const top = dragDom.offsetTop const Bildschirmbreite = document.documentElement.clientWidth || document.body.clientWidth const screenHeight = document.documentElement.clientHeight || document.body.clientHeight // dragDom.style.userSelect = "keine" let type = checkType({ x, y, links, oben, Breite, Höhe }) // Bestimmen Sie, ob es sich um eine Popup-Fensterüberschrift handelt, wenn (x > left && x < links + Breite && y > oben + 5 && y < top + dialogHeaderEl.clientHeight) { // dialogHeaderEl.onmousedown = nach unten bewegen } anders { document.onmousemove = Funktion (e) { // Standardereignisse beim Verschieben deaktivieren e.preventDefault() let endX = e.clientX let endY = e.clientY sei diffX = endX - x sei diffY = endY - y lass arr //Konvertiere den Typ in das Array-Format, um die Codebeurteilung zu vereinfachen, und rufe if (type.indexOf('_') == -1) { auf. arr = [Typ, ''] } anders { arr = Typ.split('_') } BoundaryLimit({ links, oben, Breite, Höhe, diffX, diffY, Bildschirmhöhe, Bildschirmbreite, arr }) } // Strecken endet document.onmouseup = function () { document.onmousemove = null document.onmouseup = null } } } Dehnungsinterferenz Da das Popup-Fenster <Vorlage> <div Klasse="Parameter" v-dialogDrag > <div class="title">Titel<div class="close"> <Bild src="../assets/schließen.png" alt="" > </div> </div> <div class="content">Inhaltsbereich</div> <div Klasse="rightBlank">123</div> <div Klasse="bottomBlank">456</div> </div> </Vorlage> Der Seiteneffekt nach der Änderung ist Angehängte Projektlageradresse Dies ist das Ende dieses Artikels über benutzerdefinierte Vue-Anweisungen zum Implementieren des Ziehens von Popup-Fenstern, der vierseitigen Streckung und der diagonalen Streckung. Weitere verwandte Inhalte zu benutzerdefinierten Vue-Anweisungen zum Ziehen von Popup-Fenstern 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:
|
<<: Detaillierte Installationsanleitung für das Cloud-Server-Pagoda-Panel
>>: Detaillierte Erläuterung der MySQL SQL99-Syntax für Inner Join und Non-Equivalent Join
In Google Chrome werden Sie nach der erfolgreiche...
In diesem Artikelbeispiel wird der spezifische Co...
Inhaltsverzeichnis Asynchrones Durchlaufen Asynch...
Der folgende Beispielcode stellt die Prinzipien d...
Vorwort Ich habe kürzlich etwas über MySQL-Indize...
1. Gründe Wenn das System Centos7.3 ist, ist die ...
Obwohl Mac-Systeme mit PHP und Apache ausgeliefer...
Dieser Artikel veranschaulicht anhand von Beispie...
WeChat Mini-Programm - QR-Code-Generator Download...
Vorwort Der Grund für das Schreiben dieses Artikel...
Ich habe vor Kurzem ein Testserver-Betriebssystem...
Konfigurationsmethode für die installationsfreie ...
Inhaltsverzeichnis Linux - Verwenden Sie MyCat, u...
1. Setzen Sie das Listensymbol list-style-type: A...
1. Übersicht mysql-monitor MySQL-Überwachungstool...