Selektoren und Kaskade
Der Selektor entscheidet, welche Elemente eine Regel trifft. Und wenn mehrere Regeln dasselbe Element treffen, entscheidet die Kaskade, welche gewinnt.
Die wichtigsten Selektoren
| Selektor | Trifft |
|---|---|
p |
alle <p>-Elemente |
.hinweis |
alle Elemente mit class="hinweis" |
#titel |
das eine Element mit id="titel" |
.hinweis.wichtig |
Elemente, die beide Klassen haben |
section p |
jedes p, das irgendwo in einer section steht |
section > p |
nur ein p, das direkt in der section steht |
a:hover |
den Link, während die Maus darauf zeigt |
h1, h2, h3 |
alle drei – das Komma bedeutet „oder" |
Der Unterschied zwischen section p (Leerzeichen) und section > p (Pfeil) ist genau der zwischen Nachfahre und Kind aus Kapitel 3.
Sieh dir das Beispiel oben an und beantworte ohne auszuprobieren:
a) Wie viele Absätze bekommen den gelben Hintergrund?
b) Wie viele bekommen den Balken an der Seite?
c) Warum unterscheiden sich die beiden Zahlen?
Prüfe danach in der Vorschau.
Klasse oder id?
class |
id |
|
|---|---|---|
| Wie oft je Seite? | beliebig oft | genau einmal |
| Wie viele je Element? | beliebig viele, mit Leerzeichen getrennt | eine |
| Wofür | zum Gestalten | zum eindeutigen Ansprechen, etwa als Sprungziel |
Zum Gestalten nimmst du Klassen. Eine id ist etwas so Starkes, dass sie später Ärger macht – und wenn eine id zweimal vorkommt, ist das HTML ungültig.
Klassennamen sollen sagen, was ein Element ist, nicht wie es aussieht.
| Schlecht | Gut |
|---|---|
.rot |
.warnung |
.gross |
.seitentitel |
.linke-spalte |
.navigation |
Der Grund: Wenn die Warnung eines Tages orange sein soll, heißt sie sonst .rot und ist orange. Wenn aus der linken Spalte eine obere Leiste wird, heißt sie .linke-spalte und steht oben.
Dasselbe Prinzip wie bei Variablennamen in Java: Der Name beschreibt die Bedeutung, nicht die zufällige aktuelle Ausprägung.
Wer gewinnt?
Mehrere Regeln treffen dasselbe Element. Was passiert?
a) Sag voraus, welche Farbe der Absatz hat. Prüfe dann.
b) Vertausche die Reihenfolge der drei Regeln. Ändert sich etwas?
c) Lösche die #besonders-Regel. Welche Farbe jetzt?
d) Ergänze eine zweite Regel p { color: purple; } unter der ersten. Was passiert?
Treffen mehrere Regeln dasselbe Element, entscheidet die Kaskade in dieser Reihenfolge:
- Spezifität – wie genau spricht der Selektor das Element an?
idschlägt Klasse- Klasse schlägt Elementname
- Elementname schlägt geerbten Wert
- Reihenfolge – bei gleicher Spezifität gewinnt die spätere Regel.
Merkhilfe: Je genauer du hinzeigst, desto stärker deine Aussage. Und wenn zwei gleich genau hinzeigen, gilt das zuletzt Gesagte.
Es gibt noch !important, womit sich jede Regel erzwingen lässt:
p { color: blue !important; }
Finger weg. Es ist der Notausgang für Fälle, in denen man fremdes CSS nicht ändern kann. Wer es im eigenen Projekt benutzt, hat meist nur ein zu spezifisches Selektorproblem – und braucht beim nächsten Mal ein zweites !important, um das erste zu überschreiben.
Der bessere Weg ist fast immer: einen einfacheren Selektor nehmen.
Vererbung
a) Welche der drei Deklarationen wirken auch auf die Überschrift, den Absatz und den Link?
b) Der Link hat trotzdem eine andere Farbe. Warum?
c) Formuliere eine Regel, die auch den Link einfärbt.
Tipp zu b)
Jeder Browser bringt eigene Voreinstellungen mit. Sieh im Reiter Elemente unter Styles nach, woher die Linkfarbe kommt.
Aufgabe
Schreibe CSS zu dem vorgegebenen HTML, sodass:
a) die ganze Seite eine serifenlose Schrift verwendet
b) alle Elemente mit der Klasse warnung rot und fett sind
c) nur die Listeneinträge direkt in der Navigation nebeneinander stehen (Tipp: display: inline;)
d) Links beim Überfahren mit der Maus die Farbe wechseln
Tipp 1: zu c)
Die Einträge in <main> sollen nicht nebeneinander stehen. Dein Selektor muss also die Navigation nennen: nav li.
Tipp 2: zu d)
Der Zustand hängt mit einem Doppelpunkt am Selektor: a:hover { … }.