Der Wasserfall

The CSS Podcast – 004: The Cascade

CSS steht für Cascading Stylesheets. Die Kaskade ist der Algorithmus zum Beheben von Konflikten, bei denen mehrere CSS-Regeln auf ein HTML-Element angewendet werden. Aus diesem Grund ist der Text der Schaltfläche, die mit dem folgenden CSS formatiert wurde, blau.

button {
  color: red;
}

button {
  color: blue;
}

Wenn Sie den Kaskadenalgorithmus verstehen, können Sie nachvollziehen, wie der Browser solche Konflikte löst. Der Kaskadenalgorithmus ist in vier separate Phasen unterteilt.

  1. Position und Reihenfolge: die Reihenfolge, in der Ihre CSS-Regeln angezeigt werden
  2. Spezifität: Ein Algorithmus, der bestimmt, welcher CSS-Selektor die stärkste Übereinstimmung aufweist.
  3. Ursprung: Die Reihenfolge, in der CSS angezeigt wird, und die Quelle, z. B. ein Browserstil, CSS aus einer Browsererweiterung oder Ihr selbst geschriebenes CSS
  4. Wichtigkeit: Einige CSS-Regeln werden stärker gewichtet als andere, insbesondere beim Regeltyp !important.

Position und Reihenfolge der Darstellung

Die Reihenfolge und Darstellung Ihrer CSS-Regeln werden bei der Berechnung der Konfliktlösung berücksichtigt. Dies ist der letzte Schritt der Kaskade und führt immer zu einer einzigen Gewinnerklärung. Die Position wird jedoch nur berücksichtigt, wenn nach jedem anderen Schritt der Kaskade noch widersprüchliche Formatierungen vorhanden sind.

Die Demo ganz am Anfang dieser Lektion ist das einfachste Beispiel für die Position. Es gibt zwei Regeln für den Ursprung des Autors ohne Bedeutung. Beide sind nicht geschichtet und stammen aus Regeln mit Selektoren mit identischer Spezifität. Daher hat die zuletzt deklarierte Regel gewonnen.

Stile können aus verschiedenen Quellen auf einer HTML-Seite stammen, z. B. aus einem <link>-Tag, einem eingebetteten <style>-Tag, einer @import-Regel und Inline-CSS, das im style-Attribut eines Elements definiert ist.

Wenn Sie ein <link> mit CSS oben auf Ihrer HTML-Seite und ein weiteres <link> mit CSS unten auf Ihrer Seite haben, haben die Formatierungen im unteren <link> eine höhere Priorität. Das Gleiche passiert mit eingebetteten <style>-Elementen oder widersprüchlichen Deklarationen innerhalb eines einzelnen style-Attributs. Wenn jeder zweite Schritt der Kaskade gleich ist, wird der letzte Stil angewendet.

Die Schaltfläche hat einen blauen Hintergrund, der durch CSS definiert wird, das durch ein <link />-Element eingebunden wird. Eine CSS-Regel, die die Farbe auf Dunkel setzt, befindet sich in einem zweiten verknüpften Stylesheet und wird aufgrund ihrer späteren Position angewendet.

Diese Reihenfolge gilt auch für eingebettete <style>-Elemente. Wenn sie vor einem <link> deklariert werden, hat das CSS des verknüpften Stylesheets eine höhere Priorität.

Das Element <style> wird in <head> deklariert, während das Element <link /> in <body> deklariert wird. Das bedeutet, dass es spezifischer ist als das <style>-Element.

Die Reihenfolge der Selektoren in Bezug auf style-Attribute ist nicht wichtig, da diese Konflikte im Schritt „Element Attachment“ der Kaskade aufgelöst werden. Bei mehreren Deklarationen innerhalb desselben Stilattributs kann jedoch weiterhin die Positionierung verwendet werden, um den Gewinner zu ermitteln.

Die Position wird auch in der Reihenfolge Ihrer CSS-Regel angewendet. In diesem Beispiel hat das Element einen lila Hintergrund, da background: purple zuletzt deklariert wurde. Da der grüne Hintergrund vor dem lila Hintergrund deklariert wurde, wird er vom Browser ignoriert.

.my-element {
  background: green;
  background: purple;
}

Wenn Sie zwei Werte für dieselbe Eigenschaft angeben können, lassen sich auf einfache Weise Fallbacks für Browser erstellen, die einen bestimmten Wert nicht unterstützen. Im nächsten Beispiel wird font-size zweimal deklariert. Wenn clamp() im Browser unterstützt wird, wird die vorherige font-size-Deklaration verworfen. Wenn clamp() vom Browser nicht unterstützt wird, wird die ursprüngliche Deklaration berücksichtigt und die Schriftgröße ist 1, 5 rem.

