Die Kaskade ist ein so wesentlicher Bestandteil von CSS, dass sie direkt im Namen steckt. Wenn Sie jemals !important verwenden mussten, um die Spezifität in der Kaskade zu beeinflussen, wissen Sie, dass dies eine knifflige Sache sein kann. In den frühen Tagen von CSS war es üblich, hochspezifische Selektoren wie diesen zu sehen
#sidebar ul li {}
Wir sind heutzutage viel besser darin, Spezifität zu verwalten. Es ist eine allgemein anerkannte Best Practice, die Spezifität niedrig und flach zu halten – ID-Selektoren zu meiden, Klassen großzügig zu verwenden und unnötige Verschachtelungen zu vermeiden. Aber es gibt immer noch viele Situationen, in denen ein spezifischerer Selektor nützlich sein wird. Mit der Einführung einer neu vorgeschlagenen Pseudoklasse, mehr Unterstützung für Shadow DOM und der Verwendung der all-Eigenschaft können wir bald Vererbung und Spezifität auf neue und aufregende Weise handhaben.
Die :is() Pseudoklasse
Lea Verou hat kürzlich diese neue Pseudoklasse vorgeschlagen, die speziell zur Steuerung der Spezifität entwickelt wurde. Sie hat bereits ihren Weg in die CSS Level 4 Selectors spec gefunden. Lea hat eine Aufzeichnung darüber, warum sie nützlich ist, und es gibt einige Berichte darüber im CSS-Tricks-Almanach.
Nehmen wir :not als Beispiel. Die Spezifität von :not ist gleich der Spezifität seines Arguments. Dies macht die Verwendung von :not ziemlich mühsam. Betrachten Sie das folgende Beispiel
Wir könnten erwarten, dass die Klasse .red eine höhere Spezifität hat, da sie niedriger in der Kaskade liegt. Damit jedoch Stile div:not(.foobar) überschreiben können, müssten sie mindestens die Spezifität eines kombinierten Elementselektors (div) und Klassenselektors (.foobar) erreichen. Ein anderer Ansatz wäre div.red, aber es gibt einen besseren Weg. Hier kann :is helfen.
div:is(:not(.foobar)) {
background-color: black;
}
Der :not-Selektor fügt keine Spezifität mehr hinzu, sodass die Gesamtspezifität des obigen Selektors einfach die eines Elementselektors (div) ist. Die Klasse .red könnte sie nun in der Kaskade überschreiben. Sobald implementiert, werden Spezifitäts-Hacks der Vergangenheit angehören.
Shadow DOM
Heute verwenden viele Leute Klassen in HTML wie folgt
<form class="site-search site-search--full">
<input type="text" class="site-search__field">
<button type="Submit" class="site-search__button">search</button>
</form>
Bei der Verwendung von Shadow DOM können wir anstelle einer wortreichen Namenskonvention Klassen sogar ganz weglassen. Innerhalb des Shadow DOM definierte Stile sind so begrenzt, dass sie nur innerhalb der Komponente angewendet werden. Das Styling kann mit einfachen Elementselektoren erreicht werden, ohne sich Sorgen machen zu müssen, ob die Selektoren Elemente an anderer Stelle auf der Seite beeinträchtigen.
Es ist befreiend, so einfaches CSS zu schreiben. Kein Aufwand mehr für die Namensgebung. Shadow DOM scheint seinen Weg zur vollen Browserunterstützung zu finden. Es wird wahrscheinlich in die nächste Version von Firefox aufgenommen, während Edge die Implementierung als hohe Priorität hat.
Diese Browser-Supportdaten stammen von Caniuse, das weitere Details enthält. Eine Zahl gibt an, dass der Browser die Funktion ab dieser Version unterstützt.
Desktop
| Chrome | Firefox | IE | Edge | Safari |
|---|---|---|---|---|
| 53 | 63 | Nein | 79 | 10 |
Mobil / Tablet
| Android Chrome | Android Firefox | Android | iOS Safari |
|---|---|---|---|
| 127 | 127 | 127 | 11.0-11.2 |
Die all-Eigenschaft
Die all-Eigenschaft ist eine Möglichkeit, alle CSS-Eigenschaften auf einmal festzulegen – von align-content bis z-index. Welche Werte akzeptiert sie? Mir fällt kein Anwendungsfall ein, bei dem ich alle Eigenschaften auf inherit setzen möchte, aber das ist eine Option. Dann gibt es initial, was eher einem CSS-Reset ähnelt, bei dem alle Stile wegfallen. Keine Polsterung. Kein Rand. Der Anfangswert ist pro Eigenschaft festgelegt, unabhängig vom Element, auf das er angewendet wird. Der Anfangswert von display ist inline, selbst wenn Sie ihn auf ein Div anwenden. Die font-style eines em-Tags ist normal, ebenso die font-weight eines strong-Tags. Linktext wird schwarz sein. Sie verstehen, was gemeint ist. (Den Anfangswert jeder CSS-Eigenschaft finden Sie auf MDN.) Dies schränkt seine Nützlichkeit möglicherweise ein, da es weiter geht, als wir möchten, indem es alle Stile unabhängig vom Kontext entfernt.
Leider ist der nützlichste Wert für all auch der am wenigsten verbreitete: revert. Er kann die von Ihnen als Entwickler angewendeten Stile entfernen und gleichzeitig die Standard-Benutzeragenten-Stile beibehalten. Wir alle haben eine Seite mit HTML ohne Stylesheet gesehen – schwarzes Times New Roman auf weißem (transparentem) Hintergrund mit blauen unterstrichenen Links. Wenn Sie wirklich Vererbung vermeiden möchten, dann deckt all: revert Sie ab. Alle Divs werden display: block sein und Spans werden inline sein. Alle em-Tags werden kursiv und strong-Tags fett sein. Links werden blau und unterstrichen sein.
Diese Browser-Supportdaten stammen von Caniuse, das weitere Details enthält. Eine Zahl gibt an, dass der Browser die Funktion ab dieser Version unterstützt.
Desktop
| Chrome | Firefox | IE | Edge | Safari |
|---|---|---|---|---|
| 84 | 67 | Nein | 84 | 9.1 |
Mobil / Tablet
| Android Chrome | Android Firefox | Android | iOS Safari |
|---|---|---|---|
| 127 | 127 | 127 | 9.3 |
Die Zukunft?
CSS-in-JS ist ein Hilferuf. Wir bei @csswg sollten dem Beachtung schenken und die Probleme angehen, bevor es schlimmer wird.https://#/lWQ4ct61ir
— Lea Verou (@LeaVerou) 24. Mai 2017
Die Vielzahl rivalisierender, nicht standardisierter Methoden zum Schreiben von CSS-in-JS war ein Versuch, dieselben Probleme zu umgehen. Dieser Ansatz hat in den letzten Jahren an Popularität gewonnen. Einige seiner Befürworter haben Vererbung, Kaskade und Spezifität als grundlegend fehlerhafte Designentscheidungen der Sprache bezeichnet. Die CSS Working Group am W3C reagiert, indem sie die Leistungsfähigkeit von CSS und der nativen Webplattform verbessert. Es wird interessant sein, das Ergebnis zu sehen…
Mein Verständnis von Shadow DOM ist, dass der einzige Weg, einen Shadow Root zu erstellen, über Client-seitiges JavaScript erfolgt? Wenn Ihr JS also nicht geladen wird, haben Sie eine ungestylte Seite? Das scheint ein ziemlich großer Fehler zu sein, wenn dem so ist.
Das ist absolut richtig und ein sehr wichtiger Punkt. Vielleicht haben Sie einige Komponenten, die für ihre Funktionalität auf JavaScript angewiesen sind – ihre Existenzberechtigung hängt von JavaScript ab. Für diese Dinge ist Shadow DOM großartig. Sie würden sicherlich nicht jedes Element auf einer Seite mit Shadow DOM stylen – was ich vielleicht klarer hätte sagen sollen!
Eigentlich könnte dieser Fehler (JS-Abhängigkeit) in Zukunft behoben werden, da über die Erstellung eines neuen Tags,
shadowroot, diskutiert wird → https://github.com/whatwg/dom/issues/510Als jemand, der immer noch Dinge wie:
#sidebar ul li {}tut, gibt es eine empfohlene Ressource (oder eine Reihe von Ressourcen) über moderne CSS-Vererbung und Best Practices? Ich arbeite oft an kleinen Projekten, bei denen ich der einzige Entwickler bin, also mache ich, was für mich funktioniert, aber ich wollte schon lange lernen, „gutes“ CSS zu schreiben. Danke.Hallo Brad. Mein wichtigster Rat: Machen Sie sich keine Sorgen um Namenskonventionen wie BEM oder Dinge, die sich schick anhören wie OOCSS usw., egal wie beliebt sie auch scheinen mögen. Machen Sie sich auch keine Sorgen um Sass. Stellen Sie einfach sicher, dass Sie verstehen, wie Spezifität funktioniert. Diskussionen über „CSS-Architektur“ sind meistens Bikeshedding (und es gibt keinen klaren besten Weg), aber wenn Sie wirklich etwas lesen möchten
https://adamwathan.me/css-utility-classes-and-separation-of-concerns
https://www.smashingmagazine.com/2016/11/css-inheritance-cascade-global-scope-new-old-worst-best-friends/
http://nicolasgallagher.com/about-html-semantics-front-end-architecture/
https://csswizardry.com/2012/05/keep-your-css-selectors-short/
Hauptrat: Halten Sie die Spezifität so niedrig wie möglich, verwenden Sie viele Klassen, verwenden Sie keine IDs für CSS.
Dieses Beispiel könnte also sein
.sidebar li {} (was einfacher zu überschreiben ist, falls erforderlich, ohne !important)
Spezifität ist sehr wichtig, wenn Sie in einem Team arbeiten oder sich an der Arbeit eines anderen Teams beteiligen. Es ist entscheidend, dass Sie die Spezifität verstehen, und ich bin keiner, der die neuesten schicken Namenskonventionen aufgreift und verwendet. Wenn Sie sich jedoch mit ITCSS BEM (aka BEMIT) und CSS-Namespacing auseinandersetzen, wird dies die Art und Weise, wie Sie CSS schreiben, radikal zum Besseren verändern. Ich war sehr gegen BEM, als ich es entdeckte, jetzt bin ich komplett konvertiert, nachdem ich gesehen habe, wie viele Probleme die Spezifität uns in der Arbeit an großen Projekten mit unterschiedlichen Fähigkeitsstufen bereitet hat, die im Laufe der Zeit alle ihren Beitrag leisten. Kein System ist perfekt, ITCSS und BEM sicherlich nicht, aber sie sind viel besser als traditionelle Arbeitsweisen mit CSS.
Es wird eine Freude sein, CSS in großen Projekten zu verwenden. Folgen Sie Leuten wie Harry Roberts (CSSWIZARDRY). Oh, und Sie werden auf OOCSS stoßen, das ist Unsinn, das in der realen Welt nicht funktioniert, vergessen Sie es. OOCSS lehrt uns, knochentrocken zu sein, was viele Probleme nach sich zieht. Genug trocken zu sein ist gut genug….Wenden Sie gesunden Menschenverstand an.
:revert scheint derzeit nur von Safari unterstützt zu werden.
Das meiste davon erscheint mir ziemlich nützlich, abgesehen vom Shadow DOM, das für mein Coding die Dinge nur umständlicher macht. Abgesehen davon werde ich weiterhin intensiv IDs verwenden, wenn ich CSS für SVGs schreibe. Ich verwende die ID oft als eine Art Kommentar (da eine ID wie „leaf“ auf das einzige Blatt im SVG verweisen würde), die auch als Klasse dient. Der eigentliche Bonus bei der Verwendung einer ID in diesen Fällen ist, dass die ID im Gegensatz zu einem tatsächlichen Kommentar während der Minifizierung nicht entfernt wird und weniger Bytes verbraucht, da ID zwei Buchstaben und Klasse fünf Buchstaben lang sind.
Andererseits ist mein HTML tendenziell etwas komplexer, daher vermeide ich die Verwendung von IDs außer in seltenen Fällen, in denen sie absolut notwendig sind.
Es macht mir nichts aus, ein Hybrid aus Alt und Neu zu sein, solange ich weiß, dass ich alles Neue verstehe, wenn ich jemals einen plötzlichen Wechsel vornehmen muss.