Sie können mehrere Klassen für ein HTML-Element haben
<div class="module p-2"></div>
Daran ist überhaupt nichts falsch oder ungültig. Es hat zwei Klassen. In CSS werden beide angewendet
.module { }
.p-2 { }
const div = document.querySelector("div");
console.log(div.classList.contains("module")); // true
console.log(div.classList.contains("p-3")); // false
Aber wie sieht es mit der Gruppierung aus? Alles, was wir hier haben, ist ein durch Leerzeichen getrennter String. Vielleicht ist das in Ordnung. Aber vielleicht können wir die Dinge klarer machen!
Vor Jahren sprach Harry Roberts darüber, sie zu gruppieren. Er umschloss Klassengruppen in eckige Klammern
<div class="[ foo foo--bar ] [ baz baz--foo ]">
Die obigen Beispielklassennamen sind völlig abstrakt, nur um die Gruppierung zu demonstrieren. Stellen Sie sich vor, sie sind wie Primärnamen und Variationen als eine Gruppe, und dann Utility-Klassen als eine andere Gruppe
<header class="[ site-header site-header-large ] [ mb-10 p-15 ]">
Diese eckigen Klammern? Bedeutungslos. Diese sind da, um uns Entwicklern visuell die Gruppen darzustellen. Technisch gesehen sind sie *auch* Klassen, also wenn ein Sadist .[ {} schreiben würde, würde es in Ihrem CSS etwas bewirken. Aber das ist so unwahrscheinlich, dass die Klarheit durch die Gruppen hoffentlich überwiegt und hilfreicher ist.
Das obige Beispiel gruppiert den Primärnamen und eine Variation in einer Gruppe und einige Beispiel-Utility-Klassen in einer anderen Gruppe.
Ich empfehle diesen Ansatz nicht unbedingt. Es sind einfach Gruppen von Klassen, die Sie haben könnten.
Hier ist derselbe Gruppierungsstil mit anderen Gruppen
<button class="[ link-button ] [ font-base text-xs color-primary ] [ js-trigger ]" type="button" hidden>
Das Beispiel hat einen einzelnen Primärnamen, Utility-Klassen mit unterschiedlichen Namensstilen und eine dritte Gruppe für JavaScript-spezifische Selektoren.
Harry hat diesen Ansatz vor einigen Jahren aufgegeben und gesagt, dass sein Aussehen für die verschiedenen Leute und Teams, mit denen er arbeitete, einfach zu seltsam war. Es verursachte genug Verwirrung, dass die Vorteile von gruppierten Klassen es nicht wert waren. Er schlug stattdessen Zeilenumbrüche vor
<div class="media media--large
testimonial testimonial--main">
Das erscheint mir ähnlich klar. Die Zeilenumbrüche in HTML sind völlig in Ordnung. Außerdem hat der Browser damit keine Probleme und JSX wird sowieso oft mit vielen Zeilenumbrüchen in HTML geschrieben, wegen all dem zusätzlichen Zeug, das auf Elemente gepackt wird, wie Event-Handler und Props.
Vielleicht kombinieren wir die Ideen von Zeilenumbrüchen als Trennzeichen und identifizierten Gruppen ... mit Emojis!
Siehe den Pen
Grouping Classes von Chris Coyier (@chriscoyier)
auf CodePen.
Seltsam, aber lustig. Emojis sind dort absolut gültig. Wie die eckigen Klammern könnten sie auch etwas bewirken, wenn jemand einen Klassennamen dafür schreiben würde, aber das ist generell unwahrscheinlich und etwas, worüber ein Team sprechen sollte.
Eine weitere Sache, die ich verwendet habe, sind data-* Attribute für Gruppen anstelle von Klassen, wie...
<div
class="primary-name"
data-js="js-hook-1 js-hook-2"
data-utilities="padding-large"
>
Sie können immer noch basierend auf Attributen in CSS und JavaScript auswählen und stylen, so dass es funktionsfähig ist, wenn auch etwas weniger bequem aufgrund der umständlichen Selektoren wie [data-js="js-hook-1"] und dem Fehlen von praktischen APIs wie classList.
Wie sieht es bei Ihnen aus? Haben Sie andere clevere Ideen für Klassengruppierungen?
Ich dachte immer, es wäre cool, Runen für Klassen in meiner eigenen Arbeit zu verwenden, z.B. ᚸ-button. Dann habe ich es in einem Codepen ausprobiert. Es funktionierte, aber ich konnte nie Alt-Codes finden, um Runen einfach auf die Maschine zu tippen. Wirklich metallische Klassennamen zerfielen angesichts von zu viel Copy-Paste.
Man könnte immer eigene Emmet-Verknüpfungen dafür erstellen
Wahrscheinlich der einfachste Weg wäre, Tastenkombinationen für diese Symbole auf der Tastatur selbst zu binden. Über AutoHotkey oder ähnliche Software.
Ich hätte nie darüber nachgedacht, aber ich finde es eine clevere Idee... :)
Das Problem bei den meisten dieser Ansätze ist die potenzielle Verwirrung für andere Entwickler, besonders wenn man in großen, sich entwickelnden Teams arbeitet. Sie kratzen sich vielleicht am Kopf und benötigen Erklärungen, oder diskutieren über die Gruppennamen und Emojis. Am Ende spart man vielleicht gar keine Zeit oder kognitive Ressourcen!
Ich denke, der einfachste Weg, visuell zu trennen, ohne zu viel Verwirrung zu stiften, ist die doppelte Leerung der Gruppen. Auch dann könnte es zu einem Kommentar kommen, der zusätzliche Leerzeichen entfernt!
Seitdem ich 2013 einen Beitrag eines Freundes gelesen habe – https://beneverard.co.uk/blog/using-slashes-within-the-html-class-attribute/ – verwende ich den senkrechten Strich
|, um die verschiedenen Gruppen von Klassennamen zu trennen, die mit meinem HTML verwendet werden.Es funktioniert immer noch für mich und die verschiedenen Teams, mit denen ich gearbeitet habe.
Es ist ein schöner visueller Schlüssel, um zu sagen: „Diese Klassennamen sind für das und diese Klassennamen sind für das“.
Eigentlich verwende ich eine doppelte Leerung, um visuell Gruppen von Klassen zu trennen. Es ist dezent, aber besser als nichts und sehr einfach anzuwenden.
Außerdem können Sie, wenn Sie Ihre Klassen vorab präfixieren (z. B.
u-xxxfür eine Utility-Klasse), dies über Linting überprüfen.Vertikale Striche:
<div class="stuff | other stuff | more stuff">Eckige Klammern sind eine interessante Idee, aber für mich reicht meiner Meinung nach das Namensraum-Präfix für die Klassen. Ich habe normalerweise eine Liste von Namensräumen wie u- für Utility, c- für Component, l- für Layout, js- für Javascript etc.
Ich habe in der Vergangenheit Data-Attribute für Inhaltsvariationen verwendet. Es ist eines dieser Dinge, die man mit Klassen tun könnte, aber ich finde, es hilft, die Dinge zu verdeutlichen. Ein Beispiel ist ein Inhaltsblock mit Links darin. Die Links haben keine Klassen für das Styling, sondern werden im Kontext gestylt (.something > a {}). Jeder Link hat ein data-target-Attribut, das den Namen der Website enthält, zu der er führt. Der Vorteil davon ist, dass ich Links individuell für das Styling ansprechen kann (vielleicht wird ein Facebook-Link blau und ein Instagram-Link rosa), aber ich kann auch den data-Attributwert in einem Pseudo-Element verwenden, z. B. wenn der Linktext nicht der Name des Ziels ist und ich ein gestyltes Overlay beim Hover anzeigen möchte. Die Verwendung dieser Methode ermöglicht es mir, verschiedene Stile auszuprobieren oder sogar zwischen ihnen zu wechseln, je nach Thema, ohne das Markup überhaupt zu ändern.
Ich hatte nie wirklich darüber nachgedacht, Klassen so zu organisieren, dass sie eine Art Container zur Gruppierung verwandter Elemente enthalten. In meinen Augen macht BEM das bereits ... vorausgesetzt, Sie deklarieren sie in der richtigen Reihenfolge (d.h.
block block__elem block--mod)Nichtsdestotrotz gefällt mir die Idee der Klammern ... aber ich würde wahrscheinlich nur einen senkrechten Strich verwenden (d.h.
container-fluid | bg-primary text-secondary | p-2 m-4)Für mich ist das etwas übersichtlicher als Klammern ... oder beinhaltet zumindest weniger Tipparbeit.
Wenn Sie Ihre Klassen alphabetisch sortieren, können Sie dieses ganze Problem vermeiden.
$(element).addClass(‘foo’);
Das ist es, was mich denken lässt, dass dieses "Gruppierungssystem" nutzlos ist. JavaScript-Bibliotheken und Frameworks sind nicht darauf ausgelegt, Klassen zu manipulieren und dabei den Gruppierungssinn zu wahren. Die mögliche Lösung liegt in einem Webpack-Modul (das ich noch nicht kenne), vielleicht (?).
Die Gruppierung ist nur für Entwickler. Um sich den Markup anzusehen und zu sehen, was vor sich geht. Es spielt keine Rolle, was im DOM vor sich geht.
Gibt es eine Idee, wie sich das auf die Spezifität auswirkt?
Leicht verwandt mit diesem Thema – ich bin ein großer Fan davon, alle Klassen, die in JS verwendet werden, mit js- zu präfixieren. So enden Sie normalerweise mit etwas wie
Dies ermöglicht es jedem Entwickler, der mit dem Projekt vertraut ist oder nicht, sofort zu wissen, ob die Klasse in CSS oder JavaScript verwendet wird. Keine Fehler mehr, bei denen Sie eine unauffällige Klasse entfernen, nur um später festzustellen, dass ein JavaScript von dieser Klasse abhängig war.
Rein für das Styling verwende ich BEM, obwohl es technisch gesehen keine Selektoren gruppiert, hilft es wirklich.