Der folgende Beitrag ist ein Gemeinschaftsprojekt von Gastautor Joe Richardson, Robin Rendle und vielen Mitarbeitern von CSS-Tricks. Joe wollte einen Beitrag über BEM schreiben, was uns gefiel, und fast jeder hier hatte Gedanken und Meinungen zu BEM, also dachten wir, wir tun uns alle zusammen und machen es gemeinsam.
Die Methodik Block, Element, Modifier (allgemein bekannt als BEM) ist eine beliebte Namenskonvention für Klassen in HTML und CSS. Entwickelt von dem Team bei Yandex, zielt sie darauf ab, Entwicklern zu helfen, die Beziehung zwischen HTML und CSS in einem bestimmten Projekt besser zu verstehen.
Hier ist ein Beispiel dafür, wie ein CSS-Entwickler im BEM-Stil schreiben könnte
/* Block component */
.btn {}
/* Element that depends upon the block */
.btn__price {}
/* Modifier that changes the style of the block */
.btn--orange {}
.btn--big {}
In dieser CSS-Methodik ist ein Block eine Abstraktion auf oberster Ebene einer neuen Komponente, zum Beispiel eines Buttons: .btn { }. Dieser Block sollte als Elternteil betrachtet werden. Kindelemente, oder Elemente, können darin platziert werden und werden durch zwei Unterstriche nach dem Namen des Blocks gekennzeichnet, wie .btn__price { }. Schließlich können Modifier den Block manipulieren, sodass wir diese bestimmte Komponente thematisieren oder stylen können, ohne Änderungen an einem völlig unabhängigen Modul vorzunehmen. Dies geschieht durch Anhängen von zwei Bindestrichen an den Namen des Blocks, genau wie bei btn--orange.
Die Markup könnte dann so aussehen
<a class="btn btn--big btn--orange" href="https://css-tricks.de">
<span class="btn__price">$9.99</span>
<span class="btn__text">Subscribe</span>
</a>
Wenn ein anderer Entwickler dieses Markup schreiben würde und wir nicht mit dem CSS vertraut wären, sollten wir trotzdem eine gute Vorstellung davon haben, welche Klassen wofür verantwortlich sind und wie sie voneinander abhängen. Entwickler können dann ihre eigenen Komponenten erstellen und den bestehenden Block nach Herzenslust modifizieren. Ohne viel CSS zu schreiben, können Entwickler potenziell viele verschiedene Kombinationen von Buttons erstellen, indem sie einfach eine Klasse im Markup ändern
Siehe den Pen BEM Beispiel von CSS-Tricks (@css-tricks) auf CodePen.
Zuerst mag diese Syntax langsamer erscheinen, als einfach eine neue Klasse für jeden Button-Typ zu erstellen, aber das ist aus mehreren Gründen, die wir behandeln werden, nicht der Fall.
Warum sollten wir BEM in Betracht ziehen?
- Wenn wir eine neue Stilart einer Komponente erstellen wollen, können wir leicht sehen, welche Modifier und Elemente bereits existieren. Wir könnten sogar feststellen, dass wir gar kein CSS schreiben müssen, weil ein bereits vorhandener Modifier das tut, was wir brauchen.
- Wenn wir das Markup und nicht das CSS lesen, sollten wir schnell eine Vorstellung davon bekommen können, welches Element von einem anderen abhängt (im vorherigen Beispiel können wir sehen, dass
.btn__pricevon.btnabhängt, auch wenn wir noch nicht wissen, was das tut). - Designer und Entwickler können Komponenten konsistent benennen, um die Kommunikation zwischen Teammitgliedern zu erleichtern. Mit anderen Worten, BEM gibt jedem im Projekt eine deklarative Syntax, die sie teilen können, sodass sie auf derselben Wellenlänge sind.
Harry Roberts identifizierte einen weiteren wichtigen Vorteil der Verwendung einer Syntax wie BEM, wenn er über die Verbesserung des Vertrauens von Entwicklern schreibt
Das ist der Hauptgrund, warum wir mit überladenen Codebasen voller Legacy- und unbekanntem CSS enden, das wir uns nicht zu berühren trauen. Uns fehlt das Vertrauen, mit bestehenden Stilen arbeiten und diese modifizieren zu können, weil wir die Folgen der global agierenden und undichten Natur von CSS fürchten. Fast alle Probleme mit CSS in großem Maßstab laufen auf Vertrauen (oder dessen Fehlen) hinaus: Die Leute wissen nicht mehr, was Dinge tun. Die Leute trauen sich nicht, Änderungen vorzunehmen, weil sie nicht wissen, wie weitreichend die Auswirkungen sein werden.
Ebenso argumentiert Philip Walton, dass dieses Problem gelöst werden kann, wenn genügend Entwickler sich an die Prinzipien von BEM halten
Während 100% vorhersagbarer Code vielleicht nie möglich sein wird, ist es wichtig, die Kompromisse zu verstehen, die man mit den gewählten Konventionen eingeht. Wenn Sie sich strikt an die BEM-Konventionen halten, können Sie Ihren CSS in Zukunft mit vollem Vertrauen aktualisieren und ergänzen, dass Ihre Änderungen keine Nebenwirkungen haben werden.
Wenn Entwickler also zuversichtlicher an einem Projekt arbeiten können, werden sie sicher klügere Entscheidungen darüber treffen, wie diese visuellen Komponenten verwendet werden sollten. Diese Methodik ist vielleicht keine perfekte Lösung für all diese Leiden, aber sie gibt den Entwicklern sicherlich einen Standard an die Hand, um zukünftig besseren, besser wartbaren Code zu schreiben.
Ein weiterer kluger Teil von BEM ist, dass alles eine Klasse ist und nichts verschachtelt ist. Das macht die CSS-Spezifität sehr flach und niedrig, was eine gute Idee ist. Es bedeutet, dass Sie sich nicht über Spezifität streiten müssen.
Werfen wir einen Blick auf einige der Probleme mit BEM...
Probleme mit BEM CSS
Natürlich wird niemand Sie zwingen, wenn Sie von den BEM-Regeln abweichen. Sie könnten immer noch einen CSS-Selektor schreiben wie diesen
.nav .nav__listItem .btn--orange {
background-color: green;
}
Das sieht so aus, als hätte es Teile von BEM, aber es ist kein BEM. Es hat verschachtelte Selektoren, und der Modifikator beschreibt nicht einmal genau, was passiert. Wenn wir das tun würden, würden wir die Spezifitätsflachheit, die bei BEM so hilfreich ist, durcheinander bringen.
Ein Block (wie z. B. .nav) sollte niemals die Stile eines anderen Blocks oder Modifikators (wie z. B. .btn--orange) überschreiben. Andernfalls wäre es fast unmöglich, das HTML zu lesen und zu verstehen, was diese Komponente tut; dabei werden wir das Vertrauen eines anderen Entwicklers in die Codebasis erheblich erschüttern. Das gilt auch für HTML: Was würden Sie erwarten, wenn Sie das folgende Markup sehen?
<a class="btn" href="https://css-tricks.de">
<div class="nav__listItem">Item one</div>
<div class="nav__listItem">Item two</div>
</a>
Was hier wahrscheinlich passiert ist, ist, dass ein Element in einem völlig unabhängigen Block den Code hat, den ein Entwickler benötigt, aber die Kindelemente keine .nav-Klasse als Elternteil benötigen. Das führt zu einer extrem verwirrenden und inkonsistenten Codebasis, die unter allen Umständen vermieden werden sollte. Wir können diese Probleme also zusammenfassen durch
- Niemals Modifier in einem unabhängigen Block überschreiben.
- Vermeiden Sie unnötige Elternelemente, wenn das Kind recht problemlos für sich allein existieren kann.
Weitere Beispiele für BEM in Aktion
Akkordeon-Demo
Siehe den Pen BEM Akkordeon von CSS-Tricks (@css-tricks) auf CodePen.
In diesem Beispiel gibt es einen Block, zwei Elemente und einen Modifier. Hier haben wir einen Modifier .accordion__copy–open erstellt, der uns wissen lässt, dass wir ihn nicht auf einem anderen Block oder Element verwenden sollten.
Navigation Demo
Siehe den Pen BEM Menu von CSS-Tricks (@css-tricks) auf CodePen.
Diese Navigationsdemo hat 1 Block, 6 Elemente und 1 Modifier. Es ist sogar völlig in Ordnung, Blöcke ohne Modifier zu erstellen. Irgendwann in der Zukunft kann ein Entwickler immer noch neue Modifier hinzufügen (oder anbinden), solange der Block konsistent bleibt.
Abneigungen gegen BEM
Vielleicht mögen Sie die doppelte Unterstrich- oder doppelte Bindestrich-Sache nicht. Gut, verwenden Sie etwas anderes Einzigartiges, das Sie konsequent durchsetzen werden.
Hier ist eine weitere Stimmung
Bin mir bei BEM nicht ganz sicher. .site-search .site-search__field .site-search–full Warum nicht: .site-search .site-search input .site-search .full
— Samuel Fine (@samuelfine) 11. März 2015
Diese letzten drei Selektoren haben alle unterschiedliche Spezifitätsstufen. Sie erfordern entweder Eltern oder nicht. Ohne jegliche Regeln sagen sie nicht so viel aus wie die oben.
Ist es möglich, dass dieses winzige, isolierte Beispiel für Sie perfekt in Ordnung ist und Sie nie in Schwierigkeiten geraten? Vielleicht. Aber je mehr CSS Sie in einem Projekt haben, desto mehr summieren sich solche kleinen Dinge, desto mehr Spezifitäts- und Komplexitätskämpfe durchleben Sie.
BEM klingt super nützlich, wenn man nicht weiß, wie HTML oder CSS funktionieren.
— Samuel Fine (@samuelfine) 11. März 2015
Nicht um Samuel hier zu kritisieren, aber seine Stimmungen werden von vielen Leuten geteilt, daher ist es ein gutes Beispiel. Sie sehen BEM und lehnen es einfach rundweg ab. Wenn Sie BEM nicht mögen, ist das absolut in Ordnung, aber ich denke, es wäre schwer zu argumentieren, dass ein Regelwerk, das das Verständnis fördert und die Wartbarkeit von CSS unterstützt, eine schlechte Idee ist.
In der SMACSS-Methodik finden Sie wahrscheinlich einen CSS-Klassennamen mit drei Buchstaben. Modifier folgen dann dem Modulnamen mit einem Bindestrich
/* Example Module */
.btn { }
/* Modifier of the btn class */
.btn-primary { }
/* Btn Module with State */
.btn.is-collapsed { }
Das ist nur ein anderer Ansatz für dasselbe Problem. Es ist ziemlich ähnlich, aber Sie sind spezifischer bezüglich Abhängigkeiten und halten die Spezifität flach.
In OOCSS sind Blöcke ähnlich generisch.
/* Example Module */
.mod { }
/* Part of Module */
.inner { }
/* Talk Module */
.talk { }
/* Variation of part inside Module */
.talk .inner { }
Sie würden also mehrere Klassen im HTML für Variationen verwenden. Der Innenteil ist nicht so benannt, dass er eine Abhängigkeit hat, also ist es weniger klar, aber potenziell wiederverwendbarer. BEM würde .mod__inner und .mod--talk und .mod--talk__inner verwenden.
Das sind nur Variationen einer Methodik. Denken Sie daran, dass niemand Sie zwingt, dies sind selbst auferlegte Regeln, deren Wert aus deren Befolgung entsteht.
Sass und BEM
Für diejenigen unter Ihnen, die Sass schreiben und Verschachtelung zur Geltung von Stilen mögen, können Sie immer noch in einem verschachtelten Format erstellen, aber CSS erhalten, das nicht verschachtelt ist, mit @at-root
.block {
@at-root #{&}__element {
}
@at-root #{&}--modifier {
}
}
Ergibt
.block {
}
.block__element {
}
.block--modifier {
}
Und Sie können so abstrakt werden, wie Sie möchten! Schauen Sie sich Daniel Guillans BEM Constructor oder Anders Schmidt Hansens Expressive BEM an.
Zusammenfassung
Zusammenfassend lässt sich sagen, dass BEM zwar nicht alle unsere Probleme lösen wird, aber außerordentlich nützlich für die Erstellung skalierbarer und wartbarer Schnittstellen ist, bei denen jeder im Team eine klare Vorstellung davon haben sollte, wie Dinge verbessert werden können. Das liegt daran, dass ein Großteil der Frontend-Entwicklung nicht nur um die netten Tricks geht, die kurzfristig ein kleines Problem lösen; wir brauchen Vereinbarungen, Versprechen und bindende soziale Verträge zwischen Entwicklern, damit sich unsere Codebasis im Laufe der Zeit anpassen kann.
Im Allgemeinen betrachte ich BEM als Antwort auf Nicolas Gallaghers Frage
Ersetzen Sie "Können Sie das bauen?" durch "Können Sie das pflegen, ohne den Verstand zu verlieren?"
— Nicolas Gallagher (@necolas) 24. Juli 2013
Ich bin auf Samuels Seite, ich mag es nicht.
Ich verstehe die Vor- und Nachteile, aber für mich überwiegen die Nachteile die Vorteile.
Manchmal fügen wir ein Präfix zu einem Klassennamen hinzu, damit die Beziehung zwischen Dingen offensichtlich ist, z.B.
.form
.form-fieldset
.form-text
anstelle von
.form
.form fieldset
.form input[type=text]
Aber damit hören wir auf. Diese Idee hinter Bindestrichen und Unterstrichen ist irgendwie unordentlich und verwirrend für mich.
Ja, die Bindestriche und Unterstriche sehen komisch aus
Für mich scheint es viel einfacher zu machen, ein Element anzusehen und zu sagen, woher die gesamte (oder zumindest ein guter Teil davon) Formatierung kommt.
Im obigen Beispiel
.form-fieldset, was, wenn ich ein spezialisiertesfieldsetin einemformhaben möchte, das grün ist? Jetzt habe ich.form-fieldset-green– ist das ein grünesfieldsetin einemformoder ist es eine grüne Klasse für ein Element innerhalb desfieldsetinnerhalb desform?Für mich funktioniert diese Unterscheidung zwischen Elementen durch
__und Modifikatoren durch--Wunder. Jetzt weiß ich, dass.form__fieldset--greenein grünes Fieldset innerhalb einesformist, auf den ersten Blick.Stimme zu, gehen wir nicht zurück ins Jahr 2006 und essen riesige Schüsseln mit Klassensuppe
Vor einiger Zeit bin ich auf Folgendes gestoßen: https://github.com/rstacruz/rscss. Habe angefangen es zu benutzen und meiner Meinung nach ist es klarer als viele Unterstriche usw. Und der Code sieht auch sauberer aus.
Refactoring ist einfacher, wenn man BEM verwendet. Ohne Bindestriche und Unterstriche müssen Sie wahrscheinlich Verschachtelung verwenden, und mit Verschachtelung werden Sie auf kaskadierende Überschreibungen und Unsicherheiten stoßen, wenn Sie Klassen umbenennen oder entfernen müssen. Sie werden auch verschachtelte Klassen nicht so einfach an einer neuen Stelle wiederverwenden können und müssen erneut refactoren.
Hier finden Sie weitere Details zu diesem Thema mit Beispielen.
Ich bin ein großer Fan von BEM. Ich benutze BEM seit zwei Jahren für alle meine Büro- und persönlichen Projekte. BEM war nie ein Schmerz im Hintern, besonders wenn man an großen Projekten und großen Teams arbeitet. Das HTML sieht sauber, lesbar und leicht verständlich aus. Hilft bei der perfekten Modularisierung von Stylesheets. Hilft und neigt dazu, modulareren Code zu schreiben oder zu entwickeln. Mit Hilfe von Sass oder Less können Sie das Erstellen von Websites zu einem großartigen Erlebnis machen.
Die meisten meiner Freunde haben sich über den Unterstrich und die langen Namen beschwert, die komisch aussehen, man muss mehr tippen, viel Bullshit Bla Bla. Aber der Hauptvorteil, den ich aus meiner Erfahrung sehe
Verständliches HTML-Dokument
Hilft beim Schreiben modularer Stylesheets
Einfache Wartung von Stylesheets
BEM lässt Sie über eine Webseite als Komposition von Komponenten nachdenken
was bei der Erstellung wiederverwendbarer Stylesheets hilft
BEM verbessert die Lesbarkeit von JavaScript-Code beim Umgang mit Klassennamen.
Mein größter Vorteil, den ich von BEM hatte, ist, dass es mich sehr dazu trainiert hat, auf modulare Weise zu denken. Nicht nur CSS, sondern auch in der Programmierung. Ich spüre die Veränderung und die Vorteile, die ich gewonnen habe. Ich weiß nicht, wie ich es erklären soll, ja… es stimmt.
Probieren Sie es aus.
Friede
SCSS und BEM funktionieren für mich, normalerweise würde ich etwas schreiben wie
Frage
Was, wenn Sie…
…haben und nach .block__title suchen müssen? Wäre es nicht sinnvoller, wenn alle Klassen leicht durchsuchbar wären? Verschachtelung sieht sauberer aus, aber ich denke, es gibt einen klaren Nachteil, wenn man nicht nach etwas im Code suchen kann.
BEM (und andere Komponentenmethoden) fördern einen Ansatz von einer Komponente pro Datei. Das Finden von Dingen beginnt also damit, die Datei für diese Komponente zu öffnen (Ctrl-P oder Ctrl-T oder eine beliebige Navigate-to-File-Verknüpfung Ihres Editors). Das ist großartig, weil es sofort den Suchbereich einschränkt. Wenn die Datei zu groß zum visuellen Scannen ist, suchen Sie einfach mit Ctrl-F nach &__title.
@Jeremy – @Mike hat es ziemlich gut zusammengefasst. Da der Block richtig benannt wurde und Ihre Dateistruktur logisch ist, werden Sie keine Schwierigkeiten haben, das zu finden, was Sie brauchen. Ich hatte die gleiche Sorge, aber seitdem habe ich nicht zurückgeblickt. Wählen Sie eine Dateistruktur, die für Sie und das Projekt am besten geeignet ist, und verwenden Sie STRG + SHIFT + F in Sublime, um eine Klasse schnell über mehrere .scss-Dateien hinweg zu finden. Karten können auch helfen.
Danke Jungs. Das ergibt Sinn.
Die neueste Sass-Version unterstützt BEM auf folgende Weise
Was zu
Das können Sie hier online sehen – http://sassmeister.com/gist/fe753a8228da9ed45136
Die gleiche Syntax würde auch für LESS funktionieren. Falls LESS-Benutzer neugierig waren.
Es besteht keine Notwendigkeit für
@at-root #{&}__element, da&__elementauch in Sass funktioniert.Zuerst mochte ich das wortreiche Aussehen von BEM nicht, aber es ist erstaunlich, wie schnell ich darüber hinwegkam. Es ist für mich einfacher, die Struktur jetzt beim Blick auf BEM CSS zu verstehen und es hilft auch beim Erfinden von Namen.
Persönlich liebe ich das hier: https://github.com/rstacruz/rscss
es gibt eine kleine Tiefe in den Selektor, aber es korrigiert etwas, das mich bei BEM stört: die Länge des Klassennamens.
Ich weiß nicht, inwieweit ein komfortabler Selektor bei Tiefe wichtig ist, aber ich bevorzuge ihn.
Ich habe BEM in meinen letzten Projekten verwendet und es funktioniert meiner Meinung nach gut. Das Einzige, was ich anders gemacht habe, ist, die Unterstriche und Bindestriche zu vertauschen, da ich Bindestriche bevorzuge und mein CSS normalerweise mehr Elemente als Modifikatoren enthält.
Ich liebe BEM. Zuerst habe ich mich davor gedrückt, weil es so hässlich ist, aber dann erkannte ich, dass ich Mixins verwenden kann, um die Formatierung in CSS zu abstrahieren. In SCSS sind es mehr Zeichen, als es wert ist, aber mit eingerücktem Sass ist es irgendwie schön
wird elegant kompiliert zu
Hier sind die Mixins für die Neugierigen
Ich mag diese Methode. Danke, Charlotte.
Hallo Jungs, was haltet ihr von der folgenden Bibliothek, die einen ähnlichen Ansatz verfolgt?
https://github.com/danielguillan/bem-constructor
Das sieht großartig aus! Danke Charlotte :)
Das sieht großartig aus, danke!
Auch ich mag das nicht… vielleicht können wir zum Kamel-Case-Muster greifen.
.btn {}
/* Element, das vom Block abhängt */
.btnPrice {}
Das wird hilfreich sein, um das Code-Muster auch in JS beizubehalten….
Sass + BEM ist ein guter Grund, BEM zu verwenden. Beide scheinen dazu bestimmt zu sein, CSS zu schreiben, bei dem man NICHT VERWIRRT WIRD.
Ich schätze, mein BEM ist eher .parent-child und ich benutze wenige Modifier, wenn überhaupt. Ich habe angefangen, High-Level-Layout-Blöcke mit einem
l_Präfix zu schreiben, wieBEM wäre eher wie
.l_header__nav, aber ich benutze Bindestriche, einfach weil, wenn ich ein beliebiges Element des Selektors auswählen möchte, Bindestriche zum doppelklicken in Texteditoren besser sind. (Unterstriche sind Wortzeichen, sodass ein Doppelklick den gesamten Selektor auswählt.) Mag ein seltsamer Grund sein, aber es hilft meinem Workflow.Ich werde mich einmischen, denn meiner Sünde nach finde ich die CSS-Architektur ewig faszinierend.
Meiner Meinung nach ist jeder Ansatz, der HTML-Klassen und CSS-Selektoren rationalisieren und erzwingen will, besser als kein System. Je komplizierter das System/die Benutzeroberfläche, desto wahrer wird dies.
Man kann BEM-Syntax ablehnen (ich bin kein Fan), aber die Prinzipien bringen Ihnen weit mehr als die Verwendung von keinem System (besonders in großem Maßstab).
Ich lehne auch die Praxis in Sass ab, den Elterselektor zum Verschachteln zu verwenden; Sie verlieren die Eins-zu-eins-Beziehung zu Ihrem Markup (Sie können eine HTML-Klasse nicht aus den Entwicklertools auswählen und im Sass-Code nach dem Selektor suchen).
Für sehr große, komplexe UIs (und je nachdem, wie Sie sie erstellen) habe ich andere Ansätze als vorteilhafter empfunden (meinen eigenen Enduring CSS genannt), als BEM, hauptsächlich die Verwendung eines Mikro-Namespaces als Mittel zur Eindämmung. Ich habe dies in der Praxis als robuster, schneller zu iterieren, verständlicher aus Namenssicht empfunden (der letzte Punkt ist jedoch rein subjektiv).
Was auch immer Sie wählen, wie auch immer Sie von dem abweichen, womit Sie beginnen, einige Ansätze zu haben ist eine unendlich bessere Position, als gar keinen definierten Ansatz zu haben!
Hey Ben, wenn Sie Ihre Sass-Dateien so strukturieren, dass jeder Block seinen eigenen Ordner und seine eigene
scss-Datei erhält, dann ist die Suche nach einem Selektor nicht mehr notwendig, da Sie mit.footer__copyrightsofort zumfooter-Ordner gelangen, ohne Suchen. Dann ist es nur noch eine Frage,__copyrightin dieser bestimmten Datei zu finden :)„Sie können eine HTML-Klasse aus den Entwicklertools auswählen und im Sass-Code nach dem Selektor suchen“)
Verwenden Sie stattdessen Sourcemaps….
@Alex Ich benutze derzeit Sublime, ich kann eine HTML-Klasse im DOM doppelklicken, CMD+C und dann in Sublime CMD+R und CMD+V, um sie projektweit zu finden. Innerhalb einer Sekunde bringt es mich direkt zu diesem Selektor in meinem Sass/CSS, bereit zum Tippen. Ich finde das unendlich schneller, als manuell nach einem Komponentenordner zu suchen (ich habe über 100 Komponenten).
@ewfwefewfewewf – Sourcemaps bedeuten, dass ich im Browser bearbeiten muss. Ich ziehe es vor, in meinem Texteditor zu bearbeiten.
OFFTOPIC--
@Ben Frain
Obwohl Sie im Browser bearbeiten (Chrome) und die Datei speichern können, ist das eine Browserfunktion und keine Source-Maps-Funktion.
So bearbeite ich in meinem Texteditor und verwende Source Maps
Source Maps aktivieren (Chrome).
Die Zeile anzeigen, in der sich eine bestimmte Regel in der Quell-/vorverarbeiteten Datei befindet.
Bearbeiten.
Wenn Sie Sublime Text verwenden, müssen Sie diese Regel nicht „finden“, drücken Sie einfach
STRG+G(Windows) und geben Sie die Zeilennummer ein.Um Ihren Punkt bezüglich SMACSS zu verdeutlichen: Wenn
.callouteine Variante von.moduleist, sollte es.module-calloutheißen.Es gibt sehr geringe Unterschiede zwischen BEM und SMACSS. In SMACSS spricht man von Modulen, Untermodulen und Unterkomponenten. Diese entsprechen direkt Blöcken, Modifikatoren und Elementen.
Gibt es hier einen einzigen Entwickler, der BEM tatsächlich in einem Projekt verwendet hat und nicht davon überzeugt ist? Es ist leicht, es abzutun, weil es „komisch aussieht“ oder man „die __ oder – nicht mag“, aber das sind nur überbleibsel des Denkens von den „Best Practices“, von denen wir bereits wissen, dass sie nicht unbedingt die besten sind. Je größer das Projekt und je mehr Leute daran mitarbeiten – desto größer sind die Vorteile von etwas wie BEM.
Was Sams Tweet angeht, würden Sie sich ehrlich gesagt wohlfühlen, einem Projekt beizutreten und die Regel .full zu ändern? Ich bezweifle das sehr, was zu Selektoren mit höherer Spezifität und, je größer das Projekt wird, zu weniger Konsistenz/Wartbarkeit führen wird. (was Zeit und Geld verschwendet und nicht gut aussieht)
Probieren Sie es aus, Sie werden vielleicht überrascht sein.
Genau, sobald Sie erste Bedenken beiseitelegen und diesen Ansatz tatsächlich in einem Projekt anwenden, werden Sie erstaunt sein, wie nützlich er wird und wie seltsam es erscheint, ihn nicht zu verwenden.
Ich fordere alle Nörgler heraus, es in einem Projekt auszuprobieren. Ich glaube, Sie werden überrascht sein, wie es die Art und Weise verändert, wie Sie Ihr CSS sehen. Es ist fast unverzichtbar, sobald man es verstanden hat.
Das. Nach ein paar Projekten mit BEM (und SASS) erkannte ich, dass es deutlich weniger Probleme mit Klassennamen und Konflikten gab. Es ist nur eines dieser Dinge, die sich irgendwie stillschweigend durchgesetzt haben.
Eine Sache, die ich daran mag, ist, dass ich generische Wörter (block, area, container) sicher als BEM-Elementnamen verwenden kann. Das beschleunigt die Entwicklung erheblich, wenn ich nicht so viel über neue Namen nachdenken muss.
Und wie viele hier gesagt haben, kann @at-root mit der neuen SASS-Version entfernt werden. So wie
Gute Abhandlung über BEM. Ich sehe, dass es gemischte Meinungen dazu gibt, was großartig ist und die Ausdrucksstärke von CSS widerspiegelt.
Ich finde BEM sowohl skalierbar als auch lesbar (deshalb verwenden wir es). Zuerst haben wir es ausschließlich zur Identifizierung von Eltern-Kind-Beziehungen verwendet und ich hatte Schwierigkeiten, einen Nutzen für Modifikatoren zu finden, aber je mehr wir es benutzten, desto mehr erkannten wir, dass man mit richtiger Anwendung extrem flexible und schlanke Architekturen aufbauen kann!
Wenn jemand interessiert ist, habe ich ein kleines WordPress-Skript geschrieben, um dynamische BEM-Menüs zu erstellen, und (wenn Sie BEM mögen) bin ich sicher, dass Sie schätzen werden, wie viel einfacher es ist, komplizierte mehrstufige Navigationen mit BEM-Syntax zu erstellen, anstatt
.menu-name li > ul > li{}.Wenn Sie BEM noch nie verwendet haben, dient es als praktisches Anwendungsbeispiel
https://github.com/roikles/Wordpress-Bem-Menu
Zu wortreich und sieht zu seltsam aus. Unterstriche mit doppelten Bindestrichen mit einfachen Bindestrichen mit CamelCase vermischen. Nein danke, mein Herr. Nur einfache Bindestriche für Vererbung UND Unterelemente funktionieren absolut einwandfrei, sehen nicht seltsam oder wortreich aus und laden nicht dazu ein, zu spezifische Selektoren zu schreiben.
Danke für einen tollen Artikel, Joe, Robin und die Truppe.
Meiner Erfahrung nach hängt es stark von der Komplexität eines bestimmten Projekts, persönlichen Vorlieben (meinem mentalen Modell) und dem Team ab, in dem ich mich befinde.
Einige Projekte sind zu klein (nicht sehr komplex), um einen BEM-ähnlichen Ansatz sinnvoll zu nutzen, während andere Projekte, die eine hohe Modularisierung erfordern, meiner Erfahrung nach stark von BEM profitiert haben.
Im Fall des Startup-Teams, dem ich angehöre, macht es einfach die Diskussion und das Verständnis unseres Codes einfacher, wenn die Dinge sehr komponentenbasierend sind und BEM folgen. Nun, die „Roberts trifft Gallagher trifft Snook trifft unsere eigene Mischung“-Version von BEM, versteht sich.
Für uns müssen die Dinge sehr wie LEGOs sein – in der Lage, sich unabhängig zu bewegen, leicht entfernt oder hinzugefügt zu werden – da wir schnell auf Kundenfeedback und Benutzer-Testergebnisse reagieren müssen. BEM hilft uns dabei sehr.
Um ehrlich zu sein, als ich BEM zum ersten Mal sah, war ich nicht sehr überzeugt, aber nachdem ich es ausprobiert hatte, fing ich an, es wirklich zu genießen. Vielleicht ist es wie bei React: „Gib ihm fünf Minuten“.
Alle Vorteile von BEM ergeben für mich Sinn und es gefällt mir. Meine größte Beschwerde ist, dass die Klassennamen wirklich, wirklich lang werden. Besonders je tiefer man im Modul ist.
Nehmen wir zum Beispiel das folgende HTML/CSS an
.accordion
.accordion__title
.accordion__title__icon
Und dann nehmen wir an, ich möchte einen Modifier auf .accordion__title__icon –
class=“accordion__title__icon accordion__title__icon–facebook”
Ich erkenne an, dass wir den Klassennamen kürzen könnten, aber das würde den Zweck, alles für andere Entwickler leicht verständlich zu machen, untergraben.
Mit BEM sollten Sie wahrscheinlich Code wie „accordion__title__icon accordion__title__icon–facebook“ vermeiden.
Es wäre besser, ‚accordion‘ und ‚icon‘ als separate Komponenten zu erstellen. Dann einfach kombinieren.
Dies hat den Vorteil, dass jede Komponente woanders auf Ihrer Website verwendet werden kann, ohne die andere zu benötigen. Ziel ist es, jedes Teil so zu abstrahieren, dass es woanders unabhängig verwendet werden kann.
Hallo Neal, ich stimme @Andrew H hier zu, dass man normalerweise nicht so tief verschachteln muss. Wenn Sie ein Element innerhalb eines Elements haben, kann das oberste Element wahrscheinlich ein separates Block sein. Ich habe einmal einen Artikel über BEM-Mixins geschrieben, wenn Sie interessiert sind, schauen Sie bitte vorbei.
Ich stimme den Jungs da oben zu. Allerdings mag ich das Muster, die Basisklasse zusammen mit der Modifikator-Klasse anzugeben, nicht, es ist wirklich redundant (
class=”accordion__title__icon accordion__title__icon–facebook”).Hier können Sie einen einfachen Workaround lernen.
Ich bin damit einverstanden, Konsistenz zu erzwingen und eine Namenskonvention zu haben, aber die doppelten Unterstriche sehen schrecklich aus, besonders wenn sie mit einzelnen/doppelten Bindestrichen kombiniert werden.
Es ist ein oft wiederholter Irrtum, dass BEM speziell doppelte Unterstriche oder Bindestriche erfordert. Das ist ihre Standardempfehlung, um Namen mit Bindestrichen zu unterstützen, z. B.
.menu-button__submit-icon. Aber es ist gültig, einen Pascal-Case-Ansatz zu übernehmen, z. B..menuButton_submitIcon. Sehen Sie die Beispiele in ihren Dokumenten.Ich schlage vor, Sie lesen ‚Modern CSS Architecture and Front-End Development‘ von Harry Roberts aus dem Smashing Book #4.
Wenn Ihnen die Konzepte von BEM gefallen, aber nicht die Syntax, gibt es andere Optionen, wie SUIT: https://github.com/suitcss/suit/blob/master/doc/naming-conventions.md
Ich gehe noch einen Schritt weiter. Ich verwende Namespaces in meinem CSS.
Harry zeigt hier einige Vorteile auf: (Hat Harry jemals einen Gastblog hier gemacht? Er sollte. Versuchen Sie, ihn dazu zu bringen.)
http://csswizardry.com/2015/03/more-transparent-ui-code-with-namespaces/
Ich mache nur eine Änderung. Ich verwende ‚.namespace-block-element–modifier‘, da Unterstriche zu leicht zu übersehen sind.
Es scheint, als ob das erste „C“ in CSS am meisten gefürchtet wird… :-)
Zu Recht, da man den Cascade nicht aufhalten kann.
Für diejenigen unter Ihnen, die keine langen CSS-Klassennamen schreiben möchten. Hören Sie auf, sie von Hand zu schreiben, versuchen Sie die BH-Template-Engine dafür: http://bem.github.io/bh/
Dieser Template-Code
angewendet auf dieses JSON
wird Ihnen diesen HTML-Code geben
Um Himmels willen, ich hoffe, das setzt sich nicht durch.
Es ist hässlich wie die Sünde und fühlt sich an wie eine Zeitmaschine in das Jahr 2004.
Spezifität ist NICHT Ihr Feind, wenn sie richtig eingesetzt wird.
Alle Kommentare darüber, wie „hässlich“ die doppelten Unterstriche sind, scheinen den Punkt zu verfehlen. Unabhängig davon, ob es hässlich ist oder nicht, ist BEM sicherlich klar in seinen Absichten. Klarheit und Struktur sind der Punkt, nicht wie schön oder hässlich das Markup und CSS sind.
@Brendan, ich habe es im Projekt verwendet und es noch mehr verabscheut. Es ist ein Missbrauch von CSS. Man könnte sogar weiter gehen und behaupten, dass es grundsätzlich gegen einige Kernprinzipien von CSS verstößt.
Es mag seinen Platz haben, aber es wird bereits überstrapaziert.
Erstens, Kudos fürs Ausprobieren, bevor man urteilt. Allerdings stimme ich stark nicht zu, dass BEM missbräuchlich oder gegensätzlich zu CSS ist. Können Sie diese starke Meinung näher erläutern?
CSS ist eine vage Spezifikation. Seine einzigartigen Designziele umfassten Kompaktheit, Geräteunabhängigkeit und geteilte Autorität zwischen Publisher und Benutzer (was sich als von geringer langfristiger Bedeutung erwiesen hat). Nichts in BEM widerspricht diesen Grundsätzen in irgendeiner Weise. BEM fügt CSS lediglich „kooperative Komponentisierung“ hinzu: Regeln werden logisch zusammen gruppiert, und jede Gruppe respektiert einen gemeinsamen Satz strenger Einschränkungen für die Selektorkonstruktion.
Abgesehen von der
ugly__syntax--conventions(die geändert werden kann) ist mein größter Einwand, dass man eine Kette von Klassennamen im HTML hat, z. B.class="btn btn--big btn--orange".Auf diese Weise hat man viele Variationen, die frei kombiniert werden können – aber hilft das, einen konsistenten Stil auf Ihrer Website zu erzielen? Wenn man keine Klassen hätte, die auf Merkmalen wie Größe oder Farbe basieren, sondern auf Funktion, gäbe es vielleicht plötzlich deutlich weniger sinnvolle Kombinationen.
Und viele davon könnten durch die Vergabe einer sinnvollen Klasse an ein Elternelement erreicht werden. Warum den Button größer machen? Weil der Benutzer ein Touch-Gerät hat? Dann geben Sie dem Body die Klasse
.touchDeviceund viele weitere Elemente können gleichzeitig angepasst werden. Ja, das erzeugt Spezifität, aber wie el generico schrieb: Es ist nicht Ihr Feind, wenn es richtig eingesetzt wird.Wenn möglich und nicht zu verwirrend, versuche ich, meine Klassen in CSS so zu gruppieren, dass ich grundlegende Dinge nicht wiederholt definieren muss. Beispiel
Auf diese Weise muss ich nicht
class="btn btn-deactivated"schreiben, sondernclass="btn-deactivated"reicht aus. Was im Klassennamen steht, das im Stil, btn und deactivated.Ich mag mein CSS und HTML kurz und prägnant. Klassenketten sind eindeutig nicht mein Ding.
Juhu, endlich habe ich eine weitere Person mit der gleichen Ansicht über das Problem gefunden! Ich bin jetzt so glücklich :) Bitte schauen Sie sich meinen Artikel an, der eine andere Möglichkeit beschreibt, Modifikator-Klassen zu gruppieren, mithilfe von Attributselektoren. Ich frage mich, was Sie denken.
Sergey, die Idee, die CSS-Selektoren
[class^="block--"], [class*=" block--"]zu verwenden, ist großartig. So können Sie auch Ihre Klassenlisten in den CSS-Dateien kürzen.Ich habe etwas Ähnliches auf einer Website verwendet, die aus äquivalenten Folien bestand. Mit
[class^="slide-"]habe ich die Basisstile für alle Folien gegeben; während ich mit.slide-1,.slide-2,.slide-3usw. einzelne Eigenschaften wie das Hintergrundbild eingestellt habe.Sicher, Sie könnten kurze und prägnante CSS in der BEM-Methodik schreiben.
Ein Ansatz ist die Verwendung von Präprozessoren wie SASS, damit Sie Ihren Styleguide explizit definieren können.
Sie können auch den vollständigen BEM-Stack verwenden und somit vermeiden, HTML von Hand zu schreiben.
Könnten wir auch partielle Attributselektoren in unserem CSS verwenden?
[class*=–disabled]{pointer-events:none;}
Würde das jedes .block–disabled Element abdecken?
Gute Frage. Die Semantik von „disabled“ kann in verschiedenen logischen Kontexten unterschiedliche Bedeutungen haben. Wenn wir über ein Eingabefeld sprechen, kann disabled bedeuten „dieses Steuerelement ist schreibgeschützt“. Auf den höheren Abstraktionsebenen, die BEM-Blöcke ermöglichen, haben wir möglicherweise eine Liste von Produktblöcken in unserem Produktlistungsblock. Ein solches Produkt könnte selbst einen „disabled“-Zustand haben, was bedeuten könnte: „Dieses Produkt ist nicht zum Verkauf verfügbar, da es ausverkauft ist“. Diese beiden Definitionen von disabled sind unterschiedlich und haben unterschiedliche Darstellungsauswirkungen.
Mit Ihrem Vorschlag ignorieren wir den logischen Kontext in unserem Code-Design und erlauben ihn nicht. Das Wort „disabled“ wird als eine gemeinsame Bedeutung angenommen, unabhängig vom Kontext, in dem es angewendet wird. Letztendlich entmutigt dies die Arbeit auf höheren Abstraktionsebenen, da es umständlich und schmerzhaft ist, die Bedeutung von Klassennamen mit dem Cascade neu zu definieren. Und ohne Abstraktion sind wir gezwungen, das gesamte Frontend in Bezug auf Low-Level-HTML-Primitive zu betrachten, was unsere begrenzte kognitive Kapazität verschwendet. Im schlimmsten Fall erschöpft es diese Kapazität und macht das Frontend unentzifferbar, unvorhersehbar und anfällig für Regressionen.
Ich hatte gehofft, der Artikel würde meine Hauptkritikpunkte an BEM (die ich ansonsten liebe) behandeln, die manchmal dazu führen, dass ich verrückt lange Klassen schreibe, wie z. B.
section-name__content__blurbs__blurb__title.Wie entscheiden Sie, was ein Block ist? Sicherlich ist die gesamte Seite kein einzelner Block, aber wie entscheiden Sie, wie Sie sie zerlegen?
Wie benennen Sie Elemente, deren einziger Zweck darin besteht, einen CSS-Hack/eine CSS-Funktion zu ermöglichen? Stellen Sie sich vor, Sie haben ein
hero-Element, das optisch nur einenheadlineund einentaglineals offensichtliche Kinder enthält. Sie möchten, dass Ihre Klassen lauten:.hero,.hero__headlineund.hero__tagline, aber Sie benötigen ein paar Zwischenelemente, um ein Designziel zu erreichen (z. B. einen Wrapper, einen Container vor Flexbox für vertikale Zentrierung – lassen Sie Ihrer Fantasie freien Lauf). Diese Elemente benötigen Stile, also sind Sie gezwungen,.hero__wrapper__container__headlinezu schreiben? Manchmal mache ich das, aber ich betrachte es auch als reductio ad absurdum für die gesamte Konvention. Manchmal schummele ich und sage: „Das Wrapper-Element ist nicht so sehr ein Kind des Elternelements wie Teil der Implementierung des Blocks, also nenne ich es.hero--wrapperund reduziere die Länge der Kindselektoren um eins.“ Aber das verwässert die Namenskonvention.Namespaces. Benötigen Sie einen Hack, damit der Code funktioniert? Präfix mit „_“.
http://csswizardry.com/2015/03/more-transparent-ui-code-with-namespaces/
„Wie entscheiden Sie, was ein Block ist?“
Jedes Element, das in sich geschlossen ist und zerlegt werden kann. Wenn Sie dieses überall auf der Seite verschieben können und es genau so funktioniert, wie es woanders funktioniert. Das ist ein Block. Navigation, Inhaltsbereich, Seitenleiste, Fußzeile, Kopfzeile, Karussell usw.
Zack, es gibt keinen Grund, die Verschachtelungsstruktur im Elementnamen zu spiegeln.
Hero-Layout könnte so aussehenSolange Sie keine Elemente mit demselben Namen auf verschiedenen Verschachtelungsebenen haben (was an sich keine gute Idee ist), haben Sie immer noch einen kugelsicheren Schutz gegen Kollisionen von CSS-Selektoren.
Roman, ich habe nie ein Problem gesehen, auf eine klassischere und semantischere Weise zu layouten.
Daher sieht LESS- oder SCSS-Code ungefähr so aus:
Sauber und einfach, nicht wahr?
Dieses Layout könnte leicht durch verschachtelte Blöcke unterbrochen werden, da die Selektoren von block1 Elemente von block2 beeinflussen würden.
Die BEM-Benennung ist vielleicht nicht so sauber und einfach, aber sie garantiert eine kugelsichere Kapselung.
Ich habe den ersten Pen geforkt, um ein kurzes Beispiel für BEM-Templating bereitzustellen: http://codepen.io/sameoldmadness/pen/yyWXZm?editors=001
Es ist ärgerlich, so viele Diskussionen in den Kommentaren über „richtige“ Klassennamen zu sehen.
Schließlich sagt Ihnen BEM nicht, wie Sie Ihre Klassen benennen sollen. Stattdessen schlägt es eine Methode vor, Ihren Code in atomare, wiederverwendbare Komponenten zu trennen.
Schauen Sie sich einfach die grundlegende Blockdeklaration in der BH-Syntax an
Sie hat nichts mit HTML, CSS oder JS zu tun.
Aber der Block selbst kann Logik enthalten, die in all diesen Technologien (und noch mehr) implementiert ist.
Für das Beispiel
.mod--talk__innerziehe ich es vor, die Modifikatoren wann immer möglich auf dem Block zu belassen. Also wäre diesAndernfalls benötigen Sie für jedes Element eines Blocks eine neue Modifikator-Klasse.
Ich gehe davon aus, dass dies die Spezifität beeinträchtigt, aber .mod–talk .mod__inner sollte sowieso Vorrang haben.
Aber das wirft wohl die Frage auf: Sollten Elemente in Blöcken verschachtelt sein?
Sie haben mit dem ersten Codeblock vollkommen Recht – nur dass sie in einem Modifikator verschachtelt sind oder als separate modifizierte Klasse, z. B.
.mod__inner--wide {}.Das Folgende wäre redundant, da
.mod__innerso benannt ist, dass wir bereits wissen, dass es ein Element von.modist.Sie reduzieren die Menge des Kampfes mit der Spezifität, der bei der Entwicklung von Komponenten notwendig ist.
Zuerst einmal hoffe ich, dass Sie Ihr CSS modularisieren, egal ob Sie BEM verwenden oder nicht. Zweitens, schauen Sie sich Ihre aktuellen Projekte an. Verschieben Sie oft nicht zusammenhängende Module in Ihre Module? Wenn ja, verwenden Sie den BEM-Ansatz. Wenn nicht, verwenden Sie einen Ansatz, der das HTML und CSS lesbarer macht.
Ich habe Title CSS geschrieben, um Modulklassen leicht lokalisieren und einen Geltungsbereich für kurze Nachkommenklassen erstellen zu können. https://github.com/cuth/Title-CSS
Ich finde, dass die Verwendung von „orange“ als Klassennamen im Beispiel eine wirklich schlechte Idee ist.
Denn natürlich wird jemand schreiben:
.sidebar .orange { color: blue; }, ob BEM oder nicht.Warum nicht
.primaryoder.secondaryverwenden?Hier erklärt ein guter Blogger semantisches CSS.
Ich bekomme oft Feedback von den Backend-Entwicklern, dass die Verwendung von BEM für sie viel mehr Arbeit bedeutet und dem Projektmanager das nicht gefällt. Ihr Argument ist, dass es für sie einfacher ist, Folgendes auszugeben:
anstelle von
<
form class=”signup__sidebar”>
usw.
Da die erste Variante bereits so aus dem CMS kommt, aber die zweite mehr Programmieraufwand erfordert, um so zu werden. Und es geht nicht nur um das Formular, sondern um alle anderen Plugins/Erweiterungen, die sie für das CMS verwenden.
Wie sollte das gesehen werden?
In meinem obigen Beispiel war Variante eins
und die zweite war
Ich nenne es einfach .butts, wie in buttons.
also wäre es so,
.butts {}
.butts>span:first-of-type {}
.butts>span:last-of-type {}
Ich weiß nicht, warum man Kinder dieser Jungs Klassen geben sollte.
Meiner Meinung nach ist BEM absoluter Wahnsinn und es macht HTML- und CSS-Code bizarr.
Okay, selbst wenn Ihr Projekt sehr kompliziert ist und viele Dinge von vielen Teams geliefert werden, warum folgen Sie nicht dem Web Components-Ansatz, der alles klar und einfach hält? http://webcomponents.org/
Weil es von den Browsern nicht unterstützt wird. Und Polyfills sind sehr langsam.
Wenn ich also dieser Struktur folgen würde, wäre das dann für ein Navigations-Element angemessen?
Und wie viel ist zu viel? Sagen wir zum Beispiel, ich habe ein kleines gestyltes Element im Link, wie ein Icon, würde das eine vierte Ebene hinzufügen? Wie weit ist zu weit, wenn man mit BEM umgeht? Kann man zu weit gehen?
Nein.
Korrekter Code wäre
@Sergey – Sie haben Ihre Elemente und Modifikatoren verwechselt
Probieren Sie dies
Danke David! Ich bin nur gut in der kanonischen BEM-Benennung.
Dieser Thread zeigt perfekt, wie Entwickler BEM-Konventionen nicht richtig erfassen konnten.
Ich benutze mein eigenes System, da ich kein Fan der BEM-Klassennamen bin. Ich verstehe die ganze Einzelselektor-Sache, aber ich erstelle Vorlagen mit kürzeren Klassennamen viel schneller.
Unterelement-Klassennamen beginnen immer mit doppelten Unterstrichen und Modifikatoren mit einem einzelnen Bindestrich. Ich finde, es ist viel einfacher zu lesen, sowohl im HTML als auch im SCSS, zum Beispiel
HTML
SCSS
Ich mache etwas Ähnliches, aber mit dem Kind-Kombinator in internen Selektoren. Andernfalls setzen Sie sich dem Risiko von Regressionen und Selektorenkämpfen beim Komponieren von Komponenten aus. Z.B. wenn sich dieser Akkordeon aus einem ArticleBlurb zusammensetzt, der seinen eigenen __content haben kann, dann werden die __content-Stile des Akkordeons auf die des ArticleBlurbs angewendet. Dies wird leicht mit dem Kind-Kombinator behoben.
Sie verlieren die Flexibilität, beliebige Elemente in die Akkordeon-Struktur einzufügen, aber das ist ein Feature, kein Bug. Eine konsistente Struktur macht Komponenten viel einfacher zu verwalten.
Knappster, ich mache auch die gleiche Verschachtelungsart (zusammen mit Mike), aber meine Namenskonvention ist anders.
Da „Accordion“ und jede andere Modulklasse mit einem Großbuchstaben beginnt, kann ich eine Nachkommenklasse mit einem beliebigen Kleinbuchstaben benennen, da Klassen case-sensitiv sind.
Weitere Informationen zu dieser Namenskonvention: http://www.sitepoint.com/title-css-simple-approach-css-class-naming/
Beachten Sie, dass wir uns auch auf die Effizienz unseres CSS konzentrieren sollten. Ich würde argumentieren, dass Effizienz bei allem, was zählt, Vorrang vor unserer Entwicklungsfreundlichkeit haben sollte.
https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Writing_efficient_CSS
Nick, dem stimme ich entschieden nicht zu. „Vorzeitige Optimierung ist die Wurzel allen Übels.“ Ein Projekt hat im Allgemeinen weitaus größere Risiken durch unorganisiertes CSS als durch unoptimierte Selektoren. Sind Leistung/Effizienz etwas, das man beachten und verstehen sollte? Ja. Aber es sollte nicht der primäre Fokus sein. Optimieren Sie nur, wenn nötig. Im Gegensatz zu den meisten Programmiersprachen ist CSS in dieser Hinsicht eine besonders sensible Softwaretechnologie, da sie keine starken Abstraktionsmechanismen bietet, hinter denen man knifflige Optimierungen verstecken kann.
Das heißt, es gibt andere Möglichkeiten, die Darstellung zu optimieren als durch Selektoren. Begrenzen Sie die Verwendung von Schatten und Transparenz. Bevorzugen Sie CSS3-Übergänge/Animationen gegenüber JavaScript. Verketten Sie Stylesheets, um den HTTP-Overhead zu reduzieren.
Gültiger Punkt, mein Beispiel ist etwas zu vereinfacht, denke ich.
Als neuer Webdesigner & Entwickler ist es für Breakpoints für responsives Design nützlich. Weil die Codes sauberer sind.