Entwickler Ben Frain bemerkte einmal, dass es einfach ist, CSS-Code zu schreiben, aber schwierig, ihn zu skalieren und zu unterstützen. Dieser Artikel beschreibt die verfügbaren Lösungsansätze für dieses Problem.
OOCSS

OOCSS steht für Object-Oriented CSS. Dieser Ansatz hat zwei HauptIdeen
- Trennung von Struktur und Design
- Trennung von Container und Inhalt
Durch die Verwendung dieser Struktur erhält der Entwickler allgemeine Klassen, die an verschiedenen Stellen verwendet werden können.
An dieser Stelle gibt es zwei Nachrichten (wie üblich, gute und schlechte)
- Gut: Reduzierung der Code-Menge durch Wiederverwendung (DRY-Prinzip).
- Schlecht: Komplizierte Wartung. Wenn Sie den Stil eines bestimmten Elements ändern, müssen Sie höchstwahrscheinlich nicht nur CSS ändern (da die meisten Klassen gemeinsam genutzt werden), sondern auch Klassen zum Markup hinzufügen.
Darüber hinaus bietet der OOCSS-Ansatz selbst keine spezifischen Regeln, sondern abstrakte Empfehlungen, sodass die Umsetzung dieser Methode in der Produktion variiert.
Wie es sich herausstellt, haben die Ideen in OOCSS andere dazu inspiriert, ihre eigenen, konkreteren Methoden zur Code-Strukturierung zu entwickeln.
SMACSS

SMACSS steht für Scalable and Modular Architecture for CSS. Das Hauptziel des Ansatzes ist die Reduzierung der Code-Menge und die Vereinfachung der Code-Wartung.
Jonathan Snook teilt Stile in 5 Teile auf
- Basisregeln. Dies sind die Stile der wichtigsten Website-Elemente – body, input, button, ul, ol usw. In diesem Abschnitt verwenden wir hauptsächlich HTML-Tags und Attributselektoren, in Ausnahmefällen – Klassen (z. B. wenn Sie JavaScript-Stil-Auswahlen haben);
- Layout-Regeln. Hier sind die Stile globaler Elemente, die Größe des Headers, Footers, der Seitenleiste usw. Jonathan schlägt vor, hier IDs in Selektoren zu verwenden, da diese Elemente nicht mehr als einmal auf der Seite vorkommen. Der Autor des Artikels hält dies jedoch für schlechte Praxis (immer wenn eine ID in den Stilen auftaucht, ist irgendwo auf der Welt eine Katze traurig).
- Modul-Regeln. Blöcke, die mehrmals auf einer Seite verwendet werden können. Für Modulklassen wird nicht empfohlen, ID- und Tag-Selektoren zu verwenden (zur Wiederverwendbarkeit und Kontextunabhängigkeit bzw.).
- Zustandsregeln. In diesem Abschnitt werden die verschiedenen Zustände der Module und der Basis der Website festgelegt. Dies ist der einzige Abschnitt, in dem die Verwendung des Schlüsselworts „!Important“ zulässig ist.
- Themenregeln. Design-Stile, die Sie möglicherweise ersetzen müssen.
Es wird auch empfohlen, einen Namespace für Klassen einzuführen, die zu einer bestimmten Gruppe gehören, sowie einen separaten Namespace für Klassen zu verwenden, die in JavaScript verwendet werden.
Dieser Ansatz erleichtert das Schreiben und Pflegen von Code und hat eine große Anzahl von Entwicklern angezogen.
Atomic CSS

Bei Atomic CSS wird für jede wiederverwendbare Eigenschaft eine separate Klasse erstellt. Zum Beispiel nimmt margin-top: 1px; die Erstellung einer Klasse mt-1 oder width: 200px; die Klasse w-200 an.
Dieser Stil ermöglicht die Minimierung der CSS-Code-Menge durch Wiederverwendung von Deklarationen, und es ist auch relativ einfach, Änderungen an Modulen vorzunehmen, zum Beispiel bei einer Änderung einer technischen Aufgabe.
Dieser Ansatz hat jedoch erhebliche Nachteile
- Klassennamen sind beschreibende Eigenschaftsnamen, die nicht die semantische Natur des Elements beschreiben, was die Entwicklung manchmal erschweren kann.
- Anzeigeeinstellungen sind direkt im HTML.
Aufgrund dieser Mängel stieß der Ansatz auf erhebliche Kritik. Dennoch kann der Ansatz für große Projekte effektiv sein.
Außerdem wird Atomic CSS in verschiedenen Frameworks verwendet, um korrigierende Elementstile zu definieren, und in einigen Schichten anderer Methodologien.
MCSS

