CSS/Tutorials/Einstieg/Kaskade
Ein besonderes Merkmal von CSS ist die Kaskade, das C in CSS steht für cascading (englisch für kaskadierend). Ein Dokument kann nicht nur von einem einzelnen Stylesheet formatiert werden, sondern von einer Vielzahl von Stylesheets, die aus verschiedenen Quellen stammen können und aufeinander aufbauen.
Gleichzeitig entsteht aber das Problem, dass Eigenschaften für ein Element mehrfach und mit widersprüchlichen Werten festgelegt werden können. Dieses Problem wird umgangen, indem die Kaskade für Regeln und Eigenschaften eine Gewichtung oder Spezifität errechnet, anhand derer die tatsächlich für ein Element geltenden Formate bestimmt werden.
Inhaltsverzeichnis
Kriterien der Kaskade
Herkunft des Stylesheets
Ein Stylesheet kann aus drei Quellen stammen:
- Browser-Stylesheet: Browser besitzen vorgegebene Formatierungen für HTML-Dokumente. Dieses Stylesheet hat die niedrigste Priorität und bildet die Basis für jedes HTML Dokument.
- Benutzer-Stylesheet: Benutzer können in den Einstellungen ihres Browser bevorzugte Schriftarten oder Farbmischungen festlegen. Benutzer-Stylesheets haben mittlere Priorität und überschreiben widersprechende Eigenschaften im Browser-Stylesheet.
- Autoren-Stylesheet: Diese sind vom Dokument selbst eingebunden oder mit dem Dokument mitgeliefert.
Autoren-Stylesheets haben hohe Priorität und überschreiben Browser- und Benutzer-Stylesheets.
Reihenfolge von Regeln und Deklarationen
Wird eine Eigenschaft oder ein Regelsatz mehrfach deklariert, so wird die zuletzt deklarierte Eigenschaft verwendet.
h1 { color: red; }
h1 {
color: orange;
color: green;
}
In diesem Beispiel wird die color
-Eigenschaft drei mal innerhalb von zwei Regelsätzen deklariert. Der Wert orange
im zweiten Regelsatz überschreibt dabei den Wert red
aus dem ersten Regelsatz. orange
wird jedoch schon in der nächsten Zeile mit dem Wert green
überschrieben, da diese Deklaration als letztes notiert wurde.
Spezifität
In CSS werden Regelsätze nach ihrer Spezifität gewichtet. Allgemeine Regelsätze besitzen dabei eine geringere Gewichtung als spezifische Regelsätze.
Die Spezifität wird durch die Betrachtung der Bestandteile eines Selektors ermittelt. Für jeden Selektor werden drei Zähler (A, B und C) mit dem Startwert Null festgelegt. Jeder Bestandteil eines Selektors wirkt sich auf diese Zähler aus:
- Der Zähler A wird durch jedes Vorkommen eines ID-Selektors um eins erhöht.
- Der Zähler B wird durch jedes Vorkommen eines Attribut- oder Klassenselektors bzw. einer Pseudoklasse um eins erhöht.
- Der Zähler C wird durch jedes Vorkommen eines Typselektors oder eines Pseudoelements um eins erhöht.
- Der Universalselektor verhält sich neutral, er wird ignoriert.
- Die Pseudoklasse :not() selbst wird ignoriert, die Selektoren innerhalb der Klasse werden jedoch wie vorbeschrieben gewertet.
* /* A=0, B=0, C=0, Spezifität 0 0 0 */
h1 /* A=0, B=0, C=1, Spezifität 0 0 1 */
ul li /* A=0, B=0, C=2, Spezifität 0 0 2 */
a::after /* A=0, B=0, C=2, Spezifität 0 0 2 */
p:first-child /* A=0, B=1, C=1, Spezifität 0 1 1 */
a:not([href]) /* A=0, B=1, C=1, Spezifität 0 1 1 */
ul.nav [href] /* A=0, B=2, C=1, Spezifität 0 2 1 */
#author /* A=1, B=0, C=0, Spezifität 1 0 0 */
#editor p /* A=1, B=0, C=1, Spezifität 1 0 1 */
0 0 15
weniger spezifisch als 0 1 5
).Information
Spezifität des style
-Attributs
Werden Eigenschaften in einem style
-Attribut festgelegt, so ist diese Eigenschaft spezifischer als jeder Regelsatz in einem Stylesheet (Regeln innerhalb von style-Attributen können nur durch die Verwendung von !important
überschrieben werden). Die Errechnung der Spezifität erfolgt mit Hilfe eines vierten Zählers (hier A), der sich um eins erhöht, wenn ein style
-Attribut gesetzt wurde.
* /* A=0, B=0, C=0, D=0, Spezifität 0 0 0 0 */
h1 /* A=0, B=0, C=0, D=1, Spezifität 0 0 0 1 */
ul li /* A=0, B=0, C=0, D=2, Spezifität 0 0 0 2 */
a::after /* A=0, B=0, C=0, D=2, Spezifität 0 0 0 2 */
p:first-child /* A=0, B=0, C=1, D=1, Spezifität 0 0 1 1 */
a:not([href]) /* A=0, B=0, C=1, D=1, Spezifität 0 0 1 1 */
ul.nav [href] /* A=0, B=0, C=2, D=1, Spezifität 0 0 2 1 */
#author /* A=0, B=1, C=0, D=0, Spezifität 0 1 0 0 */
#editor p /* A=0, B=1, C=0, D=1, Spezifität 0 1 0 1 */
style="" /* A=1, B=0, C=0, D=0, Spezifität 1 0 0 0 */
!important
Wird eine Eigenschaft mehrfach deklariert, so gilt in der Regel der zuletzt festgelegte Wert. Da dies auch unabsichtlich geschehen kann, existiert die Möglichkeit, einen bestimmten Wert als wichtig zu kennzeichnen. In diesem Fall wird der Wert einer Eigenschaft nicht durch eine nachfolgende Deklaration mit identischer Gewichtung überschrieben.
Ein Wert wird als wichtig gekennzeichnet, indem nach dem Wert selbst optional ein Leerzeichen, ein Ausrufezeichen (!
) sowie das Schlüsselwort important
notiert werden.
h1 { color: green !important; }
h1.main { color: red; }
In diesem Beispiel wurde der Wert green
als wichtig gekennzeichnet. Aus diesem Grund zeigt die nachfolgende Deklaration, die aufgrund des Klassenselektors eigentlich eine höhere Spezifität hätte, keine Auswirkung. Das bedeutet, dass die Schriftfarbe grün dargestellt wird.
Wird eine shorthand-Eigenschaft als wichtig gekennzeichnet, so gilt die Kennzeichnung für alle Untereigenschaften der Kurzschreibweise.
border-left: medium double black !important;
/* ... ist identisch zu: */
border-left-width: medium !important;
border-left-style: double !important;
border-left-color: black !important;
Auch wenn Sie nur wenige !important einsetzen und damit die normale Reihenfolge von Regeln und Deklarationen aussetzen, erschweren Sie das Zurechtfinden im Stylesheet.
!important vermeiden
Bei einem neuen Projekt wird man in der Regel die Stylesheets so erstellen, dass auf die Verwendung von !important
verzichtet werden kann. Schwierig wird es meistens erst, wenn ein bestehendes Projekt überarbeitet werden muss. Dennoch gibt es auch für diesen Fall Tricks, die die Spezifität erhöhen, ohne auf !important
zurückgreifen zu müssen. So können Sie mehrfach dieselbe Klasse oder ID verwenden.
.class.class { /* … */ }
#id#id { /* … */ }
:not(#\#) { /* … */ }
Die Selektoren treffen zu auf:
- alle Elemente, die der Klasse
class
angehören, - das Element, das die ID
id
hat, - alle Elemente, die nicht die ID
#
haben.
Zukünftig wird @layer
weitreichendere Möglichkeiten der Organisation von Stylesheets bieten.
Ablauf der Kaskade
Der Ablauf der Kaskade besteht aus mehreren Schritten, in denen die einzelnen Kriterien angewandt werden und zur Aussortierung von Deklarationen führen.
Im ersten Schritt werden alle Deklarationen gesucht, die unter Berücksichtigung des aktuellen Ausgabemediums auf ein Element angewendet werden. Anschließend werden diese Deklarationen nach Herkunft und Wichtigkeit sortiert:
- Deklarationen im Browser-Stylesheet
- Deklarationen des Benutzers
- Deklarationen des Autors
-
animation
s -
!important
-Deklarationen des Autors -
!important
-Deklarationen des Benutzers -
!important
-Deklarationen im Browser-Stylesheet -
transition
s
Diese Sortierung soll sicherstellen, dass Autoren größtmöglichen Gestaltungspielraum haben, aber für den Benutzer wichtige Formate, z. B. die Mindestschriftgröße immer mit Vorrang behandelt werden. Die nun übrigen Regelsätze werden nach ihrer Spezifität geordnet. Regelsätze mit hoher Spezifität überschreiben die mit geringerer Spezifität. Sind am Ende noch widersprüchliche Deklarationen vorhanden, wird die Reihenfolge beachtet. Später deklarierte Eigenschaften überschreiben früher deklarierte.
Hinweise zur Präsentation außerhalb von CSS
In HTML existieren Elemente und Attribute, die die Formatierung von Dokumenten steuern können. Der Großteil davon gilt als missbilligt. Davon abgesehen gibt es vereinzelt Attribute, die nicht der Gestaltung dienen, aber dennoch eine Auswirkung auf die Darstellung besitzen, etwa cols
und rows
des textarea
-Elements.
CSS bezeichnet Formate, die über diese Attribute festgelegt werden, als Hinweise zur Präsentation. Obwohl sich diese Elemente und Attribute direkt im Dokument befinden, werden sie von CSS während der Kaskade am Anfang eines Autoren-Stylesheets eingeordnet. Sie besitzen keine Spezifität. Das bedeutet, dass vom Autor festgelegte Eigenschaften die Hinweise zur Präsentation immer überschreiben.
style
-Attribut zählt nicht zu den präsentationellen Hinweisen. Es besitzt seine eigene Spezifität.Auch andere Sprachen besitzen Hinweise zur Präsentation in ihrem Sprachumfang. CSS definiert, dass diese Formate in CSS-Deklarationen übersetzt werden sollen. Diese Deklarationen werden dann als Browser-Stylesheet oder am Anfang des Autoren-Stylesheets eingeordnet. Wie in HTML wird diesen Eigenschaften keine Spezifität zugeordnet.
Weblinks
- standardista.com: Visualisierung der Spezifität mithilfe von Plankton, Fischen und Haien (englisch)