Bevor wir JSX zum Erstellen eines Komponentensystems verwenden, lernen wir anhand eines Beispiels das Implementierungsprinzip und die Logik der Komponente kennen. Hier verwenden wir eine Karussellkomponente als Lernbeispiel. Der englische Name des Karussells ist Carousel, was Karussell bedeutet. Der Code, den wir im vorherigen Artikel „Verwenden von JSX zum Festlegen des Markup-Komponentenstils“ implementiert haben, kann eigentlich nicht als Komponentensystem bezeichnet werden. Er kann höchstens als einfache Kapselung von DOM dienen und uns ermöglichen, DOM anzupassen. Um diese Karussellkomponente zu erstellen, sollten wir mit der einfachsten DOM-Operation beginnen. Verwenden Sie DOM-Operationen, um zunächst die gesamte Karussellfunktion zu implementieren, und überlegen Sie dann, wie Sie sie Schritt für Schritt in ein Komponentensystem integrieren.
Da es sich um ein Karussell handelt, müssen wir natürlich Bilder verwenden. Deshalb habe ich hier 4 Open-Source-Bilder von Unsplash vorbereitet. Natürlich können Sie diese auch durch Ihre eigenen Bilder ersetzen. Zuerst fügen wir diese vier Bilder in eine Galerie lassen = [ 'https://source.unsplash.com/Y8lCoTRgHPE/1142x640', 'https://source.unsplash.com/v7daTKlZzaw/1142x640', 'https://source.unsplash.com/DlkF4-dbCOU/1142x640', 'https://source.unsplash.com/8SQ6xjkxkCo/1142x640', ]; Unser Ziel ist es, diese 4 Bilder rotieren zu lassen. Einkapselung der unteren KomponentenschichtZuerst müssen wir den zuvor geschriebenen Code kapseln, damit wir mit dem Schreiben dieser Komponente beginnen können.
Auf diese Weise haben wir den Code des zugrunde liegenden Frameworks unserer Komponente gekapselt. Das Codebeispiel lautet wie folgt: Funktion createElement(Typ, Attribute, ...Kinder) { //Element erstellen let element; wenn (Typ von Typ === 'Zeichenfolge') { Element = neuer ElementWrapper(Typ); } anders { Element = neuer Typ(); } //Attribute für (Name in Attributen lassen) aufhängen { element.setAttribute(name, Attribute[name]); } //Alle untergeordneten Elemente anhängen für (let child of children) { wenn (Typ des untergeordneten Elements === 'Zeichenfolge') untergeordnetes Element = neuer TextWrapper(untergeordnetes Element); element.appendChild(Kind); } //Schließlich ist unser Element ein Knoten// also können wir direkt das Return-Element zurückgeben; } Exportklasse Komponente { Konstruktor() { } // Die Attribute des Elements mounten setAttribute(name, attribute) { this.root.setAttribute(Name, Attribut); } // Element untergeordnetes Element mounten appendChild(child) { Kind.mountTo(diese.Wurzel); } // Das aktuelle Element mounten mountTo(parent) { übergeordnetes Element.anhängenKind(diese.Wurzel); } } Klasse ElementWrapper erweitert Komponente { // Konstruktor // DOM-Knoten erstellen Konstruktor (Typ) { this.root = document.createElement(Typ); } } Klasse TextWrapper erweitert Komponente { // Konstruktor // DOM-Knoten erstellen Konstruktor (Inhalt) { this.root = document.createTextNode(Inhalt); } } Implementierung von Carousel Als nächstes werden wir mit der Transformation unseres Nachdem wir die Komponente geerbt haben, müssen wir unsere Komponente aus Hier können wir offiziell mit der Entwicklung von Komponenten beginnen, aber es wäre sehr mühsam, wenn wir sie jedes Mal manuell mit webpack verpacken müssten. Um uns das Debuggen des Codes zu erleichtern, installieren wir hier den Webpack-Entwicklungsserver, um dieses Problem zu lösen. Führen Sie den folgenden Code aus, um npm install --save-dev webpack-dev-server webpack-cli Das obige Ergebnis beweist, dass unsere Installation erfolgreich war. Wir konfigurieren besser den laufenden Ordner unseres Webpack-Servers. Hier verwenden wir die gepackte Um dies festzulegen, müssen wir unsere modul.exporte = { Eintrag: './main.js', Modus: "Entwicklung", devServer: { Inhaltsbasis: "./dist", }, Modul: { Regeln: { Test: /\.js$/, verwenden: { Lader: 'babel-loader', Optionen: Voreinstellungen: ['@babel/preset-env'], Plugins: [['@babel/plugin-transform-react-jsx', { pragma: 'createElement' }]], }, }, }, ], }, }; Jeder, der schon einmal Vue oder React verwendet hat, weiß, dass man zum Starten eines lokalen Debugging-Umgebungsservers nur den Befehl npm ausführen muss. Auch hier legen wir einen Schnellstartbefehl fest. Öffnen Sie unsere { "Name": "jsx-Komponente", "version": "1.0.0", "Beschreibung": "", "main": "index.js", "Skripte": { "test": "echo \"Fehler: kein Test angegeben\" && exit 1", "Start": "WebPack-Server" }, "Autor": "", "Lizenz": "ISC", "devAbhängigkeiten": { "@babel/core": "^7.12.3", "@babel/plugin-transform-react-jsx": "^7.12.5", "@babel/preset-env": "^7.12.1", "babel-loader": "^8.1.0", "webpack": "^5.4.0", "webpack-cli": "^4.2.0", "webpack-dev-server": "^3.11.0" }, "Abhängigkeiten": {} } Auf diese Weise können wir den folgenden Befehl direkt ausführen, um unseren lokalen Debugging-Server zu starten! npm starten Nachdem wir dies aktiviert haben, wird jede Änderung einer Datei überwacht, sodass die Datei in Echtzeit für uns verpackt wird, was für die Fehlerbehebung sehr praktisch ist. Wie in der Abbildung oben gezeigt, lautet unsere lokale Echtzeit-Serveradresse Hierbei ist zu beachten, dass wir das laufende Verzeichnis in „dist“ geändert haben, da unsere vorherige Datei „main.html“ im Stammverzeichnis abgelegt war. Daher können wir diese HTML-Datei auf „localhost:8080“ nicht finden. Daher müssen wir „main.html“ in das Verzeichnis „dist“ verschieben und den Importpfad von „main.js“ ändern. <!-- main.html-Code --> <Körper></Körper> <script src="./main.js"></script> Nachdem wir den Link geöffnet hatten, stellten wir fest, dass die Karussellkomponente erfolgreich gemountet wurde, was beweist, dass bei unserer Codekapselung kein Problem vorliegt. Als nächstes werden wir mit der Implementierung unserer Karussellfunktion fortfahren. Zuerst müssen wir unsere Bilddaten an unsere Karussellkomponente übergeben. lass a = <Karussell src={gallery}/>; Auf diese Weise wird unser Daher müssen wir die Daten dieser Quelle separat speichern und sie später zum Generieren der Bildanzeigeelemente unseres Karussells verwenden. In React werden Da wir die eingehenden Attribute in der Variable Dann müssen wir diese Attribute in Klasseneigenschaften speichern, anstatt sie auf Elementknoten zu mounten. Daher müssen wir unsere Wir müssen den Wert des src-Attributs abrufen, bevor die Komponente gerendert wird. Daher müssen wir den Render-Trigger in Klasse Karussell erweitert Komponente { // Konstruktor // DOM-Knoten erstellen konstruktor() { super(); diese.attribute = Objekt.erstellen(null); } setAttribute(name, wert) { this.attributes[name] = Wert; } rendern() { Konsole.log(diese.Attribute); gibt document.createElement('div') zurück; } mountTo() { übergeordnetes Element.anhängenKind(dieses.render()); } } Schauen wir uns als Nächstes die tatsächlichen Laufergebnisse an, um zu sehen, ob wir die Bilddaten abrufen können. Als nächstes werden wir diese Bilder anzeigen. Hier müssen wir die Rendermethode ändern und die Logik zum Rendern des Bildes hier hinzufügen:
Klasse Karussell erweitert Komponente { // Konstruktor // DOM-Knoten erstellen konstruktor() { super(); diese.attribute = Objekt.erstellen(null); } setAttribute(name, wert) { this.attributes[name] = Wert; } rendern() { dies.root = Dokument.createElement('div'); für (let Bild von this.attributes.src) { let child = document.createElement('img'); child.src = Bild; dies.root.appendChild(Kind); } gib dies.root zurück; } mountTo(übergeordnet) { übergeordnetes Element.anhängenKind(dieses.render()); } } Auf diese Weise können wir sicherstellen, dass unsere Bilder auf unserer Seite korrekt angezeigt werden. Typografie und AnimationZunächst einmal sind die Elemente unserer Bilder alle img-Tags, aber wenn wir dieses Tag verwenden, kann es gezogen werden, wenn wir klicken und ziehen. Dies kann natürlich gelöst werden, aber um dieses Problem einfacher zu lösen, ersetzen wir das img durch ein div und verwenden dann das Hintergrundbild. Standardmäßig hat ein Div weder eine Breite noch eine Höhe, daher müssen wir der Div-Ebene der Komponente eine Klasse namens // Haupt.js Klasse Karussell erweitert Komponente { // Konstruktor // DOM-Knoten erstellen konstruktor() { super(); diese.attribute = Objekt.erstellen(null); } setAttribute(name, wert) { this.attributes[name] = Wert; } rendern() { dies.root = Dokument.createElement('div'); this.root.addClassList('carousel'); // Karussellklasse hinzufügen für (let Bild von this.attributes.src) { let child = document.createElement('div'); child.backgroundImage = `url('${picture}')`; dies.root.appendChild(Kind); } gib dies.root zurück; } mountTo(übergeordnet) { übergeordnetes Element.anhängenKind(dieses.render()); } } <!-- main.html --> <Kopf> <Stil> .Karussell > div { Breite: 500px; Höhe: 281px; Hintergrundgröße: enthalten; } </Stil> </Kopf> <Körper></Körper> <script src="./main.js"></script> Hier beträgt unsere Breite 500 Pixel, aber wenn wir eine Höhe von 300 Pixel einstellen, stellen wir fest, dass das Bild am unteren Rand des Bildes wiederholt wird. Dies liegt daran, dass das Verhältnis des Bildes Durch proportionale Berechnung können wir also eine Höhe wie folgt erhalten: 500 ÷ 1900 × 900 = 281. xxx 500\div1900\times900 = 281.xxx 500÷1900×900=281.xxx. Die einer Breite von 500 Pixeln entsprechende Höhe beträgt also etwa 281 Pixel. Auf diese Weise können unsere Bilder normal in einem Div angezeigt werden. Es ist offensichtlich unmöglich, dass ein Karussell alle Bilder anzeigt. Die uns bekannten Karussells zeigen die Bilder einzeln an. Zuerst müssen wir dafür sorgen, dass die Karussell-Div-Elemente außerhalb der Bilder eine Box mit der gleichen Breite und Höhe wie sie haben, und dann legen wir
Dann haben wir noch ein weiteres Problem. Karussellbilder gleiten im Allgemeinen nach links und rechts und selten nach oben und unten. Die Bilder hier sind jedoch standardmäßig von oben nach unten angeordnet. Hier müssen wir also die Anordnung der Bilder anpassen, damit diese in einer Reihe aufgenommen werden. Hier können wir den normalen Ablauf verwenden, wir müssen also nur ein <Kopf> <Stil> .Karussell { Breite: 500px; Höhe: 281px; Leerzeichen: Nowrap; Überlauf: versteckt; } .Karussell > div { Breite: 500px; Höhe: 281px; Hintergrundgröße: enthalten; Anzeige: Inline-Block; } </Stil> </Kopf> <Körper></Körper> <script src="./main.js"></script> Als nächstes implementieren wir den automatischen Karusselleffekt. Zuvor fügen wir diesen Bildelementen einige Animationseigenschaften hinzu. Hier verwenden wir
<Kopf> <Stil> .Karussell { Breite: 500px; Höhe: 281px; Leerzeichen: Nowrap; Überlauf: versteckt; } .Karussell > div { Breite: 500px; Höhe: 281px; Hintergrundgröße: enthalten; Anzeige: Inline-Block; Übergang: Leichtigkeit 0,5 s; } </Stil> </Kopf> <Körper></Körper> <script src="./main.js"></script> Implementieren Sie ein automatisches Karussell Mit der Eigenschaft des Animationseffekts können wir unseren Timer in JavaScript hinzufügen, um unser Bild alle drei Sekunden zu wechseln. Wir können dieses Problem lösen, indem wir Aber wie können wir die Bilder drehen oder bewegen? Haben Sie beim Nachdenken über Bewegung in HTML schon einmal darüber nachgedacht, welche Attribute in CSS es uns ermöglichen, Elemente zu verschieben? Das ist richtig, verwenden Sie Dadurch wird jedoch nur ein Bild verschoben. Wenn wir also ein zweites Mal verschieben müssen, um zum dritten Bild zu gelangen, müssen wir jedes Bild um 200 % versetzen und so weiter. Wir benötigen also einen Wert für die aktuelle Seitenzahl, genannt Klasse Karussell erweitert Komponente { // Konstruktor // DOM-Knoten erstellen konstruktor() { super(); diese.attribute = Objekt.erstellen(null); } setAttribute(name, wert) { this.attributes[name] = Wert; } rendern() { dies.root = Dokument.createElement('div'); this.root.classList.add('Karussell'); für (let Bild von this.attributes.src) { let child = document.createElement('div'); child.style.backgroundImage = `url('${picture}')`; dies.root.appendChild(Kind); } lass Strom = 0; setzeIntervall(() => { lass Kinder = diese.Wurzel.Kinder; ++aktuell; für (lass Kind von Kindern) { untergeordneter Stil.Transform = ``translateX(-${100 * current}%)``; } }, 3000); gib dies.root zurück; } mountTo(übergeordnet) { übergeordnetes Element.anhängenKind(dieses.render()); } } Wir haben hier ein Problem festgestellt. Das Karussell hält nicht an und verschiebt sich ständig nach links. Und wenn wir zum letzten Bild springen müssen, müssen wir zum vorherigen Bild zurückkehren. Um dieses Problem zu lösen, können wir einen mathematischen Trick anwenden. Wenn wir möchten, dass eine Zahl immer wieder zwischen 1 und N schwankt, müssen wir sie nur modulo n machen . In unserem Element ist die Länge der untergeordneten Elemente 4, wenn also unser aktueller Wert 4 erreicht, ist der Rest von 4 ÷ 4 4\div4 4÷4 0. Jedes Mal, wenn wir den aktuellen Wert auf den Rest des aktuellen Werts geteilt durch die Länge der untergeordneten Elemente setzen, kann eine Endlosschleife entstehen.
Wenn wir diese Logik zur Implementierung unseres Karussells verwenden, können unsere Bilder tatsächlich in einer Endlosschleife ablaufen, aber wenn wir sie ausführen und uns das genauer ansehen, stellen wir ein weiteres Problem fest. Nachdem wir das letzte Bild abgespielt haben, wechseln wir schnell zum ersten Bild und sehen einen schnellen Rückspuleffekt. Das ist in der Tat nicht so gut. Was wir wollen, ist, dass nach Erreichen des letzten Bildes das erste Bild direkt mit dem hinteren verbunden wird. Dann versuchen wir gemeinsam, dieses Problem zu lösen. Nach der Beobachtung können wir immer nur zwei Bilder gleichzeitig auf dem Bildschirm sehen. Eigentlich müssen wir also nur diese beiden Bilder an die richtige Position verschieben. Wir müssen also das aktuelle Bild finden, das wir sehen, und das nächste Bild, und dann jedes Mal, wenn wir zum nächsten Bild wechseln, das nächste Bild finden und das nächste Bild an die richtige Position verschieben. Vielleicht sind Sie an dieser Stelle noch immer ein wenig verwirrt, aber das macht nichts. Lassen Sie uns die Logik klären. Holen Sie sich den Index des aktuellen Bildes und den Index des nächsten Bildes
Berechnen Sie die Entfernung, um die das Bild verschoben wird, und halten Sie ein Bild hinter dem aktuellen Bild bereit, das darauf wartet, verschoben zu werden
Das zweite Bild ist an seinem Platz und Sie können den Karusselleffekt starten
Als nächstes übersetzen wir die obige Logik in JavaScript: Klasse Karussell erweitert Komponente { // Konstruktor // DOM-Knoten erstellen konstruktor() { super(); diese.attribute = Objekt.erstellen(null); } setAttribute(name, wert) { this.attributes[name] = Wert; } rendern() { dies.root = Dokument.createElement('div'); this.root.classList.add('Karussell'); für (let Bild von this.attributes.src) { let child = document.createElement('div'); child.style.backgroundImage = `url('${picture}')`; dies.root.appendChild(Kind); } // Index des aktuellen Bildes sei currentIndex = 0; setzeIntervall(() => { lass Kinder = diese.Wurzel.Kinder; // Index des nächsten Bildes let nextIndex = (currentIndex + 1) % children.length; // Der Knoten des aktuellen Bildes let current = children[currentIndex]; // Der Knoten des nächsten Bildes let next = children[nextIndex]; // Bildanimation deaktivieren next.style.transition = 'none'; // Verschiebe das nächste Bild an die richtige Position next.style.transform = `translateX(${-100 * (nextIndex - 1)}%)`; // Führe den Karusselleffekt aus und verzögere einen Frame um 16 Millisekunden setTimeout(() => { // Animation in CSS aktivieren next.style.transition = ''; // Verschieben Sie zuerst das aktuelle Bild von der aktuellen Position weg current.style.transform = `translateX(${-100 * (currentIndex + 1)}%)`; // Verschiebe das nächste Bild an die aktuell angezeigte Position next.style.transform = `translateX(${-100 * nextIndex}%)`; // Abschließend den Index der aktuellen Position aktualisieren aktuellerIndex = nächsterIndex; }, 16); }, 3000); gib dies.root zurück; } mountTo(übergeordnet) { übergeordnetes Element.anhängenKind(dieses.render()); } } Wenn wir zuerst Implementieren Sie ein Drag & Drop-KarussellGenerell gilt, dass unser Karussell-Bauteil neben der automatischen Karussell-Funktion auch per Drag & Drop mit der Maus gedreht werden kann. Lassen Sie uns also gemeinsam diese manuelle Karussellfunktion implementieren. Da es einen gewissen Konflikt zwischen dem automatischen und dem manuellen Karussell gibt, müssen wir den Code des automatischen Karussells auskommentieren, den wir zuvor implementiert haben. Dann können wir die untergeordneten Elemente (untergeordnete Elemente) unter dieser Karussellkomponente, d. h. die Elemente aller Bilder, verwenden, um unsere manuelle Drag-Karussell-Funktion zu implementieren. Bei der Drag-Funktion geht es hauptsächlich darum, dass unser Bild gezogen wird, daher müssen wir dem Bild Maus-Abhörereignisse hinzufügen. Wenn wir in Arbeitsschritten denken, können wir eine Logik entwickeln: Dazu müssen wir unbedingt zuerst mit der Maus über das Bild fahren und dann auf das Bild klicken. Das erste Ereignis, das wir überwachen müssen, muss also this.root.addEventListener('mousedown', Ereignis => { Konsole.log('Maus gedrückt'); }); this.root.addEventListener('Mausbewegung', Ereignis => { console.log('Mausbewegung'); }); this.root.addEventListener('mouseup', Ereignis => { Konsole.log('Maus hoch'); }); Nach der Ausführung des obigen Codes sehen wir in der Konsole, dass wir kontinuierlich Daher müssen wir die Ereignisse „Mousemove“ und „Mouseup“ in die Rückruffunktion des Ereignisses „Mousedown“ einfügen, damit wir die Bewegungs- und Freigabeaktionen beim Drücken der Maus korrekt überwachen können. Wir müssen auch berücksichtigen, dass wir, wenn wir die Maus nach oben bewegen, die beiden Abhörereignisse „mousemove“ und „mouseup“ stoppen müssen. Daher müssen wir eine Funktion verwenden, um sie separat zu speichern. this.root.addEventListener('mousedown', Ereignis => { Konsole.log('Maus gedrückt'); lass Bewegung = Ereignis => { console.log('Mausbewegung'); }; nachlassen = Ereignis => { this.root.removeEventListener('mousemove', bewegen); this.root.removeEventListener('mouseup', hoch); }; this.root.addEventListener('mousemove', bewegen); this.root.addEventListener('mouseup', hoch); }); Hier entfernen wir die Ereignisse mousemove und mouseup beim Mouseup. Dies ist der grundlegende Code, den wir normalerweise beim Ziehen verwenden. Wir werden jedoch auf ein anderes Problem stoßen. Wenn wir nach dem Klicken, Ziehen und Loslassen der Maus die Maus erneut über das Bild bewegen, wird unser Mousemove-Ereignis immer noch ausgelöst. Dies liegt daran, dass unsere Mausbewegung an Wir können diese beiden Ereignisse also direkt im this.root.addEventListener('mousedown', Ereignis => { Konsole.log('Maus gedrückt'); lass Bewegung = Ereignis => { console.log('Mausbewegung'); }; nachlassen = Ereignis => { document.removeEventListener('mousemove', verschieben); document.removeEventListener('mouseup', hoch); }; document.addEventListener('mousemove', bewegen); document.addEventListener('mouseup', hoch); }); Mit diesem vollständigen Überwachungsmechanismus können wir versuchen, die Bewegungsfunktion des Karussells in Mousemove zu implementieren. Lassen Sie uns die Logik dieser Funktion klären: Dazu müssen wir zunächst die Position der Maus kennen. Hier können wir this.root.addEventListener('mousedown', Ereignis => { lass Kinder = diese.Wurzel.Kinder; Lassen Sie startX = event.clientX; lass Bewegung = Ereignis => { lass x = event.clientX - startX; für (lass Kind von Kindern) { untergeordneter Stil.Übergang = "keine"; untergeordneter Stil.Transform = ``translateX(${x}px)``; } }; nachlassen = Ereignis => { document.removeEventListener('mousemove', verschieben); document.removeEventListener('mouseup', hoch); }; document.addEventListener('mousemove', bewegen); document.addEventListener('mouseup', hoch); }); Nun, hier haben wir zwei Probleme festgestellt: Beim ersten Klicken und Ziehen ist die Startposition des Bildes richtig, beim erneuten Klicken ist die Position des Bildes jedoch falsch. Wenn wir das Bild nach dem Ziehen der Maustaste loslassen, bleibt es an der Position, an der das Ziehen endet. Wenn wir das Bild in einer normalen Karussellkomponente jedoch über eine bestimmte Position hinaus ziehen, wird es automatisch zum nächsten Bild gedreht. Um diese beiden Probleme zu lösen, können wir folgendermaßen rechnen, da wir eine Karussellkomponente erstellen. Gemäß den allgemeinen Karussellkomponenten wird das Bild jetzt zum nächsten Bild gedreht, wenn wir es an eine Position ziehen, die größer als die Hälfte des Bildes ist. Wenn es weniger als die Hälfte der Position ist, wird es an die Position des aktuell gezogenen Bildes zurückgebracht. Gemäß einer solchen Anforderung müssen wir eine Wenn wir die Maus bewegen, müssen wir zunächst berechnen, wie weit sich das aktuelle Bild vom Startpunkt entfernt hat. Dies lässt sich mit N * 500 berechnen, wobei N this.root.addEventListener('mousedown', Ereignis => { lass Kinder = diese.Wurzel.Kinder; Lassen Sie startX = event.clientX; lass Bewegung = Ereignis => { lass x = event.clientX - startX; für (lass Kind von Kindern) { untergeordneter Stil.Übergang = "keine"; child.style.transform = ``translateX(${x - current * 500}px)``; } }; nachlassen = Ereignis => { lass x = event.clientX - startX; aktuell = aktuell – Math.round(x / 500); für (lass Kind von Kindern) { untergeordneter Stil.Übergang = ''; untergeordneter Stil.Transform = ``translateX(${-current * 500}px)``; } document.removeEventListener('mousemove', verschieben); document.removeEventListener('mouseup', hoch); }; document.addEventListener('mousemove', bewegen); document.addEventListener('mouseup', hoch); });
Nachdem wir dies getan haben, können wir unsere Bilder durch Ziehen drehen. Wenn wir jedoch zum letzten Bild ziehen, stellen wir fest, dass nach dem letzten Bild ein leerer Bereich ist und das erste Bild nicht mit dem letzten verbunden ist. Dann werden wir diese Funktion verbessern. Dies ist eigentlich unserem automatischen Karussell sehr ähnlich. Als wir das automatische Karussell erstellten, wussten wir, dass wir bei jedem Karussellwechsel höchstens zwei Bilder sehen konnten. Die Wahrscheinlichkeit, drei Bilder zu sehen, war sehr gering, da die Breite unseres Karussells im Verhältnis zu unserer Seite sehr klein war. Dieses Problem würde nicht auftreten, wenn der Benutzer nicht genügend Platz hätte, um zum zweiten Bild zu ziehen. Auf diesen Faktor gehen wir hier jedoch nicht ein. Wir sind sicher, dass wir bei jedem Ziehen nur zwei Bilder sehen, daher können wir das Drag-Karussell auch wie das automatische Karussell handhaben. Allerdings gibt es hier einen Unterschied: Beim automatischen Drehen der Bilder bewegen sich die Bilder nur in eine Richtung, entweder nach links oder nach rechts. Wir können es aber manuell nach links oder rechts ziehen, und das Bild kann in jede beliebige Richtung verschoben werden. Daher können wir den automatischen Karussellcode nicht direkt verwenden, um diese Funktion zu implementieren. Die Logik der Endlosschleife am Anfang und Ende des Karussells müssen wir selbst nacharbeiten.
Durch diese Formel können wir die Zeigerposition der vorherigen und nächsten Bilder im Array erhalten. Wir haben die gesamte Logik ausgeklärt. Move = Ereignis => { sei x = event.clientX - startx; Sei Current = Position - Math.Round (x / 500); für (let offset von [-1, 0, 1]) { lass pos = Strom + Offset; // Berechnen Sie den Index des Bildes pos = (pos + Kinder.Length) % Kinder.Length; console.log ('pos', pos); Kinder [pos] .style.transition = 'keine'; Kinder [pos] .style.transform = `translatex ($ {-pos * 500 + offset * 500 + (x % 500)} px)`; } };
Schließlich gibt es ein kleines Problem. Dieses Problem wird durch unsere Wir müssen nur Hier gibt es tatsächlich einige Probleme, da wir die Logik im Mausup -Event noch nicht geändert haben. Schauen wir uns dann an, wie wir die Logik in up implementieren sollten. Was wir hier ändern müssen, ist der Code der für die Schleife bei Kindern. Die Logik von UP ist im Grunde die gleiche wie die von Move, aber es gibt ein paar Dinge, die sich verändern müssen: Zunächst können wir unser Übergangsverbot entfernen und in der Transformation nicht benötigt werden, da das Bild nicht benötigt wird, um die Position unserer Maus zu befolgen, die die Position unserer Maus befolgen Dies liegt an den Eigenschaften unserer Übereinstimmung ( Endlich sieht unser Code so aus: lass up = event => { sei x = event.clientX - startx; Position = Position - Math.Round (x / 500); für (let offset von [0, -math.sign (math.round (x / 500) - x + 250 * math.sign (x))]) { Sei POS = Position + Offset; // Berechnen Sie den Index des Bildes pos = (pos + Kinder.Length) % Kinder.Length; Kinder [pos] .style.transition = ''; Kinder [pos] .style.transform = `Translatex ($ {-pos * 500 + offset * 500} px)`; } document.removeEventListener('mousemove', verschieben); document.removeEventListener ('mauseup', up); }; Nachdem wir die UP -Funktion geändert haben, haben wir die manuelle Karussellkomponente wirklich abgeschlossen. Dies ist das Ende dieses Artikels, wie Sie JSX verwenden, um die Karussellkomponente zu implementieren (Front-End-Komponenten). Das könnte Sie auch interessieren:
|
<<: Erste Schritte mit GDB unter Linux
>>: Die perfekte Lösung für das MySql-Versionsproblem sql_mode=only_full_group_by
<br />Als sich das Denken in Ost und West sp...
1. Einleitung MySQL-Sperren können je nach Umfang...
Aufgrund von Unternehmensanforderungen müssen zwe...
1. Voraussetzungen Bei der Entwicklung von Front-...
Designprinzipien für die Open-Source-Datenbankarc...
Dieser Artikel soll vor allem Anfängern einige gr...
Inhaltsverzeichnis Einleitung Nginx-Dockerdatei N...
Um eine Tabelle in HTML zu zeichnen, verwenden Si...
Inhaltsverzeichnis MySQL-Indexoptimierung – Pagin...
In diesem Artikelbeispiel wird der spezifische Ja...
1. Befehlseinführung Der Lesebefehl ist ein integ...
Inhaltsverzeichnis 1. Einführung in die Linux-Sys...
MySQL ist ein relationales Datenbankverwaltungssy...
Normalerweise besuche ich gerne die Sonderseiten ...
Grundkenntnisse der responsiven Layoutentwicklung...