MCSS ist Multilayer CSS. Diese Art des Code-Schreibens schlägt vor, Stile in mehrere Teile zu unterteilen, die als Schichten bezeichnet werden.
- Nullschicht oder Fundament. Der Code, der für das Zurücksetzen von Browser-Stilen verantwortlich ist (z. B. reset.css oder normalize.css);
- Die Basisschicht umfasst Stile von wiederverwendbaren Elementen auf der Website: Buttons, Eingabefelder für Text, Hinweise usw.
- Die Projektschicht umfasst separate Module und den „Kontext“ – Modifikationen von Elementen je nach Client-Browser, dem Gerät, auf dem die Website/Anwendung betrachtet wird, Benutzerrollen usw.
- Die kosmetische Schicht ist im OOCSS-Stil geschrieben und nimmt geringfügige Änderungen am Aussehen von Elementen vor. Es wird empfohlen, nur Stile beizubehalten, die das Aussehen beeinflussen und das Layout der Website nicht brechen können (z. B. Farben und nicht kritische Einrückungen).
Die Hierarchie der Interaktion zwischen den Schichten ist sehr wichtig
- Die Basisschicht definiert neutrale Stile und beeinflusst andere Schichten nicht.
- Elemente der Basisschicht können nur die Klassen ihrer Schicht beeinflussen.
- Elemente der Projektschicht können die Basis- und Projektschichten beeinflussen.
- Die kosmetische Schicht ist in Form von beschreibenden OOCSS-Klassen („atomare“ Klassen) konzipiert und beeinflusst keinen anderen CSS-Code, sondern wird selektiv im Markup angewendet.
AMCSS

AMCSS ist „Attribute Modules for CSS“.
Schauen wir uns ein Beispiel an
<div class="button button--large button--blue">Button</div>
Eine solche Klasse ist nicht einfach, also gruppieren wir diese Werte nach Attributen.
Hier ist, was passiert
<div button="large blue">Button</div>
Um Namenskollisionen zu vermeiden, ist es ratsam, Attribute zu benennen. Dann nimmt unser Button-Code folgende Form an
<div am-button="large blue">Button</div>
Wenn Sie den Validator zur Überprüfung des Codes verwenden und ihm das Attribut am-button nicht gefällt, können Sie dem Attributnamen ein data- voranstellen.
Der wenig bekannte Selektor „~=“ (IE7+) wird verwendet, der wie ein Klassenattribut funktioniert: Er wählt Elemente aus, deren Attributwerte die angegebenen Wörter enthalten, getrennt durch Leerzeichen. Der Selektor der Form [class~="link"][class~="button"] ist also ähnlich dem Selektor a.link.button. Sogar in Bezug auf die Spezifität, da die Selektorspezifitäten für die Klasse und das Attribut gleich sind!
Entsprechend der CSS-Code
.button {...}
.button--large {...}
.button--blue {...}
Wird umgewandelt in
[am-button] {...}
[am-button~="large"] {...}
[am-button~="blue"] {...}
Wenn Sie der Meinung sind, dass dieser Code zu ungewöhnlich ist, können Sie eine weniger radikale AMCSS-Form verwenden
<div am-button am-button-large am-button-blue></div>
FUN

