Bei der Entwicklung einfacher Webprojekte, die die Benutzerinteraktion einbeziehen, wird das, wie am besten, um den Statusänderungen in CSS zu steuern, zum Nachdenken an Nahrung. Wenn der Benutzer ein Akkordeon ausdehnt oder ein Menü umgibt, wie können sich die Änderungen der CSS-Style anwendet? Eine populäre Lösung beinhaltet standardmäßige Klassen, ein Namenskonvention, das Klassennamen wie z ist aktiv oder ist erweitert als Stilhaken.
Diese statistischen Klassen würden normalerweise in JavaScript verwaltet. Laden Sie die Mock-Android-App herunter und öffnen Sie das Website-Vorlage Verzeichnis in Ihrem Texteditor und Sie können das für sich selbst in sehen dev / js / main.js .
Eine Sache, die Sie hier wissen, ist, dass es viele doppelte Code-Snipps gibt, die alle sehr ähnliche Klasse auslösen. Vermutlich, wenn dieses Projekt in der Größe wachsen würde, würde dies also die Menge an Duplikaten. Ein wesentlich effizienterer Ansatz wäre stattdessen, um eine einzige JavaScript-Funktion zu schreiben, die dieselbe Aufgabe ausführt und immer wieder wiederverwendet werden kann - jedoch auf unterschiedlichen statistischen Klassen auf verschiedenen Elementen umgeschaltet werden. In diesem Tutorial erforschen wir, wie Sie genau das tun können.
So beginnen Sie in Ihrer Konsole, CD in 'Website-Template' und ausgeführt npm install. So installieren Sie die Node-Abhängigkeiten des Projekts. Wir arbeiten in der anwenden Verzeichnis von hier aus raus.
Im index.html. finde das .js-Beschreibung. Element auf Zeile 103 und fügen Sie die unteren HTML5-Datenattribute an. Wir verwenden dieses Muster, um Informationen zu speichern, wann jsdecription. Es wird geklickt, unsere wiederverwendbare Funktion wird die Klasse kennen, die wir wechseln möchten, und die Elemente, mit denen er umgeschaltet werden soll.
data-class="is-active" data-class-element ="js-description-slide, js-home-slide"
In dem js. Verzeichnis, erstellen Sie eine neue Datei angerufen Data-Class.js. . Hier bauen wir unsere wiederverwendbare Funktion. Im Inneren schreiben Sie einen IIFE (sofort aufgerufene Funktionsausdruck), um unseren Code einzukapseln und dann das importieren nächstes Helfer, den wir später im Tutorial verwenden werden.
(Funktion () {var closed parent = erfordern ("../../ node_modules / orionjs / helfs / contlestparent.js");
}) ();
Unter dem Helper-Import müssen wir einen Nodelist aller Elemente mit erstellen Datenklasse Attribute, da dies das einzige Attribut ist, das nicht optional ist. Als nächstes gehen wir dann mit einem Klassiker durch ZUM Schleife, damit wir auf jedes einzelne Element zugreifen können.
var elems = dokument .queryselectorall ("[Datenklasse]"), a; für (a = 0; A & lt; elems.length; A ++) {
}
Innerhalb der ZUM LOOP, Fügen Sie einen Ereignis-Listener hinzu, um auf "Click-Events anzuschauen, also wissen wir, wann der Benutzer auf das Element geklickt hat, das wir auslösen möchten, um die Klasse Toggles auszulösen (aka das Triggerelement). Rufen Sie das an ProcessChange () Funktion und bestehen Sie einen Verweis auf das angeklickte Element, das innerhalb des Umfangs der Funktion über die zugänglich ist Dies Stichwort.
elems [a] .addeventListener ("klicken", function () {
veranstaltet (dies); });
Direkt unter dem Click-Event-Listener, fügen Sie einen weiteren hinzu, um auf die Presse der eingeben Taste und dann das gleiche ausführen ProcessChange () Funktion. Wir fügen Unterstützung für Tastaturereignisse hinzu, um die Erreichbarkeit zu verbessern, indem Sie Benutzer in Betracht ziehen, die keine Zeigegeräte wie eine Maus verwenden können.
ELEMS [A] .addeventListener ("Tastendruck", Funktion (E) {
if (e.was === 13) {e.PreventDefault (); veranstaltet (dies);
}});
Das Doppelklick auf ein Element hebt den gesamten Text oft darin hervor. Wenn wir dem Trigger-Element Logik hinzufügen, wenn diese Funktionalität angeklickt hat, ist etwas, das wir verhindern möchten. Dazu füge ein Maus nach unten Ereignislistener, um die Ereignisse anzurufen Standard verhindern() Methode und Abbrechen des Standardverhaltens.
ELEMS [A] .addeventListener ("Mousedown", Funktion (E) {
e.PreventDefault (); });
Gleich nach dem. nächstes Importieren, erstellen Sie eine Funktion angerufen ProcessChange () das akzeptiert ein Element. Dies ist die gleiche Funktion, auf die in den vorherigen Schritten bezeichnet wird, und hält alle unsere Logik für die Verarbeitungsklasse auf das Zielelement.
Schnappen Sie sich innerhalb der Funktion den Inhalt der Elemente Datenklasse Attribut und in ein Array aufteilen. Dies ist, um mehrere Kommas getrennte Klassen innerhalb des einzelnen Datenattributs zu ermöglichen.
VAR-ProcessKange = Funktion (ELEM) {VAR-DataClass = ELEM .Dataset.CLASS.Split (",");
}
Nächstes, in der Funktion, überprüfen Sie die Anwesenheit von a Datenklasse-Scope Attribut, falls gefunden, in ein Array wie zuvor aufgeteilt. Datenklasse-Scope ist ein optionales Attribut, mit dem Sie einschränken können, wo der Klassenschalter auftritt.
Zum Beispiel, wenn Dataclass-SCOPE. wurden eingestellt js-my-element , nur Zielelemente, die Kinder davon sind, wären von einem Klick des Triggerelements beeinflusst.
if (elem.dataset.classscope) {var dataclassscope = elem.dataset.classscope.split (",");
}
Das Datenklasse-Element Attribut ist ein weiteres optionales Attribut. Es gibt das Element an, das der Klassenknopf beeinflussen soll. Im Snippet unten prüfen wir die Anwesenheit und konvertieren, falls gefunden, den Inhalt als zuvor in ein Array umrechnen. Wenn es nicht gefunden wird, setzen wir sowohl das Zielelement als auch den Umfang auf das Trigger-Element ein, was bedeutet, dass er, wenn Sie auf klicken, die Klassenwechsel an sich auslösen.
if (elem.dataset.ClassElement) {var dataclassElement = elem.dataset.ClassElement.Split (",");
}
else {var dataclasselement = [elem.classlist ]; Wenn (! DataClassScope) {
VAR Dataclassscope = DataClassElement; }}
Weil beide Datenklasse und Datenklasse-Element akzeptieren Sie mehrere Kommas getrennte Werte, wir müssen das erklären Datumslänge Variable und weisen Sie die Länge des größten Attributs zwischen den beiden zu. Dies soll sicherstellen, dass wir genug Zeiten schließen, um sicherzustellen, dass wir kein Zielelement verpassen.
var datalysp = math.max (dataclassElement.länge, dataclass.length), b; für (B = 0; B & LT; DataLength; B ++) {
}
Es ist möglich, dass Datenattribute doppelte Werte haben. Zum Beispiel & lt; ein Data-Class = "IS-versteckt, is-verstecktes" Datenklasse-Element = "JS-ELEM, JS-ELEM2" & GT; ist eine gültige Verwendung der Funktion, es wäre viel besser, nur angeben zu müssen ist versteckt Einmal.
Dazu werden wir in der Logik hinzufügen Datumslänge ZUM Schleife, wenn a Datenklasse oder Datenklasse-Element Der Eintrag fehlt, verwenden Sie den letzten gültigen. Das heisst & lt; ein DataClass = "IS-verstecktes" Data-Class-Element = "JS-ELEM, JS-ELEM2" & GT; würde auch funktionieren.
if (DataClass [B]! == undefined) {
var elemclass = dataclass [b]; } if (DataClassElement [b]! == undefined) {
VAR DataClassElementValue = Datenklassifizierung [B]; }
Immer noch innerhalb der. ZUM Schleife, das gleiche wieder, aber mit dem Datenklasse-Scope Attribut. Wenn wir keinen Umfang haben, verwenden Sie den letzten gültigen Gültigen. Dies ermöglicht einen Umfang, um viele Klassenklopfen zu bewirken.
if (Dataclassscope & amp; & amp; dataclassscope [b]! == undefined) {
VAR Cachedscope = DataClassScope [B]; } else if (cachedscope) {
DataClassScope [B] = Cachedscope; }
Das letzte was in der ZUM Schleife, die wir tun müssen, bevor wir alles haben, was wir brauchen, um den Klassenschalter auszulösen, stellen Sie sicher, dass, wenn ein Umfang definiert ist, nur Elemente innerhalb dessen gezielt werden. Wir werden anfangen, eine bedingte Anweisung zu erstellen, die nach Geltungsdaten prüft, und wenn keiner gefunden wird, verwenden Sie einfach den globalen Dokumentenbereich.
if (Dataclassscope & amp; & amp; dataclassscope [b]! == "false") {
}
else {var elemref = document.queryselectorall ('. $ {DataclassElementValue}'), c; }
Innerhalb der leeren, if-Anweisung aus dem vorherigen Schritt, fügen Sie das untenstehende Snippet hinzu. Dies findet das Element, das in definiert ist Datenklasse-Scope ( elemparent ) und erstellt dann ein Array aller kinderförmigen Elemente Datenklasse-Element ( Elemref ). Wenn die Umfangs- und Zielelemente gleich sind, wird auch deren Bezug auf die Liste der Elemente hinzugefügt, um sie zu ändern.
var elemparent = nächstes (elem, dataclassscope [b]),
elemref = [] .slice.call (elemparent .queryselectorall ('. $ {DataclassElementValue}), c;
if (elemparent.classlist. enthält (DataClassElementValue)) {elemref.unshift (elemparent); }
Endlich am Ende der ZUM LOOP, Lassen Sie uns die Daten verwenden, die wir aufgebaut haben, und wechseln Sie alle korrekten Klassen auf allen richtigen Elementen um. Dazu brauchen wir ein neues ZUM Schleife, um durchzugehen elemref'nodelist / array. , greifen Sie auf jede Elemente zu Klassiflober API und dann die Verwendung der Umschalten() Methode zum Hinzufügen oder Entfernen des Werts von Elemklasse .
für (c = 0; c & lt; elemref.length; c ++) {elemref [c] .classlist.toggle (elemclass); }
Nun ist die Funktion abgeschlossen, dass wir es in einfügen müssen Main.js. . Kopieren Sie dazu den Snippet, unten, und fügen Sie ihn oben in der Datei hinzu, aber in der Iife Funktion. Wir brauchen auch nicht den größten Teil des Codes in Main.js. , also löschen Sie alles bis zum Stop Box Art Checkbox Event Bubble Snippet.
erfordern ("./ data-class.js");
Nun, um die Funktion zu verwenden. Im index.html. , finden Sie alle Instanzen des Lieblingssymbols mit einem JS-Star. Klasse. Fügen Sie das unten angegebene Attribut hinzu und wenn Sie darauf hingeklickt haben ist aktiv an sich selbst, wie in der Abwesenheit von Datenklasse-Element Das Triggerelement verwendet sich als Zielelement.
Data-Class = "IS-Active"
Als nächstes müssen wir die Game-Box-Künste auf dem Home-Rutsche miteinander verknüpfen, wenn Sie also klicken, ist aktiv wird dem richtigen Videospielrutschen hinzugefügt, während auch von der aktuellen Home-Slide entfernt. Nachfolgend finden Sie die Attribute, die Sie an das hinzufügen sollten JS-Test-Game-1 img. Die anderen folgen dem gleichen Muster, ersetzen Sie einfach die Test-Game-1 mit dem neuen Spieltitel.
Data-Class = "IS-Active" Data-Class-Element = "JS-Test-Game1 - Slide-Slide, JS-Home-Slide"
Auf jedem Spielrutner ist ein Schalter, der die Vorder- und Rückseite der Box-Kunst umgibt. Um diese Arbeit zu machen, fügen Sie jedem Fall das Snippet hinzu JS-Boxart-Toggle . Wenn auf eine Reihe von Dingen angeklickt hat: ist-geflippt wird eingeschaltet JS-Boxart auf dem Elternteil abgebaut JS-Slide. , während wird geprüft wird auf dem Triggerelement umgeschaltet.
DATA-CLASSE = "IS-CHIPT, IS-CHECKED" Data-Class-Element = "JS-Boxart, JS-Boxart-Toggle" Data-Class-Scope = "JS- Slide, JS-Boxart-Toggle "
Schließlich müssen wir die untenstehenden Attribute an alle Instanzen von hinzufügen js-canceldecription. und JS-Cancel-Spiel Wenn Sie also auf Sie aufgenommen werden, werden Sie wieder in die Heimatrutsche eingenommen.
Data-Class = "IS-Active" Data-Class-Element = "JS-Slide, JS-Home-Slide" Data-Class-Scope = "JS-Slide, False"
Führen Sie im Terminal den Befehl nachfolgend aus, um das Projekt aufzubauen. Dies erstellt eine kompilierte Version des Projekts in einem neuen distelisch Verzeichnis. Dieser Befehl verwendet NPM-Skripts - eine einfache, native NPM-Alternative zu voll funktionsfähigen Build-Tools, wie Grunzen oder GULP.
NPM-Run-Build
Führen Sie zum endgültigen Terminal den Befehl nachfolgend aus, um einen lokalen Server zu erstellen, um das zu dienen distelisch Mappe. Beachten Sie die im Terminal zurückgegebene Portnummer. Navigieren Sie im Browser zu http: // localhost: Ihre Portnummer um das fertige Projekt anzuzeigen.
NPM-Lauf dienen
Jetzt haben Sie das Projekt abgeschlossen, alle Klassenlogik werden jetzt von unserer wiederverwendbaren Funktion abgewickelt. Wenn dies ein Live-Projekt wäre, und mehr Seite oder Komponenten wurden mit der Zeit hinzugefügt, da die Zeit weitergegeben wurde, würde die Leichtigkeit der Hinzufügung der neuen Klassenlogik für diese erheblich reduziert, da wir für jeden Fall nicht mehr maßgeschneiderte Funktionen mehr schreiben müssen.
Dieser Artikel wurde ursprünglich in Ausgabe 267 von Webdesigner, dem kreativen Webdesign-Magazin, veröffentlicht, anbietet Experten-Tutorials, modernste Trends und kostenlose Ressourcen. Abonnieren Sie den Webdesigner hier .
Zum Thema passende Artikel:
Das Lernen, den Kontrast in der Kunst zu verwenden, transformiert Ihre Projekte und die Art und Weise, wie Sie arbeiten. Mein Lieblingsaspekt, um mit in der Kunst zusammenzuarbeiten, ist der ..
Atypiquique-Studio: Enthält Texturen von poliigon.com - Texturen dürfen nicht umverteilt werden Als ich anfing, an ..
Hier spreche ich über den Prozess der Schaffung von Rey, einem Charakter, den ich für die jenseits menschliche Herausforderung ..
Gebeten, meine zu beschreiben Maltechnik. ist für mich seltsam und ehrlich gesagt ist es schwer zu tun. Ich bin e..
Durch die Verwendung eines knotenbasierten, prozeduralen Ansatzes bietet 3D-Software Houdini von SideFX digitale Künstler mit ei..
Materialien Marjolein verwendet Leinöl als Medium, das innerhalb von Tagen den Vorteil des Trockners hat...
Managinierte Szenen, die Sie mit einem Gefühl von Wunder verlassen, dass Sie mehr erfahren möchten, und sehen Sie, was gleich u..
Adobe lanciert heute eine neue Serie von Video-Tutorials, die heutzutage aufgerufen wird Kreative Wolke Anwendungen in 60 Sekunden oder weniger. Egal, ob Sie ein..