.my-element {
  font-size: 1.5rem;
  font-size: clamp(1.5rem, 1rem + 3vw, 2rem);
}

Wissen testen

Ihr Wissen zur Kaskade testen

Wenn Sie den folgenden HTML-Code auf Ihrer Seite haben:

<!DOCTYPE html>
<html lang="en">
  <head>
    <link rel="stylesheet" href="/styles.css" />
  </head>
  <body>
    <button>I am a button</button>
    <style>
      button {
        background: pink;
      }
    </style>
  </body>
</html>

Innerhalb von styles.css befindet sich die folgende CSS-Regel:

button {
  background: yellow;
}

Welche Farbe hat der Hintergrund der Schaltfläche?

Rosa
Der eingebettete <style>-Ursprung befindet sich weiter unten auf der Seite als das <link>-Tag. Die Spezifität von button ist zwar gleich, aber die Position der Stilregel sorgt dafür, dass sie Vorrang hat.
yellow
Im HTML-Dokument wurde möglicherweise zuerst der gelbe Schaltflächenhintergrund gelesen, aber später wurde eine neuere Regel mit derselben Spezifität gefunden, sodass diese Regel nicht auf die Schaltfläche angewendet wird.

Spezifität

Die Spezifität ist ein Algorithmus, der bestimmt, welcher CSS-Selektor der spezifischste ist. Dazu wird ein Gewichtungs- oder Punktesystem verwendet. Wenn Sie eine Regel genauer definieren, kann sie auch dann angewendet werden, wenn später im CSS anderes CSS mit dem Selektor angegeben wird.

In der nächsten Lektion erfahren Sie, wie die Spezifität berechnet wird. Wenn Sie jedoch einige Dinge beachten, können Sie zu viele Spezifitätsprobleme vermeiden.

Wenn CSS auf eine Klasse in einem Element ausgerichtet ist, ist die Regel spezifischer und wird daher als wichtiger angesehen als CSS, das nur auf das Element ausgerichtet ist. Das bedeutet, dass mit dem folgenden CSS-Code die h1 rot dargestellt wird, obwohl beide Regeln zutreffen und die Regel für den h1-Selektor später im Stylesheet steht.

<h1 class="my-element">Heading</h1>
.my-element {
  color: red;
}

h1 {
  color: blue;
}

Ein id macht das CSS noch spezifischer. Daher werden Stile, die auf eine ID angewendet werden, durch Stile überschrieben, die auf viele andere Arten angewendet werden. Das ist ein Grund, warum es im Allgemeinen nicht ratsam ist, Stile an ein id anzuhängen. Das kann es schwierig machen, diesen Stil mit etwas anderem zu überschreiben.

Spezifität ist kumulativ

Wie Sie in der nächsten Lektion erfahren, werden für jeden Selektortyp Punkte vergeben, die angeben, wie spezifisch er ist. Die Punkte für alle Selektoren, die Sie zum Ausrichten auf ein Element verwendet haben, werden addiert. Wenn Sie ein Element mit einer Selektorliste wie a.my-class.another-class[href]:hover ansprechen, ist es daher schwierig, die Formatierung mit anderem CSS zu überschreiben. Aus diesem Grund und damit Ihr CSS besser wiederverwendet werden kann, sollten Sie Ihre Selektoren so einfach wie möglich halten. Verwenden Sie die Spezifität als Tool, um Elemente zu erreichen, wenn Sie es benötigen. Sie sollten jedoch immer in Erwägung ziehen, lange, spezifische Selektorlisten zu refaktorieren, wenn möglich.

Ursprung

Der von Ihnen geschriebene CSS-Code ist nicht der einzige CSS-Code, der auf eine Seite angewendet wird. Bei der Kaskade wird die Herkunft des Preisvergleichsportals berücksichtigt. Dazu gehören das interne Stylesheet des Browsers, von Browsererweiterungen oder dem Betriebssystem hinzugefügte Stile sowie Ihr selbst geschriebenes CSS. Die Reihenfolge der Spezifität dieser Ursprünge, von der am wenigsten spezifischen bis zur spezifischsten, ist wie folgt:

  1. User-Agent-Basisstile: Das sind die Stile, die Ihr Browser standardmäßig auf HTML-Elemente anwendet.
  2. Lokale Nutzerstile: Diese können von der Betriebssystemebene stammen, z. B. eine Standardschriftgröße oder eine Einstellung für weniger Bewegung. Sie können auch von Browsererweiterungen stammen, z. B. von einer Browsererweiterung, mit der Nutzer ihr eigenes benutzerdefiniertes CSS für eine Webseite schreiben können.
  3. Selbst erstelltes CSS: Das von Ihnen erstellte CSS.
  4. Verfasst von !important. Alle !important, die Sie Ihren selbst verfassten Erklärungen hinzufügen.
  5. Lokale Nutzerstile !important: Alle !important, die vom Betriebssystem oder von CSS auf Browsererweiterungsebene stammen.
  6. User-Agent !important: Alle !important, die im Standard-CSS definiert sind, das vom Browser bereitgestellt wird.