FUN steht für Flat hierarchy of selectors (flache Hierarchie von Selektoren), Utility styles (Dienstprogramme-Stile), Name-spaced components (komponenten mit Namensräumen).
Hinter jedem Buchstaben des Namens steckt ein bestimmtes Prinzip
- F, flache Hierarchie von Selektoren: Es wird empfohlen, Klassen zum Auswählen von Elementen zu verwenden, die Kaskade unnötigerweise zu vermeiden und IDs nicht zu verwenden.
- U, Dienstprogramme-Stile: Es wird ermutigt, atomare Dienstprogramm-Stile zur Lösung typischer Markup-Aufgaben zu erstellen, z. B.
w100fürwidth: 100%;oderfrfürfloat: right; - N, benannte Komponenten: Ben empfiehlt, Namensräume für die Angabe der Stile von spezifischen Modul-Elementen hinzuzufügen. Dieser Ansatz vermeidet Überlappungen in Klassennamen.
Einige Entwickler stellen fest, dass der nach diesen Prinzipien geschriebene Code recht bequem zu schreiben und zu warten ist. Der Autor hat gewissermaßen das Beste aus SMACSS übernommen und diese Technik einfach und prägnant dargestellt.
Dieser Ansatz stellt recht wenige Anforderungen an das Projekt und die Code-Struktur. Er legt nur die bevorzugte Form der Aufzeichnung von Selektoren und deren Verwendung im Markup fest. Aber in kleinen Projekten können diese Regeln durchaus ausreichen, um qualitativ hochwertigen Code zu erstellen.
Fazit
Wie Sie sehen, gibt es unter diesen Ansätzen keine ideale Lösung. Daher ist keine dieser Methoden eine absolute Regel – Sie können einen Ansatz von Grund auf neu nehmen, um etwas Eigenes zu schaffen, oder einen neuen Ansatz von Grund auf neu entwickeln.
Gute Zusammenfassung, danke.
Was haben Sie für Ihre Diagramme verwendet?
Danke für den Artikel! Es wäre schön, eine Umfrage zu erstellen, um herauszufinden, was bei den Entwicklern am häufigsten verwendet wird.
Vielen Dank für diesen Beitrag.
Ich kenne bereits OOCSS, SMACSS, aber nicht die anderen.
Und was ist mit BEM (Bloc, Element, Modifier)?
Ich würde denken, dass BEM ein Anwärter auf eine der beliebtesten Methoden zur Organisation von CSS wäre.
Ich bin überrascht, dass das, was meiner Meinung nach eine der beliebtesten Methoden ist, nicht aufgeführt ist: BEM (Block-Element-Modifier) und seine Ableitungen.
http://getbem.com/
Trotzdem toller Artikel, danke :)
Die für Atomic CSS genannten „erheblichen Nachteile“ sind meiner Meinung nach eigentlich Vorteile
Die „semantische Natur“ des Elements wird ausreichend durch Element-Tags (a, p, header, nav usw.) und die Namen von Komponenten in Ihrer Vorlagenstruktur (card.tag usw.) definiert.
Manche Leute finden es einfacher, Anzeigeeinstellungen zu verstehen, wenn sie diese im Markup sehen, ohne in CSS bohren zu müssen, um zu sehen, was wo definiert wurde.
Ich dachte, hier würde etwas über ITCSS stehen. Ich mag es bisher sehr!
Sie können ITCSS hier sehen http://www.creativebloq.com/web-design/manage-large-css-projects-itcss-101517528
Hallo Inessa,
Ich denke, es lohnt sich zu erwähnen, dass die Nachteile, die Sie bezüglich Atomic CSS erwähnen, nur für Leute existieren, die an die „Trennung der Anliegen“ (semantische Klassennamen) glauben. Siehe „Meinungen von Führungskräften gelten als schädlich„.
Ich wollte gerade dasselbe sagen. Wie genau nützen semantische Klassennamen einem Projekt? Sie nützen Suchmaschinen, Endbenutzern oder Barrierefreiheitstools nicht. Warum wird dies also als Nachteil betrachtet – geschweige denn als „erheblicher“?
Es tut mir wirklich leid, Thierry. ACSS ist wirklich cool…
@Ben Natürlich gibt es keine Vorteile für den Benutzer bei der Verwendung semantisch bedeutungsvoller CSS-Klassen. Der Vorteil liegt hier bei den Entwicklern: Sie erhalten eine viel klarere Vorstellung davon, wofür etwas ist, mit Klassen wie
submit-buttonanstelle vonc-green ph-10 pv-5 m-5.Wenn Sie Ihre Vorlagen in separate Dateien für eine Vorlagen-Engine zerlegen, dann macht Atomic Design meiner Meinung nach viel Sinn. Sie kennen den Kontext durch den Namen der Komponente und verstehen genau, was sie mit atomaren Klassen tut.
Sie haben zu Beginn des Artikels einen Kommentar von Ben Frain erwähnt. Er würde es vielleicht zu schätzen wissen, wenn Sie ECSS erwähnen. Er hat das Buch geschrieben.
Ich würde auch empfehlen, BEM und ITCSS zu untersuchen.
CSS Modules fehlt ebenfalls. Ich glaube, es ist der heilige Gral im aktuellen „Meta-Komponenten“-Bereich.
Ich habe Atomic CSS noch nie für ein persönliches Projekt verwendet, aber ich musste das Aussehen eines bestehenden Atomic CSS-Projekts anpassen. Es ist SCHRECKLICH!!
Da der Entwickler keine semantischen Klassen deklariert hat, gibt es nichts, woran Stilregeln angehängt werden können. Möchten Sie die Farbe für ein Element ändern? Zu schlecht. Es ist als orange definiert, es wird orange bleiben.
Die einzige Möglichkeit, das CSS zu überschreiben, ist die Verwendung von Geschwisterklassen-Selektoren (wenn kein anderes orangefarbenes Element dieselben Geschwisterklassen hat) oder hierarchischen Selektoren. Beides ist schrecklich und ein Hack. schüttelt sich
Wir verwenden seit einiger Zeit eine Form von FUN in unseren Projekten. Und wir haben einen universellen Satz von Stilen für die Struktur gefunden, den wir auf jeder einzelnen Website, jedem Formular, jedem Design, was auch immer, verwenden können. Dies wurde zu unserer Grundlage. Diese Grundlage wird im Laufe der Zeit iteriert und verbessert.
Dann stellten wir fest, dass es gut war, eine Standard-Website-Stilsammlung über dieser Grundlage zu haben. Standardfarben, Schriftformatierung usw., mit Media Queries, die für eine Website spezifisch sind.
Als nächstes ein einfaches zusätzliches CSS-Dokument, dessen Zweck von Zeile eins an war, keine Ordnung oder Kaskade zu erfordern. Das bedeutete, dass wir alle Anpassungen an diesem Dokument ohne zukünftige Wartungsprobleme vornehmen konnten, denn wir alle wissen, dass die Stile hier nicht von kaskadierenden Effekten an sich abhängen. So kann alles ohne Bedenken an den Anfang des Dokuments gestellt werden. (weniger Sorgen beschleunigen die Arbeit)
Zuletzt seiten-spezifische Stile. Zum Beispiel hat die Startseite ein ungewöhnliches Element, das nirgendwo sonst verwendet wird, stecken Sie es in die home.css-Datei, fertig. Dies vermeidet die Notwendigkeit von Inline-Stilen oder unübersichtlichen Einfügungen in andere längere oder verallgemeinerte CSS-Dateien. Und alle ausgefallenen Stilbedürfnisse für eine einzelne Seite sind gut auf die Zukunft verteilt und leicht zu verwalten.
Foundation > Site > Extra > Page
Es ergibt zwar kein süßes Akronym. (FoSEP? :P ) Im schlimmsten Fall sind es 4 HTTP-Anfragen, optimiert sind es 2 (FSE, und dann Seite getrennt) oder HTTP2 zur Rettung auf dem Weg.
Was halten Sie von den React-Trends, das CSS neben der Komponente zu halten?
Der erste Versuch wurde mit Inline-Stilen unternommen, aber das wurde durch ausgefeiltere Tools wie Aphrodite ersetzt, das Tags generiert und das CSS in sie einfügt, wenn Komponenten geladen werden
Schöner Artikel. Erstaunliche CSS-Informationen an einem Ort.
Das Folgende ist meiner Meinung nach alles implizit.
Dies ist eine gute Zusammenfassung, aber ich denke, aus der Sicht der modernen, „komponentenorientierten“ und lokal geskripteten CSS-Entwicklung sind diese Ansätze alle irgendwie überflüssig. Es ist eigentlich bemerkenswert, dass BEM hier nicht erwähnt wird, obwohl es das Beste von allen ist, wenn es um Komponenten geht.
Wenn es eine Methodik gibt, die sterben muss, dann ist es Atomic CSS. Die geringen Vorteile (kleinere Stylesheets, zum Beispiel) werden von den sehr großen Nachteilen bei weitem überschattet, nämlich:
Es koppelt den Stilcode eng mit dem Atomic CSS-Framework, das zum Generieren der Klassen verwendet wird (nein, es gibt nicht nur Tachyons);
Die Konventionen zur Benennung der Klassen suchen nach Kürze, implizieren eine Lernkurve und sind oft unklar (bezieht sich
b-10auf den Rand oder auf diebottom-Eigenschaft? Ist einew-20-Box 20 Pixel groß oderems, Punkte oder %?);Atomizer löst die oben genannten Probleme, aber das Ergebnis sind natürlich längere Klassennamen, und das führt zum nächsten Problem: Für jedes Element enden Sie möglicherweise mit einem Dutzend Klassennamen, die möglicherweise alle in einer einzigen Zeile zusammengepresst sind (d. h. eine Qual zum Lesen);
Natürlich können Sie HTML-Attribute auf mehrere Zeilen aufteilen, aber das beeinträchtigt umgekehrt die Lesbarkeit des HTML als Ganzes;
Es wird nicht gut altern, wenn neue CSS-Module zu den Spezifikationen hinzugefügt werden;
Media Queries verkomplizieren alles;
Es ist irreführend, da es zu einer Darstellung dessen führt, was die Entwickler/Designer sehen das Ergebnis, aber es ist nicht immer, wie es dem Benutzer präsentiert wird: Etwas wie
bg-blueverliert auf einem E-Ink-Display oder einem Screenreader alle Bedeutung.Es zwingt Entwickler, nur atomare Klassen zu verwenden und semantische Klassen zu vergessen, die als Referenzen und Namensräume für umgebende und absteigende Elemente verwendet werden können (z. B. der erste Absatz nach einer Überschrift oder abwechselnde Zeilen in einer Tabelle);
Folglich verschiebt es die pragmatische Logik von CSS zu HTML und sogar JavaScript, wo Sie dynamische Inhalte generieren müssen;
Es bietet keine klare Lösung für komplexere Elementzustände (d. h. nicht nur
:focusoder:hover, sondern etwas wie „ausgewählt“ oder „E-Mail gesendet“).Das sind nur eine Reihe von Problemen, die mir einfallen, und vielleicht vergesse ich einige. Aber die Schlussfolgerung ist: Atomic CSS ist eine Qual zu lernen, zu verwenden und zu warten.
Wenn es Ihnen gefällt, sage ich nicht, dass Sie nicht mein Freund sein können, aber… bitten Sie mich nicht, etwas zusammen zu entwickeln. :)
Es ist vielleicht kein Allheilmittel, aber ich denke, es hängt von Ihren Bedürfnissen und dem Kontext Ihrer Situation ab. Sowohl als Designer als auch als Entwickler finde ich es als leicht portierbaren Ausgangspunkt für neue Projekte und schnelles Prototyping während der iterativen Phasen der Entwicklung sehr ansprechend. Ich vergesse, was Photoshop heutzutage überhaupt ist. Besonders in einer komponentenbasierte Single-Page-App habe ich festgestellt, dass es den Aufbau von Komponenten zu einem schnellen Prozess macht. Diese Komponenten selbst dienen als semantische Referenzen, und wie oben erwähnt, kann das Element selbst manchmal genügend semantische Informationen liefern.
Ich lade Sie ein, diesen Artikel zu lesen
Sie werden sehen, dass Abkürzungen nicht immer verwendet werden. Und das Problem, das Sie mit der Lernkurve für Abkürzungen sehen, ist etwas albern. Alles, was Sie brauchen, ist eine dokumentierte Referenz für jede Abkürzung, und sobald Sie eine Weile damit gearbeitet haben, wird die Referenz unnötig. Die Lernkurve ist überhaupt nicht steil, tatsächlich ist sie ziemlich elementar.
Ich persönlich verwende keine Abkürzungen und ich verwende BEM gerne, um zu kommunizieren, wie ein Block verschachtelt ist, wenn es um den Aufbau monolithischer Komponenten geht. Ich folge einem ähnlichen Stil wie diesem
http://solid.buzzfeed.com/
Ich habe diesen Artikel gelesen, als er herauskam.
Das Problem mit dem Erlernen einer neuen Syntax ist real und präsent. Es erfordert Engagement von allen Entwicklern. Das heißt, Sie können Atomic CSS nicht nur einmal verwenden, oder Sie vergessen die verwendeten Konventionen und müssen sie wieder studieren.
Und das würde in einem Unternehmen passieren, wie dem, in dem ich arbeite, das hauptsächlich externe Beratung anbietet und oft mit Codebasen zu tun hat, die anderswo konzipiert wurden.
Und glücklicherweise sind wir noch nie auf ein Projekt gestoßen, das mit Atomic CSS entwickelt wurde, denn wir müssten ein weiteres Tool und (wahrscheinlich schlecht dokumentierte) Einrichtung lernen, bevor wir überhaupt etwas tun können. Und selbst wenn wir Atomic CSS verwenden würden, könnten sie andere Konventionen für ihre Klassen verwendet haben.
Tatsächlich ist der Schuldige hier, dass Atomic CSS eine weitere willkürliche Abstraktionsebene über CSS impliziert. Eine Ebene, die gelernt und konsistent verwendet werden muss, während wir diese Ressourcen nutzen könnten, um sofort produktiv zu sein.
Natürlich sind wir auf weitaus schlimmere Dinge gestoßen, wie z. B. 8000 Zeilen lange CSS-Dateien mit Spaghetti-artigen Klassen und Deklarationen, mit vielen IDs und !important-Sachen. Dinge, die einen zum Zusammenrollen und Weinen bringen. Atomic CSS hätte zumindest eine Anstrengung zur Organisation des Codes bedeutet.
Aber wenn es um Projekte geht, die von uns aus beginnen, fühlt sich eine klassische, komponentenbasierte SCSS-Codebasis für uns natürlicher an.
Atomic CSS ist das, was ich jetzt bei der ARBEIT benutze. Ich erstelle und pflege eine ASP.NET-Webanwendung. Es scheint für mich JETZT am besten zu funktionieren, weil wir viele Programmierer haben, die nicht viel über SASS oder CSS wissen und sie viel Kontakt mit mir aufnehmen und fragen müssen, ABER jetzt, da ich ein einfaches Dienstprogramm-Set von Klassen nur für sie habe, können sie Dinge bauen und mich in Ruhe lassen. :)
Eine weitere nützliche Methodik ist Harry Roberts ITCSS. Es gibt nicht viele Informationen darüber, aber ein guter Überblick ist der Artikel von Lubos Kmetko auf xfive (https://www.xfive.co/blog/itcss-scalable-maintainable-css-architecture/)
Danke für den Artikel, der die verschiedenen Ansätze vergleicht.
Ich bin ein Fan der Atomic Design-Methodologie von CSS.
Ich habe kürzlich mein eigenes, von Atomic Design inspiriertes CSS-Framework entwickelt. Dieses Framework entstand aus meinem Bedürfnis nach einer schnellen Möglichkeit, HTML-Prototypen zu entwickeln, ohne Zeit auf die CSS-Entwicklung zu verwenden (deshalb verwendet es einen großen Teil von Utility-CSS-Klassen).
Bitte schauen Sie es sich auf GitHub an und erstellen Sie gerne Branches oder geben Sie mir Feedback. Ich bin dabei, einige Dokumentationen zu entwickeln.
https://github.com/celummis/AtomicAgnosticCSS
Ich vermisse auch ITCSS von Harry Roberts. Habe es vor einem Jahr in einem größeren SCSS/SASS-Projekt übernommen und mag es eigentlich sehr
Ich persönlich verwende ITCSS für die Architektur mit BEM für Namenskonventionen, zusammen mit einigen Ideen für Namensräume, die aus SCMACSS stammen. Funktioniert sehr gut. Alle Credits gehen natürlich an Harry Roberts. Es lohnt sich, seine Artikel und Vorträge anzusehen.
https://csswizardry.com/
http://rscss.io
Wirklich lesbares Markup (d. h. nicht BEM) und Stile sind ziemlich sicher vor zu starkem Auslaufen. In Kombination mit der Bereichsabgrenzung von CSS Modules sieht das ziemlich gut aus.