CSS wird langsam geschrieben, Zeile für Zeile, und mit jedem vergehenden Moment schränken wir den Raum dessen ein, was für unser Designsystem möglich ist. Nehmen wir dieses Beispiel
body {
font-family: 'Proxima-Nova', sans-serif;
color: #333;
}
Mit nur wenigen Zeilen CSS haben wir die Standardeinstellungen für unsere gesamte Codebasis festgelegt. Die meisten Elemente (wie Absätze, Listen und einfache divs) erben diese Anweisungen. Aber was wir beim Schreiben von CSS selten bedenken, ist, dass wir von nun an diese Regeln ständig überschreiben müssen, wenn wir eine andere Schriftart oder Farbe wünschen. Und es sind diese Überschreibungen, die viele Probleme in Bezug auf Wartung und Skalierbarkeit verursachen. Und es sind diese Probleme, die uns Herzschmerz, Zeit und Geld kosten.
Im obigen Beispiel ist das wahrscheinlich kein Problem, aber ich denke, im Allgemeinen erkennen wir nicht die wahre Stärke und die Gefahren der Kaskade und was sie für unsere Designsysteme bedeutet; die meisten Leute denken, dass die Kaskade dazu dient, frühere Anweisungen zu überschreiben, aber ich würde davor warnen. Jedes Mal, wenn wir einen Stil überschreiben, der geerbt wird, machen wir unsere Codebasis um ein Vielfaches komplexer. Wie viele Stunden haben Sie damit verbracht, ein Element zu inspizieren und durch jede Regel zu scrollen, um zu verstehen, warum ein Element so aussieht, wie es aussieht, oder wie die lange Kette von Vererbung Ihre Stile komplett durcheinandergebracht hat?
Ich denke, der Grund dafür ist, dass wir oft nicht die richtigen Standardstile für unsere Elemente festlegen. Und wenn wir den Stil eines Elements ändern wollen, anstatt uns die Zeit zu nehmen, diese Standardstile zu hinterfragen und neu zu gestalten, überschreiben wir sie einfach – was die Sache noch schlimmer macht.
Daher habe ich viel darüber nachgedacht, wie wir eine Codebasis erstellen sollten, die uns alle dazu anregt, besseren Code zu schreiben, und wie wir unser CSS so gestalten, dass es andere Leute nicht dazu ermutigt, hacky Klassen zu erstellen, um Dinge zu überschreiben.
Einer meiner Lieblingsartikel zu diesem Thema wurde Anfang dieses Monats von Brandon Smith geschrieben, wo er die Wege beschreibt, wie CSS so kompliziert werden kann (Hervorhebung von mir)
…sei nie expliziter als nötig. Webseiten sind standardmäßig responsiv. Gutes CSS zu schreiben bedeutet, diese Tatsache zu nutzen, anstatt sie zu überschreiben. Verwenden Sie Prozentangaben oder Viewport-Einheiten anstelle von Media Queries, wenn möglich. Verwenden Sie min-width anstelle von width, wo Sie können. Denken Sie in Begriffen von Regeln, in Begriffen dessen, was Sie wirklich sagen wollen, anstatt nur Eigenschaften hinzuzufügen, bis die Dinge richtig aussehen. Versuchen Sie, ein Gefühl dafür zu bekommen, wie der Browser Layout und Größen bestimmt, und nehmen Sie Ihre Änderungen und Ergänzungen vorsichtig darauf vor. **Arbeiten Sie mit CSS, nicht dagegen.**
Einer von Brandons Vorschlägen ist, die width-Eigenschaft ganz zu vermeiden und stattdessen bei max-width oder min-width zu bleiben. In dem gesamten Beitrag erinnert er uns daran, dass alles, was wir bauen, zwischen Bereichen, zwischen zwei Extremen liegen sollte. Hier ist also ein Beispiel für eine Klasse mit einem schlechten Standardstil
.button {
width: 300px;
}
Ist dieser Button wahrscheinlich immer, *überall* diese Breite zu haben? Auf Mobilgeräten? In jeder Media Query? In jedem Zustand? Das bezweifle ich stark, und tatsächlich glaube ich, dass diese Klasse geradezu danach schreit, mit einer weiteren Klasse überschrieben zu werden
.button-thats-just-a-bit-bigger {
width: 310px;
}
Das ist ein albernes Beispiel, aber ich habe so etwas in vielen Teams gesehen – und das nicht, weil die Person schlechten Code geschrieben hat, sondern weil **das System sie dazu ermutigt hat, schlechten Code zu schreiben**. Jeder hat eine Frist für den Versand eines Produkts, und die meisten Leute haben nicht die Zeit oder die Neigung, sich in eine große Codebasis einzutauchen und diese Kern-Standardstile, die ich erwähnt habe, neu zu gestalten. Es ist einfacher, einfach weiterhin CSS zu schreiben, weil es sofort alle ihre Probleme löst.
In diesem Zusammenhang schrieb Jeremy Keith gerade neulich über dieses Problem
Im Gegensatz zu einer Programmiersprache, die Kenntnisse über Schleifen, Variablen und andere Konzepte erfordert, ist CSS ziemlich einfach zu erlernen. Vielleicht hat es deshalb den Ruf, einfach zu sein. Es ist einfach im Sinne von "nicht komplex", aber das bedeutet nicht, dass es leicht ist. "Einfach" mit "leicht" zu verwechseln, führt nur zu Herzschmerz.
Ich denke, das ist einigen Programmierern passiert, die zum ersten Mal mit CSS in Berührung kommen. Sie haben gehört, dass es einfach ist, also gehen sie davon aus, dass es leicht ist. Aber wenn sie es dann versuchen zu benutzen, funktioniert es nicht. Es muss die Schuld der Sprache sein, denn sie wissen, dass sie klug sind und dass das leicht sein soll. Also geben sie der Sprache die Schuld. Sie sagen, sie sei kaputt. Und so versuchen sie, sie zu "reparieren", indem sie sie an eine programmatischere Denkweise anpassen.
Ich kann nicht umhin zu denken, dass sie weniger frustriert wären, wenn sie akzeptieren würden, dass CSS nicht leicht ist. Einfach, ja, aber nicht leicht.
Der Grund, warum CSS einfach ist, ist die Kaskade, aber es ist wegen der Kaskade auch nicht so leicht, wie wir vielleicht zuerst denken. Es sind diese Standardstile, die sich in alles filtern, was die größte Stärke und größte Schwäche der Sprache ist. Und ich glaube nicht, dass JavaScript-basierte Lösungen dabei so viel helfen werden, wie alle gegenteiliges behaupten.
Also, was ist die Lösung? Ich denke, dass das Gestalten in einem Bereich, das Denken zwischen Zuständen und das Betrachten jeder einzelnen Zeile CSS als Vorschlag anstelle eines absoluten, unzerbrechlichen Gesetzes der erste Schritt ist. Was ist der nächste Schritt? Container-Abfragen. Container-Abfragen. Container-Abfragen.
Meiner Meinung nach ist es eine gute Idee, einem strengen Muster zu folgen, etwas wie Atomic Design. http://bradfrost.com/blog/post/atomic-web-design/
Auf diese Weise erstellen Sie High-Level-Kaskadenklassen, die als Vorlagen konzipiert sind, anstatt als globales Ding wie in Ihrem ersten Beispiel.
Ich stimme größtenteils zu, aber nach einigen Monaten der Verwendung von Atomic finde ich es immer noch schwierig zu bestimmen, in welche Kategorie einige Elemente fallen.
Das erinnert mich nur daran, dass eine der schwierigsten Aufgaben bei der Entwicklung von Benutzeroberflächen das Benennen von Dingen ist… normalerweise können sehr ähnliche Elemente nicht denselben Namen (oder dieselbe Klasse) haben, weil sie nicht so viele Eigenschaften gemeinsam haben…
Aber ich stimme zu, dass die Gestaltung in einem Bereich die Lösung sein könnte.
Ist nicht schon Ihre erste Deklaration (also body {font-family:...} die Standard-Stylesheet des Browsers überschreibt? Das bedeutet, dass alles etwas überschreibt. Ich glaube nicht, dass das etwas ist, worüber man sich Sorgen machen muss.
Ich denke, das eigentliche Problem, mit dem Sie tatsächlich konfrontiert sind, ist Faulheit/mangelnde Fähigkeit zur Strukturierung oder vielleicht, was noch wahrscheinlicher ist, die Zeitvorgaben von Produktionscode überschreiben die persönlichen Anforderungen an perfekte Codequalität.
Wenn Sie wöchentlich ein paar Websites produzieren und der Wert der Websites gering ist, sind diese Dinge trivial und absolut kein Problem, "überschreibt meine Jungs weg!" Wenn Sie ein Jahr lang an einer einzigen Website arbeiten… dann wird das Neugestalten großer Teile von CSS im Laufe der Zeit die Mängel beheben.
Entweder ist es immer noch kein Problem, ein vorübergehendes Problem (mit erwarteter Lösung in der Zukunft) oder einfach "nicht das Budget wert für den Kunden, es wartungsfreundlich zu machen… weil wir ihre Website sowieso in ein oder zwei Jahren neu machen werden…"
Ich glaube, dass dies ein wichtiges Problem ist, mit dem viele Leute zu kämpfen haben. CSS hat die Tendenz, zu einem unübersichtlichen Chaos zu werden. Ich versuche mein Bestes, nur das zu ändern, was nötig ist, und nach Bedarf neu zu gestalten, aber wenn die Zeit knapp ist oder andere Leute das CSS bearbeiten, geraten die Dinge schnell außer Kontrolle.
Außerdem sind gute Klassennamen *schwer*, selbst wenn man Dinge wie BEM verwendet. Ich arbeite ein wenig mit CSS-in-JS, was einige dieser Probleme für mich löst, aber ich bin mir nicht sicher, ob das unter allen Umständen eine angemessene Lösung ist.
Ich frage mich, ob Sie hauptsächlich Designer sind?
Es wäre interessant, eine Umfrage darüber zu sehen, wer Schwierigkeiten hat, CSS sauber zu halten, im Vergleich zu wem nicht, basierend auf technischem Interesse oder Fähigkeiten in Design im Vergleich zu Programmierung.
Ich programmiere sehr gerne mit CSS und als halb Programmierer/halb Designer habe ich nie das Gefühl gehabt, dass CSS unübersichtlich oder schwerfällig wird, und das ist nicht nur bei CSS so, schauen Sie sich http://thedailywtf.com/ an für alle Arten von Unordentlichkeiten in Nicht-CSS-Code.
Ich vermute, diejenigen, die generell Schwierigkeiten haben, CSS zu verwalten, sind vielleicht keine primären Programmierer? Ich habe keine Probleme beim Benennen von Dingen, tatsächlich genieße ich diesen Prozess und habe viele Benennungsebenen, abhängig vom Wert des Projekts (Deadline * Produktionsbudget / Projektgröße + Wartungsbudget = welches Benennungsschema zu verwenden ist)
Ich habe ein Benennungsschema für billige Websites mit geringen oder keinen Wartungsanforderungen und ein anderes für Codebasen, die sich über viele Jahre der Entwicklung erstrecken. Warum versuchen, ein Schema in jede Situation zu zwängen? Geben Sie sich und den kleinen Projekten eine Pause, damit Sie mentale Kapazitäten für die großen haben. :)
In meinem vorherigen Kommentar habe ich die Art des Projekts und die Auswirkungen auf die Wartung angesprochen (was das Benennungsschema bestimmt), aber insgesamt können Budget, Zeit, Aufwand und Fähigkeiten jedes Codierungsproblem lösen.
Ich würde sagen, ich bin hauptsächlich Entwickler. Ich vermute, ich denke vielleicht zu viel darüber nach und suche nach dem Heiligen Gral. OOCSS empfiehlt, Klassen nach visueller Semantik zu benennen, was ich etwas schwierig finde, Namen zu geben – ich lande oft bei Klassennamen, die von der Semantik des Inhalts oder der Funktionalität abgeleitet sind, was zu geringer Wiederverwendung von Klassen führt.
Ehrlich gesagt, ich arbeite am liebsten mit CSS-in-JS, und es ist ausgezeichnet für meine eigenen React-Projekte; wenn ich bei der Arbeit bin, arbeite ich mit Designern zusammen, die etwas CSS und keine Programmierung kennen, und Back-End-Entwicklern, die nicht unbedingt die Feinheiten von CSS kennen. Es ist sehr einfach, Tausende von Zeilen redundantem/veraltetem CSS zu erhalten, wenn mehrere Leute so zusammenarbeiten.
Dies war eine ausgezeichnete Einführung in den Artikel, auf den ich gehofft hatte.
Ein paar Worte für Sie: BEM und Variablen/Konstanten. Das resultierende Bündel ist aufgebläht? Oh ja. Aber hier sind wir – fast keine Kaskade, unabhängige Blöcke usw. usw.