Eine visuelle Darstellung der Reihenfolge der Ursprünge, wie auch in der Liste erläutert.

Wenn Sie in Ihrem CSS eine Regel vom Typ !important haben und der Nutzer in seinem benutzerdefinierten CSS eine Regel vom Typ !important, welches CSS wird dann angewendet?

Wissen testen

Ihr Wissen zu Kaskadenursachen testen

Testen Sie Ihr Wissen über die Ursprünge von Kaskaden. Betrachten Sie dazu die folgenden Stilregeln aus verschiedenen Quellen:

User-Agent-Stil

h1 { margin-block-start: 0.83em; }

Bootstrap

h1 { margin-block-start: 20px; }

Stile für Seitenautoren

h1 { margin-block-start: 2ch; }

@media (max-width: 480px) {
  h1 { margin-block-start: 1ch; }
}

Benutzerdefinierter Stil

h1 { margin-block-start: 2rem !important; }

Angenommen, Sie haben den folgenden HTML-Code:

<h1>Lorem ipsum</h1>

Was ist die endgültige margin-block-start der h1?

20 Pixel
Bootstrap ist Teil des Ursprungs des Autors, der gegenüber dem wichtigen lokalen Nutzerstil verliert.
0,83em
Der Ursprung des User-Agent-Stils wird durch den wichtigen lokalen Nutzerstil überschrieben.
2rem
Das benutzerdefinierte Design für den Nutzer !important hat den spezifischsten Ursprung.
2ch
Dieser Autorenstil ist Teil des Ursprungs des Autors, der dem wichtigen lokalen Nutzerstil unterliegt.
1ch
Dieser Autorenstil ist Teil des Ursprungs des Autors, der dem wichtigen lokalen Nutzerstil unterliegt.

Wichtigkeit

Nicht alle CSS-Regeln werden gleich berechnet oder haben dieselbe Spezifität.

Die Reihenfolge der Wichtigkeit, von am wenigsten wichtig bis am wichtigsten, ist wie folgt:

  1. normaler Regeltyp, z. B. font-size, background oder color
  2. animation Regeltyp
  3. !important Regeltyp (in derselben Reihenfolge wie der Ursprung)
  4. transition Regeltyp

Regeltypen für aktive Animationen und Übergänge haben eine höhere Priorität als normale Regeln. Bei Übergängen ist die Bedeutung höher als bei !important-Regeltypen. Das liegt daran, dass eine Animation oder ein Übergang, wenn er aktiv wird, den visuellen Status ändern soll.

Mit den Entwicklertools herausfinden, warum bestimmtes CSS nicht angewendet wird

In den Browser-Entwicklertools wird in der Regel das gesamte CSS angezeigt, das mit einem Element übereinstimmen könnte. Nicht verwendete CSS-Elemente sind durchgestrichen.

Browser-Entwicklertools mit durchgestrichenem überschriebenen CSS-Code.

Wenn das erwartete CSS überhaupt nicht angewendet wird, hat es nicht mit dem Element übereingestimmt. In diesem Fall müssen Sie woanders suchen, vielleicht nach einem Tippfehler in einem Klassen- oder Elementnamen oder nach ungültigem CSS.

Wissen testen

Ihr Wissen zur Kaskade testen

Die Kaskade kann für Folgendes verwendet werden:

Konflikte lösen, wenn mehrere Formatierungen auf ein Element angewendet werden.
Das ist eines der Hauptziele: Konfliktlösung.
So wird dafür gesorgt, dass für jede Eigenschaft zur Ziehzeit nur ein Stilwert vorhanden ist.
Der Text kann nur eine Farbe haben. Die Kaskade bestimmt, welche Farbe das sein soll.
Bewertung und Gewichtung von Stilregeln
Die Bewertung und Gewichtung sind Teil der Sortierphase von The Cascade.
Stilattribute sortieren und filtern
Sortieren und Filtern sind Phasen von „The Cascade“, die helfen, Aspekte der Konfliktlösung zu verstehen.

Ressourcen