Eine niedrige CSS-Spezifität über alle Selektoren Ihres Projekts hinweg zu halten, ist ein lohnenswertes Ziel. Es ist im Allgemeinen ein Zeichen dafür, dass die Dinge in relativer Harmonie sind. Sie kämpfen nicht gegen sich selbst und haben viel Spielraum, um Stile zu überschreiben, wenn Sie dies benötigen. Die Spezifität von Selektoren neigt dazu, mit der Zeit anzusteigen, und dem ist eine harte Grenze gesetzt. Ich bin sicher, wir alle haben den Schmerz von !important-Tags und Inline-Stilen erlebt.
Wie halten wir also diese Spezifität mit der Zeit niedrig?
Geben Sie sich die benötigte Klasse
Vielleicht schreiben Sie einen Selektor mit hoher Spezifität, weil Sie einen bereits vorhandenen Selektor überschreiben. Vielleicht ist das Element, das Sie auswählen möchten, auf mehreren Seiten enthalten, also wählen Sie es aus einer höheren Klasse aus.
.section-header {
/* normal styles */
}
body.about-page .section-header {
/* override with higher specificity */
}
Unabhängig davon, wie Sie dazu stehen, erkennen Sie, dass die Spezifität hier ansteigt. Um dies zu verhindern, gibt es eine Möglichkeit, den Klassennamen des Elements, das Sie direkt gestalten möchten, zu ändern? Manchmal kann die Erstellung serverseitiger Hilfsfunktionen oder Variablen zum Ausgeben von Klassen hilfreich sein, um Logik in Views zu vermeiden.
<header class="<%= header_class %>">
Which could output one class, or both, as desired.
</header>
.section-header {
/* normal styles */
}
.about-section-header {
/* override with same specificity */
/* possibly extend the standard class */
}
Berücksichtigen Sie die Quellreihenfolge der Stylesheets
In der gleichen Art und Weise, wie Sie etwas überschreiben wollen, wenden Sie vielleicht einen zusätzlichen Klassennamen an, um eine Stilüberschreibung für Sie zu handhaben.
<header class="section-header section-header-about">
</header>
Aber wo Sie Ihre Überschreibungsstile mit .section-header-about schreiben, werden diese tatsächlich von der bestehenden Klasse überschrieben. Das kann wegen der Selektorreihenfolge im Stylesheet passieren. Beide Selektoren haben exakt die gleiche Spezifität, sodass die Regeln von dem, was zuletzt deklariert wird, gewinnen.
Dies zu beheben bedeutet einfach sicherzustellen, dass dort, wo immer Sie Ihre Überschreibungsklasse schreiben, diese später kommt. Vielleicht organisieren Sie Ihre Stylesheets wie folgt:
@import "third-party-and-libs-and-stuff";
@import "global-stuff";
@import "section-stuff";
@import "specific-things-and-potential-overrides";
Reduzieren Sie die Spezifität des Dings, das Sie überschreiben
Sie wissen, was man sagt, hinterlasse Dinge besser, als du sie vorgefunden hast. Das solltest du tun.
Wenn ein ID auf einem Element vorhanden ist und dieses damit gestylt wird, können Sie es entfernen? Suchen Sie auf jeden Fall im gesamten Projekt nach #diesem, bevor Sie es tun. Es könnte als JS-Hook verwendet werden (was vollkommen in Ordnung ist), in diesem Fall sollten Sie es in Ruhe lassen und entweder eine Klasse hinzufügen oder eine bereits vorhandene Klasse für das CSS verwenden.
Vermeiden Sie von vornherein keine Klassen
Ich habe schon Selektoren verwendet wie
.module > h2 {
}
Das funktioniert gut, bis zu dem Tag, an dem Sie einen speziellen Stil für dieses h2-Element wünschen. Sie gehen vielleicht in Ihr Markup und denken:
<div class="module">
<h2 class="unique">
Special Header
</h2>
</div>
Aber leider
.module > h2 {
/* normal styles */
}
.unique {
/* I'm going to lose this specificity battle */
}
.module .unique {
/* This will work, but specificity creep! */
}
Die Spezifität nimmt zu, weil der ursprüngliche Selektor uns zubeißt. Deshalb empfehlen fast alle CSS-Methoden flache Strukturen im Sinne von
<div class="module">
<h2 class="module-header">
</h2>
<div class="module-content">
</div>
</div>
Es kann sich anfangs wie mühsame Arbeit anfühlen, da Sie die Klassen vielleicht nicht sofort benötigen. Aber indem Sie diese Arbeit nicht vermeiden (seien Sie nicht faul!), können die Hooks, die Sie später haben, Ihnen Kummer ersparen.
Nutzen Sie den Kaskadenstil
Wenn ein Projekt älter wird, wird es immer gefährlicher, Selektoren mit *niedriger* Spezifität zu ändern, da sie potenziell mehr Dinge beeinflussen und unbeabsichtigte Folgen haben können.
#im #just .gonna[do] .this .to .be #safe {
/* cries (ಥ_ʖಥ) */
}
Aber mehr Dinge zu beeinflussen, ist die Macht von CSS. Eine solide Basis, von der aus Sie aufbauen, bedeutet hoffentlich, dass weniger Überschreibungen jemals notwendig sind. Strategien dafür können sein...
Verwenden Sie eine Pattern Library und/oder Style Guide und/oder Atomic Design
Eine Pattern Library (etwas wie diese) kann bedeuten, dass Sie haben, was Sie brauchen, wenn Sie es brauchen. Brauchen Sie Tabs? Hier sind Sie, das ist die etablierte Methode dafür. Und es ist wahrscheinlich so aufgebaut, dass die Spezifität bereits gering ist, sodass die Überschreibung nicht übermäßig schwierig sein wird.
Atomic Design (Buch: hier) kann die Art und Weise leiten, wie Ihre Website (oder die Pattern Library) aufgebaut ist, so dass Sie auch dann, wenn Sie keine vollständige Vorlage für das haben, was Sie brauchen, die Bausteine darunter haben.
Ein Style Guide könnte Sie retten, da er möglicherweise spezifische Regeln bezüglich der Spezifität erzwingt, um Sie vor sich selbst zu bewahren.
Berücksichtigen Sie Opt-in-Typografie
Gleichzeitig, während Sie versuchen, den Kaskadenstil zu nutzen und für viele Elemente intelligente Standardwerte zu haben, möchten Sie vielleicht einige dieser intelligenten Standardwerte manchmal einschränken. Zum Beispiel wird ein Listenelement oft für Navigation und innerhalb von Inhalten verwendet. Die Stile dafür werden drastisch unterschiedlich sein. Warum also nicht mit einer sauberen Weste beginnen und Textstile nur bei Bedarf anwenden.
/* reset styles globally */
ul, ol, li {
list-style: none;
margin: 0;
padding: 0;
}
/* scope text styles to text content */
.text-content {
h1, h2, h3 {
}
p {
}
ul {
}
ol {
}
/* etc */
}
Das erhöht zwar die Spezifität dieser Textselektoren, bedeutet aber, dass Regeln, die speziell für Text sind, nicht mehr beeinflussen als nötig und weniger Überschreibungen erforderlich sind.
Probleme außerhalb Ihrer Kontrolle
Vielleicht erwartet oder injiziert ein Drittanbieter-Code bestimmte HTML-Elemente auf Ihrer Seite. Damit müssen Sie arbeiten. Sie können immer noch versuchen, so wenige Spezifität wie möglich zu verwenden. Sie können Kommentare im Code hinterlassen, die erklären, warum die Selektoren so sind. Sie können Selektoren mit geringer Spezifität verwenden, aber !important-Überschreibungen verwenden. Sie können die Verantwortlichen für den nicht optimalen Code bitten, ihn zu korrigieren.
Erhöhen Sie die Spezifität nur leicht und vermerken Sie sie
Wenn Sie in einen Spezifitätskampf geraten müssen, anstatt zu einer Sledgehammer-Methode wie ID oder !important zu greifen, versuchen Sie etwas Leichteres.
Ein Tag-Qualifizierer ist die geringstmögliche Spezifitätssteigerung.
ul.override {
/* I win */
}
.normal {
}
Aber die Beschränkung eines Selektors auf ein bestimmtes Tag ist eine seltsame Einschränkung. Es könnte klug sein, stattdessen einfach eine zusätzliche Klasse hinzuzufügen. Wenn ein anderer Name keinen Sinn ergibt, können Sie sogar dieselbe Klasse verwenden, wenn nötig.
.nav.override {
}
.override.override {
}
.nav {
}
Nur weil Verschachtelung nett ist, heißt das nicht, dass die Spezifität steigen muss
Verschachtelung in Präprozessoren wird manchmal entmutigt, weil sie es so einfach macht, übermäßig komplizierte Selektoren zu schreiben. Aber Verschachtelung ist manchmal einfach visuell nett im Stylesheet, weil sie Dinge gruppiert und sie leichter zu lesen und zu verdauen macht.
Bohdan Kokotko erinnerte mich kürzlich daran, dass das kaufmännische Und in Sass verwendet werden kann, um im Wesentlichen Namespacing statt zusammengesetzter Selektoren zu betreiben.
.what {
color: red;
&-so {
color: green;
&-ever {
color: blue;
}
}
}
.what {
color: red;
}
.what-so {
color: green;
}
.what-so-ever {
color: blue;
}
Der Single-Class-Wrapper
Eine ziemlich drastische Methode, um eine Überschreibung zu handhaben, ist die Verwendung eines bestehenden Wrapper-Elements über dem Bereich, den Sie mit Stilüberschreibungen versehen müssen, oder die Hinzufügung eines neuen.
<div class="override">
... existing stuff ...
</div>
Sie haben nun die Möglichkeit, jeden bestehenden Stil dort zu überschreiben, indem Sie nur eine einzige Klasse zum Selektor hinzufügen. Das ist Spezifitätsanstieg, aber ein Versuch, ihn niedrig zu halten.
.override .existing {
}
Nur einmal
Wenn Sie jemals eine Überschreibung überschreiben, ist das ein guter Punkt, um innezuhalten und nachzudenken.
Können Sie sich selbst nur eine einzige Klasse geben, die Sie stattdessen verwenden können? Eine einzelne Überschreibung kann tatsächlich effizient sein, wie eine Variation eines Musters, anstatt ein neues Muster zu erstellen. Eine Überschreibung einer Überschreibung ist ein Rezept für Verwirrung und weiteren Kampf.
Machen Sie es beim nächsten Mal einfach besser
Wenn Sie von Spezifitätsproblemen geplagt wurden, auch wenn deren Behebung derzeit unpraktisch ist, wissen Sie zumindest jetzt, dass es problematisch ist und Sie die Dinge beim nächsten Mal anders angehen können.
Ich nutze das kaufmännische Und in meinem Sass intensiv, kombiniert mit BEM macht es es viel einfacher, die Spezifität auf ein Minimum zu reduzieren, und für mich zumindest macht es die Lesbarkeit besser, da Kinder verschachtelt erscheinen. Ich neige dazu, die Quellreihenfolge für Überschreibungen mehr zu nutzen. Natürlich ist das nicht immer für alle Fälle möglich, aber ich denke, es ist im Allgemeinen ein gutes Ziel.
Wie Harry Roberts auch erwähnte, sollte die Spezifität in einem Stylesheet allmählich zunehmen. Dies wiederum erleichtert auch die Verwaltung der Spezifität, insbesondere bei langfristigen Projekten, erheblich.
Schön, wusste nicht, dass das überhaupt möglich ist oo. Obwohl man andere Selektoren mit dem kaufmännischen Und kombinieren könnte.
Der Kompromiss bei der
&-class-Methode ist, dass Sie die „Finden und Ersetzen“-Funktionalität Ihrer IDE verlieren. Wenn also jemand, der neu im Team ist oder diesen Teil Ihres Quellcodes noch nicht bearbeitet hat, versucht, ein bestimmtes Modul mit.element-sub-sub-namezu debuggen, und „Finden und Ersetzen“ 0 Ergebnisse liefert, ist es am besten, eine Source Map bereitzustellen, die hilft, diese Instanzen zu verfolgen und zu debuggen.Das ist ein valider Punkt. Ich denke jedoch, wenn Ihr Code sehr modular ist und jedes Modul in separate, entsprechend benannte Dateien aufgeteilt ist und Sie BEM nicht tiefer als 3 Ebenen verschachteln. Dann denke ich, sollte es nicht so schwer sein, zu finden, wonach gesucht wird.
Ich neige dazu, jeden Block so zu kommentieren:
Auf diese Weise können Sie das Projekt einfach mit #BLOCK-NAME durchsuchen, um diese Datei zu finden, und in den meisten Fällen können Sie die Nachkommen schnell sehen. Wenn das Modul viel Komplexität aufweist, können Sie immer eine Beschreibung hinzufügen.
Dies könnte als Over-Engineering betrachtet werden, und es ist immer noch etwas, mit dem ich experimentiere, aber bisher hat es mir gut gedient, aber ich bin immer offen für andere Vorschläge.
Noch ein toller Artikel, Chris. Danke. Ich mag besonders das Sass-Namespacing, das hatte ich noch nicht gesehen und werde es jetzt ausprobieren.
Ich wäre besorgt, serverseitige Logik zu sehen, die die Klassenliste für das HTML erstellt, da dies den Frontend- und Servercode enger koppelt. Es scheint die Trennung der Zuständigkeiten zu verletzen, da die Serverlogik Auswirkungen auf Stil und Darstellung hat.
Dennoch kann ich voll und ganz verstehen, warum es der Weg des geringsten Widerstands in einem bestehenden Projekt sein könnte, wo die anderen von Ihnen aufgeführten Optionen aus irgendeinem Grund nicht funktionieren.
Eine weitere nützliche Sache zu beachten ist, dass Sie die Spezifität erhöhen können, ohne zusätzliche Klassen hinzuzufügen oder Selektoren zu qualifizieren (Was, wenn sich das Element ändern würde??
Wir können einfach dieselbe Klasse verketteten.
so
kann so ausgewählt werden
und es hätte in diesem Fall das Gewicht des Selektors von 3 Klassen.
Ich würde dies in den meisten Fällen versuchen zu vermeiden, aber es gibt Fälle, in denen es eine sinnvolle Lösung ist.
Entschuldigen Sie Chris, das haben Sie bereits im Originalbeitrag erwähnt. Trotzdem ist es nett :)
Das ist eine sehr interessante Technik. Ich bin mir nicht ganz sicher, welche Fälle Sie dazu zwingen würden – haben Sie Szenarien erlebt, die dies erforderten?
Nicht so oft, aber wenn Sie eine Art Spezifitätskonflikt mit diesem Klassennamen haben, können Sie ihm einfach einen kleinen Spezifitäts-Boost geben, ohne eine zusätzliche Klasse zum Markup hinzuzufügen oder ihn an ein bestimmtes Element zu binden.
Toller Artikel, ich habe das .selector.selector-Ding noch nie gesehen, um die Spezifität leicht zu erhöhen.
Ich mag die Idee von
Ich benutze neuerdings doppelte Schrägstriche für Klassen, die verwendet werden, um bestehende Klassen zu modifizieren, mit der bestehenden Klasse vor den doppelten Schrägstrichen. Zum Beispiel
Dies hält es ziemlich klar, auf welche Klassen sich Ihre modifizierenden Klassen beziehen, wenn sie im Stylesheet getrennt werden, und hält die Spezifität schön niedrig.
Wie immer großartige Ideen, Chris!
Ein kleiner Nebenschauplatz, aber in Bezug auf die Quellreihenfolge verstehe ich nicht, warum es schwierig ist, die tatsächliche verarbeitete Reihenfolge der Stylesheets von einem Browser wie Google Chrome zu ermitteln. Offensichtlich kann man sich den Quellcode direkt ansehen, aber oft gibt es bei größeren Projekten ein Durcheinander von einzelnen Blättern.
Die einzige Möglichkeit, die ich gesehen habe, um eine einfache Liste zu erhalten, ist mit einem Snippet, das in der Konsole ausgeführt wird:
Danke Chris. Wie immer ein toller Artikel :)
Diese Seite – http://cssstats.com/ – erstellt unter anderem eine schöne Grafik über die Spezifität Ihres Codes.
Das ist ein schickes Werkzeug. Danke für den Hinweis!
Es ist hässlich, aber die Verwendung von Attributselektoren anstelle von Klassennamen oder IDs senkt ebenfalls die Spezifität.
Korrektur: Attributselektoren und Klassenselektoren haben die gleiche Spezifität (010). Der Trick, den Sie erwähnen, gilt nur für die Auswahl mit einer ID.
Hervorragender Artikel, Chris!
Ich frage mich, wie viele Leute diese Ansätze wirklich nützlich finden könnten.
Und danke für die Erwähnung, das bedeutet viel ;)
CSS-Frameworks können (und das ist vielleicht eher der Nutzung als den Frameworks selbst zuzuschreiben) übermäßig paranoid im Kaskadenteil von CSS sein. „Spezifität ist zu schwer zu verwalten, also werfen wir alles weg und verwenden eine einzige Klasse und betten die DOM in unseren Klassennamen ein.“ Mit SASS (und Less) kann Ihr Quellcode dank
&extendrelativ DRY sein, und Kompression wird die meisten zusätzlichen Bytes verteilen.Das Problem, das ich habe, ist, dass wir oft nicht genug von dem Problem betrachten.
Ein Teil des Problems ist, dass wir zu viele Eigenschaften in denselben Selektor kombinieren. Nehmen wir das Beispiel
.module > h2. Es ist völlig vertretbar, Dinge wie Padding und Margin darauf zu setzen, da dies die Verantwortung des Moduls sein wird..module-h2oder etwas Ähnliches zu haben, hilft nicht unbedingt viel, in diesem Fall.Wenn Sie Dinge wie Farben und Schriftarten *auch* setzen, tun Sie wahrscheinlich zu viel in diesem Selektor, und eigentlich wollen Sie
.default-story-headingoder etwas Ähnliches und dann.unique-story-heading. Das Setzen von Padding und Margin in diesen Klassen wäre wahrscheinlich unangemessen, es sei denn, Sie beabsichtigen, dass es nur in einem Modul verwendet wird, in dem Fall ist.module > .unique*richtig*, da es verhindert, dass jemand es versehentlich an einem Ort verwendet, den Sie nicht beabsichtigt haben. Oder wenn Sie beabsichtigen, es an mehreren Orten zu verwenden, aber wenn es in einem Modul ist, seine Positionierung (oder was auch immer) auch zu ändern, dann ist ein doppelter Selektor (.uniqueund.module > .unique) angemessen, nur die gemeinsamen Dinge (Farbe, Schriftart, was auch immer) in die erste und die spezifischen Dinge (Padding, Margin) in die zweite legen.Wir verwenden auch zu häufig Kurzschreib-Eigenschaften. Es ist *selten*, dass Sie das linke Padding setzen, ohne sich auch um das obere Padding zu kümmern, aber ich kann nicht zählen, wie oft ich entdeckt habe, dass jemand
background: redverwendet hat und das PNG, das ich zeigen wollte, weggewischt hat, sodass ich es jetzt umgehen muss.Also ja, wir müssen die Spezifität berücksichtigen und sie nur erhöhen, wenn nötig. Wir müssen auch die Eigenschaften in mehrere Selektoren mit der entsprechenden Spezifität aufteilen. Wir müssen auch vorsichtig sein, nur die Eigenschaften zu setzen, die wir setzen wollen, und nichts anderes.
Falsch.
@Adam – genau richtig. +1
Einige solide Tipps, danke für die Zusammenstellung.
@at-root ist ein weiteres Werkzeug, das Sie verwenden können, um eine verschachtelte Regel zurück an den Stamm Ihrer Selektoren zu ziehen. Dies hält die Spezifität niedrig, während es die visuellen Vorteile der verschachtelten Hierarchie in Ihrer Sass-Datei bietet.
.nested { @at-root { .nested-override { … } } } kompiliert zu
.nested {} UND
.nested-override { … }
Beispiel für
Das ist zu spezifisch
Das ist besser
Oh, entschuldigen Sie. Bitte entfernen/ignorieren Sie die Zeile
nav ul li a:hover {}.Dann, um die Anker zu färben, tun Sie nicht das
aber
Es ist nicht besser. Zum Beispiel, wenn ich die Art von Liste verwenden möchte, die in nav ul {} definiert ist, wieder außerhalb von nav ul {}, müsste ich diesen Code kopieren und einfügen oder einen weiteren Selektor nach dem Komma hinzufügen. Das erzeugt doppeltes CSS oder ist zu gekoppelt.
Es ist nur ein Beispiel für einfache Navigationsmarkup. Es hängt von Ihren Bedürfnissen ab. Sie können jeder Liste, die Sie haben, spezifischere Klassen geben.
Hinweis: Ich weiß nicht, ob
<nav>s, die mehrere direkte Kindelemente des Listenelements enthalten, gültig sind oder nicht.Sehr hilfreiche Ratschläge! Wie es der Zufall will, mache ich gerade eine Übung bei der Arbeit, um das Gewicht unserer Stylesheets zu reduzieren, und ich lasse viele der Selektoren fallen, die in den aktuellen Blättern sind.
Ich habe überhaupt keinen Zugriff, um das HTML zu ändern, also muss ich das verwenden, was bereits da ist. Das bedeutet, dass ich manchmal IDs oder 2 Klassen plus den Elementselektor verwenden muss, aber wo immer möglich, versuche ich, es mit nur einer Klasse zu machen. Ich schaue mir auch an, wo das Element auf der Seite erscheint und ordne den Code basierend auf dem HTML-Dokument neu an. Auf diese Weise weiß ich, dass ich einen allgemeineren Selektor weiter oben im Dokument verwenden kann und die spezifischeren für die Fälle aufhebe, in denen sie tatsächlich benötigt werden.
Es ist eigentlich eine unterhaltsame Übung; das CSS einer großen Website (stellen Sie sich E-Commerce auf Unternehmensebene vor) neu zu schreiben, um die Spezifität und/oder Dateigröße zu reduzieren. Es hat mich dazu gebracht, SASS oder LESS lernen zu wollen, und es hat mir gezeigt, wie ich sparsam mit dem umgehen kann, was ich schreibe. Früher war ich bei kleineren Websites etwas komfortabler, einen bestimmten Selektor zu verwenden, aber jetzt denke ich: „Welche Probleme kann dieser später verursachen?“
Sehr nützliche Informationen, danke für das Teilen.
Ich habe kürzlich über Spezifitätsgraphen geschrieben: http://josephrex.me/specificity-wars/. Es wird wirklich zu einem Krieg, besonders auf Plattformen wie WordPress, wenn ein Plugin mit Theme-Stilregeln kollidiert. Mein gerade abgeschlossenes Blogdesign hat hier einen moderat guten Graphen: https://gist.github.com/bl4ckdu5t/9bda2e463d96f75d7932
Das ist ein zum Nachdenken anregender Blog, Chris, obwohl er mich über folgende Zwickmühle wundern lässt, in der ich mich befinde:
Persönlich habe ich viele verschachtelte Beziehungen in meinem CSS verwendet. Der Grund war, dass ich davon absehen würde, die „Präsentationsschicht“ des HTML zu modifizieren, auf die gleiche Weise, wie wir uns von der Verwendung von JavaScript als solcher abgewandt haben.
Die eine große Frage, die sich aus diesem Blog ergeben würde, wäre: Verursacht die Verwendung von allgemeineren Klassen in Ihrem Dokument nicht ein erhebliches Übergewicht an Seitenlast durch das Klassennamensystem sowohl im HTML als auch im CSS, z. B.
in einer Weise, dass die Verwendung von verschachtelten CSS-Beziehungen zu insgesamt weniger Code führt? Z. B.
-oder sogar-
Es hat mich viel darüber nachdenken lassen, wie wir unseren Code immer noch erweiterbar machen können, aber auch wie das mit Vereinfachung und Leistungsüberlegungen zusammenhängt, und ich frage mich einfach, was Ihre Gedanken zu dieser Art von Unterschied wären?
Ich verweise Sie auf die Modulregeln von SMACSS: https://smacss.com/book/type-module
Zur Information, es scheint ein Problem mit einem Ihrer Beispiele zu geben. Im Abschnitt „The single-class wrapper“ sieht es so aus, als ob ein Teil des HTML als … bestehender Kram … gerendert wurde, anstatt den Code anzuzeigen.
Toller Artikel, Chris! Ich kannte die Namensraum-Funktion von Sass nicht und hatte auch nie über den Trick nachgedacht, denselben Klassennamen im Selektor zu duplizieren. Gerissen. :-)
Wir haben gute Ergebnisse erzielt, indem wir ein CSS-Namensschema verwendet haben, das der hierarchischen Natur von HTML folgt und das CSS/HTML in die implementierten Komponenten, Unterkomponenten usw. aufteilt.
Alles, was eine Aimeos Webshop-Komponente ist, wird von der CSS-Klasse „.aimeos“ abgedeckt, die einzelnen Komponenten werden nach den Codeteilen benannt („.catalog-filter“) und Unterkomponenten sind spezifischer („.catalog-filter-tree“).
Das vollständige CSS finden Sie unter https://github.com/aimeos/arcavias-core/blob/master/client/html/themes/elegance/aimeos.css
Das Einzige, was Probleme bereitet, ist, wenn Ihre CSS-Klassen zu unspezifisch sind, wie z. B. „.container“, „.name“ usw. Wahrscheinlich werden sie auch woanders definiert sein.
Hallo Chris, ich glaube, du hast einen Tippfehler in „Nesting in Preprozessoren wird manchmal abgeraten, weil es so einfach ist, übermäßig selektive Selektoren zu schreiben“ – meinst du „Nesting in Preprozessoren wird manchmal abgeraten, weil es so einfach ist, übermäßig [spezifische] Selektoren zu schreiben“?
+1 für die Verwendung des Ampersands, es funktioniert hervorragend mit der BEM-Notation.
Sehr informativer Artikel Chris, hat mir das Konzept der Opt-in-Typografie gefallen…
Toller Artikel! Eine weitere interessante Möglichkeit, Ihr CSS zu entwickeln, ist das Attributmodul CSS. Sie können es hier ansehen: http://amcss.github.io/
Entschuldigung, aber ich stimme bestimmten Punkten nicht zu. Ich bevorzuge es, wenn mein HTML sauber ist und ich bei Bedarf Klassen hinzufüge, ansonsten lasse ich die CSS die Arbeit machen. Das folgende Beispiel ist meiner Meinung nach korrekt.
.module > h2 {
/* normale Stile */
}
.module .unique {
/* so sollte CSS kaskadieren */
}
Ich stimme zu. Ich schreibe mein HTML, ohne über das Design nachzudenken. DANN benutze ich CSS, um es zu gestalten. Sie können immer noch eine solide CSS-Code-Struktur haben, ohne alles mit Klassen zu versehen.
Tolle Sachen Chris!
Hmm, macht das Präprozessoren und Nesting dann nicht etwas überflüssig?
Das andere Problem mit dem von Ihnen gegebenen Beispiel
.module > h2ist, dass es das CSS eng an den Fluss des HTML koppelt. Warum ist das schlecht?Sagen wir, Sie wollten ein neues Element zwischen
.moduleundh2einführen,Jetzt ist absolut alles, was ich eingefügt habe,
jetzt verschwunden, bis Sie den Selektor neu schreiben. Wir haben das früher in meiner Firma getan und gedacht, wir wären cool und würden mit unseren schicken neuen HTML5-Selektoren „semantisches“ HTML und CSS schreiben, aber wir stießen schnell auf dieses Problem.
Ich habe den Artikel wirklich genossen. Ich bemühe mich sehr, mich selbst an einen nicht-spezifischen Stil beim Schreiben von CSS zu halten, aber leider wird es kompliziert, wenn externer Anbietercode ins Spiel kommt ~ und dann wird es oft zu spezifisch.