CSS
Kaskadierung und Spezifität
Suche…
Bemerkungen
Durch die CSS-Spezifität soll der Code prägnanter gemacht werden, indem einem Autor ermöglicht wird, einige allgemeine Formatierungsregeln für eine große Anzahl von Elementen zu definieren und diese dann für eine bestimmte Teilmenge zu überschreiben.
Kaskadieren
Kaskadierung und Spezifität werden zusammen verwendet, um den endgültigen Wert einer CSS-Stileigenschaft zu bestimmen. Sie definieren auch die Mechanismen zum Lösen von Konflikten in CSS-Regelsätzen.
CSS-Ladereihenfolge
Stile werden aus folgenden Quellen in dieser Reihenfolge gelesen:
- User Agent-Stylesheet (die vom Browser-Anbieter bereitgestellten Stile)
- User Stylesheet (das zusätzliche Styling, das ein Benutzer in seinem Browser festgelegt hat)
- Autoren-Stylesheet (Autor bezeichnet hier den Ersteller der Webseite / Website)
- Möglicherweise eine oder mehrere
.css
Dateien - Im
<style>
-Element des HTML-Dokuments
- Möglicherweise eine oder mehrere
- Inline-Stile (im
style
Attribut eines HTML-Elements)
Der Browser sucht beim Rendern eines Elements nach den entsprechenden Stilen.
Wie werden Konflikte gelöst?
Wenn nur ein CSS-Regelsatz versucht, einen Stil für ein Element festzulegen, liegt kein Konflikt vor, und dieser Regelsatz wird verwendet.
Wenn mehrere Regelsätze mit widersprüchlichen Einstellungen gefunden werden, werden zuerst die Specificty-Regeln und dann die Cascading-Regeln verwendet, um den zu verwendenden Stil zu bestimmen.
Beispiel 1 - Spezifitätsregeln
.mystyle { color: blue; } /* specificity: 0, 0, 1, 0 */
div { color: red; } /* specificity: 0, 0, 0, 1 */
<div class="mystyle">Hello World</div>
Welche Farbe wird der Text haben? (schweben, um die Antwort zu sehen)
Blau
Zuerst werden die Spezifitätsregeln angewendet und diejenige mit der höchsten Spezifität "gewinnt".
Beispiel 2 - Kaskadenregeln mit identischen Selektoren
Externe CSS-Datei
.class {
background: #FFF;
}
Interne CSS (in HTML-Datei)
<style>
.class {
background: #000;
}
<style>
In diesem Fall setzt die Kaskade bei identischen Selektoren ein und stellt fest, dass der zuletzt geladene "gewinnt".
Beispiel 3 - Kaskadenregeln nach Spezifitätsregeln
body > .mystyle { background-color: blue; } /* specificity: 0, 0, 1, 1 */
.otherstyle > div { background-color: red; } /* specificity: 0, 0, 1, 1 */
<body class="otherstyle">
<div class="mystyle">Hello World</div>
</body>
Welche Farbe wird der Hintergrund haben?
rot
Nach dem Anwenden der Spezifitätsregeln gibt es immer noch einen Konflikt zwischen Blau und Rot, sodass die Kaskadenregeln zusätzlich zu den Spezifitätsregeln angewendet werden. Beim Kaskadieren wird die .css
der Regeln untersucht, unabhängig davon, ob sie sich in derselben .css
Datei oder in der Sammlung von Stilquellen befinden. Der zuletzt geladene überschreibt alle früheren. In diesem Fall "gewinnt" die Regel .otherstyle > div
.
Eine letzte Notiz
- Selektorspezifität hat immer Vorrang.
- Stylesheet-Bestellung unterbricht Krawatten.
- Inline-Stile übertreffen alles.
Die! Wichtige Erklärung
Die !important
Deklaration wird verwendet, um die übliche Spezifität in einem Stylesheet zu überschreiben, indem einer Regel eine höhere Priorität zugewiesen wird. Ihre Verwendung ist: property : value !important;
#mydiv {
font-weight: bold !important; /* This property won't be overridden
by the rule below */
}
#outerdiv #mydiv {
font-weight: normal; /* #mydiv font-weight won't be set to normal
even if it has a higher specificity because
of the !important declaration above */
}
Das Vermeiden der Verwendung von !important
wird dringend empfohlen (es sei denn, dies ist absolut erforderlich), da dies den natürlichen Fluss der CSS-Regeln stören würde, was zu Unsicherheit in Ihrem Stylesheet führen kann. Es ist auch wichtig zu beachten, dass, wenn mehrere !important
Deklarationen auf die gleiche Regel auf ein bestimmtes Element angewendet werden, diejenige mit der höheren Spezifität das ona ist.
Hier einige Beispiele, bei denen die Verwendung !important
Deklarationen gerechtfertigt ist:
- Wenn Ihre Regeln nicht durch einen Inline-Stil des Elements überschrieben werden sollen, der in das
style
Attribut des html-Elements geschrieben wird. - Um dem Benutzer mehr Kontrolle über die Webzugriffsmöglichkeiten zu geben, z. B. das Vergrößern oder Verkleinern der Schriftgröße, indem der Autorstil mit
!important
überschrieben wird. - Zum Testen und Debuggen mit inspect element.
Siehe auch:
Berechnung der Selektorspezifität
Jeder einzelne CSS-Selector hat seinen eigenen Spezifitätswert. Jeder Selektor in einer Sequenz erhöht die Gesamtspezifität der Sequenz. Selektoren fallen in eine von drei verschiedenen Spezifitätsgruppen: A , B und c . Wenn mehrere Auswahlsequenzen ein bestimmtes Element auswählen, verwendet der Browser die von der Sequenz verwendeten Stile mit der höchsten Gesamtspezifität.
Gruppe | Bestehend aus | Beispiele |
---|---|---|
EIN | ID-Selektoren | #foo |
B | Klassen-Selektoren Attributselektoren Pseudoklassen | .bar [title] , [colspan="2"] :hover :nth-child(2) |
c | Typenauswahl Pseudoelemente | div , li ::before , ::first-letter |
Gruppe A ist am spezifischsten, gefolgt von Gruppe B und schließlich Gruppe c .
Der Universalselektor ( *
) und die Kombinatoren (wie >
und ~
) sind nicht spezifisch.
Beispiel 1: Spezifität verschiedener Selektorsequenzen
#foo #baz {} /* a=2, b=0, c=0 */
#foo.bar {} /* a=1, b=1, c=0 */
#foo {} /* a=1, b=0, c=0 */
.bar:hover {} /* a=0, b=2, c=0 */
div.bar {} /* a=0, b=1, c=1 */
:hover {} /* a=0, b=1, c=0 */
[title] {} /* a=0, b=1, c=0 */
.bar {} /* a=0, b=1, c=0 */
div ul + li {} /* a=0, b=0, c=3 */
p::after {} /* a=0, b=0, c=2 */
*::before {} /* a=0, b=0, c=1 */
::before {} /* a=0, b=0, c=1 */
div {} /* a=0, b=0, c=1 */
* {} /* a=0, b=0, c=0 */
Beispiel 2: Wie wird die Spezifität vom Browser verwendet?
Stellen Sie sich die folgende CSS-Implementierung vor:
#foo {
color: blue;
}
.bar {
color: red;
background: black;
}
Hier haben wir einen ID-Selektor, der die color
als blau deklariert, und einen Klassenselektor, der die color
als Rot und den background
als Schwarz deklariert.
Ein Element mit der ID #foo
und der Klasse .bar
wird von beiden Deklarationen ausgewählt. ID-Selektoren haben eine Spezifität der Gruppe A und Klassenselektoren haben eine Spezifität der Gruppe B. Ein ID-Selektor überwiegt eine beliebige Anzahl von Klassenselektoren. Aus diesem Grund color:blue;
aus dem #foo
Selektor und dem background:black;
von der .bar
wird auf das Element angewendet. Die höhere Spezifität des ID - Selektor wird der Browser das ignorieren .bar
Wähler der color
Erklärung.
Stellen Sie sich jetzt eine andere CSS-Implementierung vor:
.bar {
color: red;
background: black;
}
.baz {
background: white;
}
Hier haben wir zwei Klassenselektoren; eine davon deklariert die color
als rot und den background
als schwarz und die andere den background
als weiß .
Ein Element mit den Klassen .bar
und .baz
wird von beiden Deklarationen betroffen sein. Das Problem, das wir jetzt haben, ist jedoch, dass sowohl .bar
als auch .baz
eine identische Spezifität für Gruppe B aufweisen . Die Kaskadierung von CSS löst dies für uns auf: .baz
nach .bar
definiert .bar
, endet unser Element mit der roten color
von .bar
, dem weißen background
von .baz
.
Beispiel 3: Manipulation der Spezifität
Der letzte Ausschnitt aus dem obigen Beispiel 2 kann manipuliert werden , um sicherzustellen , unsere .bar
Klassenauswahl der color
Erklärung statt , dass die verwendeten .baz
Klassenauswahl.
.bar {} /* a=0, b=1, c=0 */
.baz {} /* a=0, b=1, c=0 */
Die gebräuchlichste Methode, dies zu erreichen, besteht darin, herauszufinden, welche anderen Selektoren auf die .bar
Selektorsequenz angewendet werden können. Wenn beispielsweise die .bar
Klasse nur auf span
Elemente angewendet wurde, können Sie den .bar
Selektor in span.bar
. Dies würde zu einer neuen Gruppe C- Spezifität führen, die den Mangel der .baz
außer Kraft setzen würde:
span.bar {} /* a=0, b=1, c=1 */
.baz {} /* a=0, b=1, c=0 */
Es kann jedoch nicht immer möglich sein, einen anderen allgemeinen Selektor zu finden, der von jedem Element gemeinsam genutzt wird, das die .bar
Klasse verwendet. Aus diesem Grund ermöglicht CSS die Selektion von Selektoren, um die Spezifität zu erhöhen. Anstelle von .bar
können .bar.bar
stattdessen .bar.bar
verwenden (siehe Die Grammatik von Selectors, W3C-Empfehlung ). Dies wählt immer noch jedes Element mit der Klasse .bar
, hat aber jetzt die doppelte Spezifität der Gruppe B :
.bar.bar {} /* a=0, b=2, c=0 */
.baz {} /* a=0, b=1, c=0 */
!important
und Inline-Stildeklarationen
Die !important
- Flagge auf einer Stildeklaration und Stile von dem HTML erklärten style
- Attribut gilt als eine höhere Spezifität als jeder Wähler hat. Wenn diese vorhanden sind, überschreibt die Stildeklaration, auf die sie sich auswirkt, andere Deklarationen unabhängig von ihrer Spezifität. Das heißt, es sei denn, Sie haben mehr als eine Deklaration, die ein !important
Flag für dieselbe Eigenschaft enthält, das für dasselbe Element gilt. Für diese Eigenschaften gelten dann normale Spezifitätsregeln, die sich aufeinander beziehen.
Da sie die Spezifität vollständig außer Kraft setzen, wird die Verwendung von !important
in den meisten Anwendungsfällen missbilligt. Man sollte es so wenig wie möglich verwenden. CSS - Code effizient und wartbar auf lange Sicht zu halten, ist es fast immer besser , die Spezifität des umgebenden Wähler zu erhöhen , als zu verwenden , um !important
.
Eine der seltenen Ausnahmen, bei denen !important
ist, ist die Implementierung allgemeiner .hidden
wie einer .hidden
oder .background-yellow
Klasse, die eine oder mehrere Eigenschaften immer dort überschreiben soll, wo sie vorkommen. Und selbst dann müssen Sie wissen, was Sie tun. Das letzte, was Sie beim Schreiben von wartungsfähigem CSS wollen, ist, !important
Flaggen in Ihrem CSS zu haben.
Eine letzte Notiz
Ein häufiges Missverständnis bezüglich der CSS-Spezifität besteht darin, dass die Werte für Gruppe A , B und c miteinander kombiniert werden sollten ( a=1, b=5, c=1
=> 151). Dies ist nicht der Fall. Wenn dies der Fall wäre, reicht es aus, 20 Gruppen der Gruppe B oder c zu wählen, um jeweils eine Gruppe A oder B zu überschreiben. Die drei Gruppen sollten als individuelle Spezifitätsebenen betrachtet werden. Die Spezifität kann nicht durch einen einzelnen Wert dargestellt werden.
Beim Erstellen Ihres CSS-Stylesheets sollten Sie die geringstmögliche Spezifität beibehalten. Wenn Sie die Spezifität etwas höher machen müssen, um eine andere Methode zu überschreiben, erhöhen Sie sie, aber so niedrig wie möglich, um sie zu erhöhen. Sie sollten keinen Selektor wie diesen brauchen:
body.page header.container nav div#main-nav li a {}
Dies macht zukünftige Änderungen schwieriger und verschmutzt diese CSS-Seite.
Sie können die Spezifität Ihrer Wähler berechnen hier
Beispiel für komplexere Spezifität
div {
font-size: 7px;
border: 3px dotted pink;
background-color: yellow;
color: purple;
}
body.mystyle > div.myotherstyle {
font-size: 11px;
background-color: green;
}
#elmnt1 {
font-size: 24px;
border-color: red;
}
.mystyle .myotherstyle {
font-size: 16px;
background-color: black;
color: red;
}
<body class="mystyle">
<div id="elmnt1" class="myotherstyle">
Hello, world!
</div>
</body>
Welche Rahmen, Farben und Schriftgrößen wird der Text haben?
Schriftgröße:
font-size: 24;
Da der#elmnt1
die höchste Spezifität für das betreffende<div>
, wird hier jede Eigenschaft festgelegt.
Rand:
border: 3px dotted red;
. Die#elmnt1
red
wird aus dem#elmnt1
Regelsatz übernommen, da sie die höchste Spezifität aufweist. Die anderen Eigenschaften des Rahmens, der Randstärke und desdiv
stammen aus demdiv
Regelsatz.
Hintergrundfarbe:
background-color: green;
. Diebackground-color
wird in denbody.mystyle > div.myotherstyle
div
,body.mystyle > div.myotherstyle
und.mystyle .myotherstyle
. Die Besonderheiten sind (0, 0, 1) vs. (0, 2, 2) vs. (0, 2, 0), also "gewinnt" der mittlere.
Farbe:
color: red;
. Die Farbe wird in den.mystyle .myotherstyle
div
und.mystyle .myotherstyle
. Letzteres hat die höhere Spezifität von (0, 2, 0) und "gewinnt".