Logische Pseudoklassen
Logische Pseudoklassen wählen Elemente unter bestimmten Bedingungen aus. Sie können Selektoren ausschliessen, zusammenfassen oder Beziehungen zwischen Elementen prüfen.
Pseudoklassen im Überblick
:not()schliesst Elemente aus:is()fasst mehrere Selektoren zusammen:where()funktioniert wie:is(), hat aber Spezifität 0:has()wählt ein Element abhängig von seinem Inhalt oder Umfeld
1. :not() – ausschliessen
:not() ist eine Negations-Pseudoklasse. Sie wählt zuerst die Elemente aus, die vor
:not() stehen, und schliesst anschliessend jene aus, auf die der Selektor in der
Klammer zutrifft. So lassen sich gezielt Ausnahmen definieren.
So wird der Selektor gelesen: Wähle alle span, die nicht die Klasse
.ausnahme haben.
.not-demo span:not(.ausnahme) {
border: 2px solid magenta;
}
In :not() können auch mehrere Ausschlüsse stehen.
p:not(.intro, .highlight) {
color: gray;
}
2. :is() – zusammenfassen
Mit :is() lassen sich mehrere alternative Selektoren in einer Klammer
zusammenfassen. Das verhindert Wiederholungen, besonders bei längeren oder verschachtelten
Selektoren, ohne die Auswahl der Elemente zu verändern.
Titel im Header
Absatz im Header
header h4,
header p,
footer h4,
footer p {
color: gold;
}
Mit :is() lässt sich dieselbe Auswahl kürzer schreiben:
:is(header, footer) :is(h4, p) {
color: rebeccapurple;
}
So wird der Selektor gelesen: Alle h4- und p-Elemente
innerhalb eines header- oder footer-Elements werden ausgewählt.
3. :where() – leicht überschreibbar
:where() funktioniert bei der Auswahl wie :is(). Die Spezifität
bestimmt, welche CSS-Regel gewinnt, wenn mehrere Regeln dasselbe Element gestalten.
:where() hat immer die Spezifität 0 und lässt sich deshalb leicht durch andere
Selektoren überschreiben.
Ich werde blau
Die graue Regel mit :where() steht im CSS später. Trotzdem gewinnt die normale
Klassenregel.
.where-title {
color: blue;
}
/* steht später, ist aber weniger spezifisch */
:where(.where-title) {
color: gray;
}
Die geringe Spezifität ist praktisch für Basis-Styles und wiederverwendbare Module, die sich später leicht überschreiben lassen sollen.
4. :has() – Beziehungen prüfen
:has() wählt ein Element aus, wenn die Bedingung in der Klammer erfüllt ist. Dabei
kann geprüft werden, ob sich innerhalb des Elements ein bestimmtes Kindelement befindet oder ob
ein bestimmtes Element darauf folgt. Ausgewählt und gestaltet wird immer das Element vor
:has().
Card ohne Bild
Diese Card erfüllt die Bedingung nicht.
Card mit Bild
Diese Card erhält einen magentafarbenen Rahmen.
Gestaltet wird die .card vor :has(). Das img in der
Klammer ist nur die Bedingung.
.card:has(img) {
border-color: magenta;
}
So wird der Selektor gelesen: Wähle jede .card, die ein
img enthält.
Eine Klasse als Bedingung
Die normale Karte ist blau. Enthält sie ein Element mit der Klasse .neu, werden Rahmen und Hintergrund magenta beziehungsweise rosa dargestellt.
Normaler Beitrag
Dies ist ein alter Text.
Aktion des Monats
Dies ist ein aktueller Beitrag.
.karte {
border: 2px solid blue;
background: lightblue;
color: #000;
}
.karte:has(.neu) {
border-color: magenta;
background: pink;
}
Beispiele
1. p + img und p:has(+ img)
Beide Selektoren beschreiben dieselbe Nachbarschaft: Ein Bild folgt direkt auf einen Absatz. Sie wählen aber unterschiedliche Elemente aus.
p + img
Ich stehe vor einem Bild.
p:has(+ img)
Ich stehe vor einem Bild.
/* wählt das Bild direkt nach einem Absatz */
p + img {
border: 5px solid deepskyblue;
}
/* wählt den Absatz direkt vor einem Bild */
p:has(+ img) {
border: 5px solid magenta;
}
p + img beginnt beim Absatz und geht vorwärts zum Bild. p:has(+ img) prüft vom Absatz aus, ob direkt danach ein Bild folgt.
2. Interaktives Beispiel
Der Zustand eines enthaltenen Elements kann als Bedingung dienen. Das Formular reagiert darauf, ob die Eingabe gültig ist.
form:has(input:invalid) {
border-color: crimson;
}
form:has(input:valid) {
border-color: yellowgreen;
}
Das input liefert den Zustand. Gestaltet wird das gesamte form.
Kurz gesagt
:not()schliesst Elemente aus, die auf den Selektor in der Klammer passen.:is()fasst mehrere Selektoren zusammen und verhindert Wiederholungen.:where()wählt wie:is(), hat aber immer die Spezifität 0.:has()wählt ein Element aus, wenn die Bedingung in der Klammer erfüllt ist.- Vor
:has()steht das ausgewählte Element, in der Klammer steht die Bedingung.
Verwandte Themen
- Pseudoklassen – Elemente anhand ihres Zustands oder ihrer Position auswählen.
- Pseudoelemente – Teile eines Elements gestalten oder zusätzliche Inhalte erzeugen.