The CSS Podcast – 003: Spezifität
Angenommen, Sie arbeiten mit dem folgenden HTML- und CSS-Code:
<button class="branding">Hello, Specificity!</button>
.branding {
color: blue;
}
button {
color: red;
}
Hier sind zwei Regeln zu sehen, die auf dasselbe Element ausgerichtet sind. Jede Regel enthält eine Deklaration, mit der die Farbe der Schaltfläche festgelegt werden soll: Die eine versucht, die Schaltfläche rot zu färben, die andere blau. Welche Deklaration wird auf das Element angewendet?
Der CSS-Spezifizitätsalgorithmus ist der Schlüssel zum Verständnis, wie CSS zwischen konkurrierenden Deklarationen entscheidet.
Spezifität ist eine der verschiedenen Stufen der Kaskade, die im letzten Modul zur Kaskade behandelt wurde.
Bewertung der Spezifität
Jede Auswahlregel innerhalb eines Ursprungs erhält eine Bewertung. Sie können Spezifität als Gesamtpunktzahl betrachten, für die jeder Auswahltyp Punkte erhält. Deklarationen aus Regeln mit der höchsten Spezifität werden berücksichtigt.
Bei einem konkreten Projekt besteht die Herausforderung darin, dafür zu sorgen, dass die CSS-Regeln, die Sie anwenden möchten, tatsächlich angewendet werden, und gleichzeitig die Bewertungen niedrig zu halten, um Komplexität zu vermeiden. Die Spezifität sollte nur so hoch sein, wie es erforderlich ist, anstatt auf die bestmögliche Spezifität zu zielen. Möglicherweise müssen in Zukunft einige wirklich wichtigere CSS-Regeln angewendet werden. Wenn Sie die höchste Spezifität anstreben, erschweren Sie sich diese Aufgabe.
Die Spezifität ist keine Dezimalzahl, sondern eine Triade, die aus drei Komponenten besteht: A
, B
und C
.
A
: ID-ähnliche SpezifitätB
: klassenähnliche SpezifitätC
: elementähnliche Spezifität
Sie wird oft mit der (A,B,C)
-Notation dargestellt. Beispiel: (1,0,2)
Die alternative A-B-C
-Notation wird ebenfalls häufig verwendet.
Besonderheiten vergleichen
Spezifitäten werden durch Vergleich der drei Komponenten in der Reihenfolge verglichen: Die Spezifität mit dem größeren A-Wert ist spezifischer. Wenn die beiden A-Werte gleich sind, ist die Spezifität mit dem größeren B-Wert spezifischer. Wenn auch die beiden B-Werte gleich sind, ist die Spezifität mit dem größeren C-Wert spezifischer. Wenn alle Werte gleich sind, sind die beiden Spezifitäten gleich.
Beispielsweise gilt (1,0,0)
als spezifischer als (0,4,3)
, da der A
-Wert in (1,0,0)
(1
) größer ist als der A
-Wert in (0,4,3)
(0
).
Selektoren beeinflussen die Spezifität
Jeder Teil der Spezifitätstriade beginnt mit dem Wert 0
. Die Standardspezifizität ist also (0,0,0)
.
Jeder Teil eines Selektors erhöht die Spezifität, was je nach Typ des Selektors den Wert von A
, B
oder C
erhöht.
Universalauswahl
Ein universeller Selector (*
) erhöht die Spezifität nicht und belässt den Wert bei der ursprünglichen Spezifität von (0,0,0)
.
* {
color: red;
}
Element- oder Pseudoelement-Selektor
Ein Element (Typ) oder Pseudoelement-Selektor fügt eine elementähnliche Spezifität hinzu, wodurch die C
-Komponente um 1
erhöht wird.
Die folgenden Beispiele haben eine Gesamtspezifität von (0,0,1)
.
Typauswahl
div {
color: red;
}
Pseudo-Element-Selektor
::selection {
color: red;
}
Klassen-, Pseudoklassen- oder Attributselektor
Mit einer Klasse, einem Pseudo-Klassen- oder einem Attribut-Sellektor wird eine klasseähnliche Spezifität hinzugefügt, wodurch die B
-Komponente um 1
erhöht wird.
Die folgenden Beispiele haben eine Spezifität von (0,1,0)
.
Klassenauswahl
.my-class {
color: red;
}
Pseudo-Klassenauswahl
:hover {
color: red;
}
Attributauswahl
[href='#'] {
color: red;
}
ID-Auswahl
Ein ID-Selektor fügt eine ID-ähnliche Spezifität hinzu, wodurch die C
-Komponente um 1 erhöht wird. Voraussetzung ist, dass Sie einen ID-Selektor (#myID
) und keinen Attributselektor ([id="myID"]
) verwenden.
Im folgenden Beispiel ist die Spezifität (1,0,0)
.
#myID {
color: red;
}
Andere Auswahlmöglichkeiten
CSS hat viele Selektoren. Nicht alle sind ausschlaggebend.
Die Pseudoklasse :not()
trägt beispielsweise nicht zur Berechnung der Spezifität bei.
Die als Argumente übergebenen Auswahlkriterien werden jedoch in die Berechnung der Spezifität einbezogen.
div:not(.my-class) {
color: red;
}
Dieses Beispiel hat eine Spezifität von (0,1,1), da es einen Typauswahl- (div
) und eine Klasse innerhalb des :not()
hat.
Wissen testen
Ihr Wissen über die Bewertung der Spezifität testen
Was ist die Spezifität von a[href="#"]
?
(0,0,1)
a
hat den Wert (0,0,1)
, das [href="#"]
hingegen den Wert (0,1,0)
.(0,1,0)
a
hat den Wert (0,0,1)
, das [href="#"]
hingegen den Wert (0,1,0)
.(0,1,1)
a
ist (0,0,1)
und der Wert von [href="#"]
ist (0,1,1)
. Die Gesamtspezifität beträgt also (0,1,1)
.Faktoren, die sich nicht auf die Spezifität auswirken
Es gibt einige häufige Missverständnisse zu den folgenden Faktoren, die sich auf die Spezifität auswirken.
Inline-Stilattribute
CSS, das direkt auf das style
-Attribut eines Elements angewendet wird, hat keine Auswirkungen auf die Spezifität, da es sich um einen anderen Schritt in der Kaskade handelt, der vor der Spezifität ausgewertet wird.
<div style="color: red"></div>
Wenn Sie diese Deklaration in einem Stylesheet überschreiben möchten, müssen Sie dafür sorgen, dass die Deklaration in einem früheren Schritt der Kaskade übereinstimmt.
Sie können ihm beispielsweise !important
hinzufügen, damit es Teil des !important
-Ursprungs mit Autorisierung wird.
!important
Erklärungen
Ein !important
am Ende einer CSS-Deklaration wirkt sich nicht auf die Spezifität aus, sondern ordnet die Deklaration einem anderen Ursprung zu, nämlich Autorisierte !important
.
Im folgenden Beispiel ist die Spezifität von .my-class
für den Sieg der !important
-Deklaration nicht relevant.
.my-class {
color: red !important;
color: white;
}
Wenn zwei Deklarationen !important
sind, kommt die Spezifität wieder ins Spiel, da der Ursprungsschritt der Kaskade den Gewinner noch nicht ermitteln konnte.
.branding {
color: blue !important;
}
button {
color: red !important;
}
Spezifität im Kontext
Bei komplexen oder zusammengesetzten Auswählen wird die Spezifität durch jeden Teil der Auswahl bestimmt. Betrachten Sie dieses Beispiel für HTML:
<a class="my-class another-class" href="#">A link</a>
Dieser Link enthält zwei Klassen.
Die Regel im folgenden CSS hat eine Spezifizität von (0,0,1)
:
a {
color: red;
}
Wenn Sie in der Auswahl auf eine der Klassen verweisen, hat sie jetzt eine Spezifizität von (0,1,1)
:
a.my-class {
color: green;
}
Fügen Sie der Auswahl die andere Klasse hinzu. Sie hat jetzt eine Spezifizität von (0,2,1)
:
a.my-class.another-class {
color: rebeccapurple;
}
Fügen Sie dem Selektor das Attribut href
hinzu. Es hat jetzt eine Spezifizität von (0,3,1)
:
a.my-class.another-class[href] {
color: goldenrod;
}
Fügen Sie abschließend die Pseudoklasse :hover
hinzu. Der Selektor hat dann eine Spezifizität von (0,4,1)
:
a.my-class.another-class[href]:hover {
color: lightgrey;
}
Wissen testen
Ihr Wissen über die Bewertung der Spezifität testen
Welche der folgenden Auswahlschaltflächen hat eine Spezifität von (0,2,1)
?
article > section
(0,0,2)
entspricht.article.card.dark
(0,2,1)
.article:hover a[href]
(0,0,1)
), einen Attributselektor ((0,0,1)
) und einen Klassenselektor ((0,0,1)
). Die Gesamtspezifität dieses Selektors beträgt also (0,2,2)
.Pragmatischer werden
Angenommen, Sie haben folgendes CSS:
.my-button {
background: blue;
}
button[onclick] {
background: grey;
}
In HTML sieht das so aus:
<button class="my-button" onclick="alert('hello')">Click me</button>
Die Schaltfläche hat einen grauen Hintergrund, da der zweite Selektor eine Spezifität von (0,1,1)
hat.
Das liegt daran, dass es einen Typselektor (button
) hat, nämlich (0,0,1)
, und einen Attributselektor ([onclick]
), nämlich (0,1,0)
.
Die vorherige Regel .my-button
entspricht (0,1,0)
, da sie eine Klassenauswahl hat, was eine geringere Spezifität als (0,1,1)
bedeutet.
Wenn Sie diese Regel verstärken möchten, können Sie die Klassenauswahl so wiederholen:
.my-button.my-button {
background: blue;
}
button[onclick] {
background: grey;
}
Jetzt hat die Schaltfläche einen blauen Hintergrund, da der neue Auswahlmechanismus eine Spezifität erhält.(0,2,0)
Bei gleicher Spezifität wird der nächste Schritt in der Kaskade ausgeführt.
Bleiben wir vorerst beim Beispiel mit der Schaltfläche und ändern das CSS in Folgendes:
.my-button {
background: blue;
}
[onclick] {
background: grey;
}
Die Schaltfläche hat einen grauen Hintergrund, da beide Selektoren dieselbe Spezifität von (0,1,0)
haben.
Wenn Sie die Regeln in der Quellreihenfolge ändern, wird die Schaltfläche blau.
[onclick] {
background: grey;
}
.my-button {
background: blue;
}
Das liegt daran, dass beide Auswahlmöglichkeiten dieselbe Spezifität haben. In diesem Fall greift die Kaskade auf den Schritt „Reihenfolge der Erscheinung“ zurück.