CSS/Tutorials/Selektoren/Pseudoklasse

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Bei Pseudoklassen handelt es sich um einfache Selektoren, die ein Element dann ansprechen, wenn es eine bestimmte Eigenschaft besitzt. So lassen sich zum Beispiel Elemente auswählen, über denen sich gerade der Mauszeiger befindet oder Elemente, die das erste Kindelement eines anderen Elementes sind. CSS unterscheidet:

Strukturelle Pseudoklassen wie im letzten Kapitel sind dafür gedacht, Elemente aufgrund ihrer Position im DOM zu selektieren.

dynamische Pseudoklassen

Dynamische Pseudoklassen selektieren Elemente aufgrund einer Benutzeraktion.

Im einzelnen sind dies:

für Maus- und Tastaturinteraktionen

für Verweise

für Ziele von Verweisen

Maus- und Tastaturinteraktionen

Die Pseudoklassen :hover, :active und :focus sprechen auf unmittelbare Interaktion des Benutzers an. Die Pseudoklassen selektieren Elemente, die …

  • mit dem Mauszeiger berührt werden (:hover; englisch to hover: schweben),
  • den Fokus (:focus) erhalten, zum Beispiel durch die Tabulatortaste oder
  • aktuell angeklickt sind (:active).

Ursprünglich für Verweise gedacht, sind diese Pseudoklassen in allen relevanten Browsern auf beliebige Elemente anwendbar. Allerdings ist es nicht sinnvoll, normalen Text beim Überfahren mit der Maus anders zu formatieren.

Links und ihre Zustände ansehen …
a:focus   { background-color: red; color: black;}
a:hover   { background-color: blue; color: white; }
a:active  { background-color: yellow; color: black; }
<ul>
  <li><a href="https://selfhtml.org">selfhtml</a></li>
  <li><a href="https://forum.selfhtml.org">selfhtml Forum</a></li>
  <li><a href="https://wiki.selfhtml.org">selfhtml Wiki</a></li>
</ul>

Link-Elemente, die mit der Tabulatortaste ausgewählt werden, erhalten einen roten Hintergrund, werden sie mit dem Mauszeiger berührt, wechselt der Hintergrund zu blau, während die Links angeklickt sind, ist ihre Hintergrundfarbe gelb.

Beachte: Um den zumeist erwünschten Effekt zu erhalten, muss die Reihenfolge dieses Beispiels eingehalten werden. Beispielsweise überschriebe gegebenenfalls ein :focus zuvor notierte Eigenschaften für :hover, sodass ein mit der Tabulator-Taste ausgewähltes Element scheinbar nicht auf :hover reagiert.


Beachte: Auf Mobilgeräten ist wegen der fehlenden Maus die Verwendung der Pseudoklasse :hover problematisch. Beispielsweise kann dies zur Nichtbedienbarkeit einer Navigation führen, falls Unterpunkte per :hover ausgeklappt werden sollen.

In manchen Stylesheets findet man auch die Auszeichnung a:link. Sie selektiert alle a-Elemente, die auch einen Link darstellen, also eigentlich alle.


focus-within

Die Pseudoklasse :focus-within selektiert ein Element, wenn

  • es selbst oder
  • eines seiner Nachfahren

den Fokus besitzt.


Rückwärts-Selektion mit :focus-within ansehen …
fieldset:focus-within {
  border-color: #dfac20;
  background: #fffbf0;
}
fieldset:focus-within legend {
  color: black;
  background: white;
  border-bottom-color: #dfac20;
}

Erhält ein Nachfahrenelement des fieldsets den Fokus, so wird dieses Element und seine Überschrift verändert.

Damit ist in gewisser Weise eine Rückwärts-Selektion möglich.

Beachte: focus-within selektiert ein Element, wenn irgendeins seiner Nachfahrenelemente den Fokus erhält. Es ist nicht möglich, das Elternelement in Abhängigkeit von einem bestimmten Nachfahrenelement zu selektieren.

Weblinks

für Ziele von Verweisen

Mithilfe der Pseudoklasse :target werden Elemente selektiert, die Ziel eines Verweises sind. Die CSS-Anweisungen gelten nur dann, wenn der Verweis gerade aktiviert wurde.


Selektieren von Linkzielen ansehen …
    :target {
      color: red;
      font-weight: bold;
     }

In diesem Beispiel wird jeweils das aktuell angesprungene Verweisziel in roter, fetter Schrift dargestellt.

Ein Klicken auf den unteren Link löst die Selektion wieder auf. Es wird nichts eingefärbt, da kein Element die id top besitzt.

Beachte: Zur Aktivierung ist die Vergabe einer ID notwendig.

Infobox

2013 wurden für das SELF-Wiki Beispiele entwickelt, um eine Infobox und eine Bildergroßansicht auf- und zuzuklappen. Mit :target kann man das Ziel eines (internen) Links selektieren. Ein interner Link auf eine mit CSS ausgeblendete Infobox, kann durch einen Klick das Element mittels :target wieder sichtbar machen. Durch einen weiteren Klick auf einen anderen Link verliert die Infobox das :target und wird wieder unsichtbar.

Achtung!

Diese Technologie versuchte, Benutzerinteraktionen in einer reinen CSS-Lösung ohne JavaScript zu realisieren.

Eine Infobox mit :target bewirkte, dass die Browser-Historie vollgemüllt wird. Ein Klick auf die Pfeil-zurück-Taste brachte den Nutzer nicht auf die letzte Seite, sondern in den letzten internen Link. Das ist eigentlich unpraktisch.

Heute werden Aufklapp-Mechanismen mit den nativen details- und dialog-Elementen, dem popover-Attribut oder wenigen Zeilen JavaScript realisiert:

Siehe auch

für Formularelemente

disabled, enabled, checked

Die Pseudoklassen :enabled, :disabled und :checked selektieren Formularelemente danach, ob sie anwählbar (enabled = freigegeben), nicht anwählbar (disabled = gesperrt) oder angewählt (checked, check = Haken) sind.

Das Aussehen der Bedienelemente von Formularen wird wesentlich durch den verwendeten Browser und das Betriebssystem bestimmt, die Formatierungsmöglichkeiten via CSS sind eher gering. Es gibt jedoch auch Formularelemente, deren Darstellung sich mit CSS weitreichender beeinflussen lässt, wie zum Beispiel Texteingabefelder.

Kennzeichnung von auswählbaren und ausgewählten Checkboxen ansehen …
input:disabled + span::after {content: " nicht auswählbar"} input:enabled + span::after {content: " auswählbar"} input:checked + span::after {content: " ausgewählt"} input:disabled { outline: 2px solid red;} input:checked { outline: 2px solid green; }

Im vorliegenden Beispiel werden die ausgewählten Checkboxen mit einer grünen Außenlinie umgeben; die gesperrten mit einer roten. Zusätzlich wird eine Erläuterung generiert. (Das Pluszeichen repräsentiert den Nachbarkombinator.)

Beispiel
    <form action="CSS_grundlagen_enabled_disabled_checked.html">
      <ul>
        <li><input type="checkbox"><span></span></li>
        <li><input type="checkbox" disabled><span></span></li>
        <li><input type="checkbox" checked><span></span></li>
      </ul>
    </form>
Beachte: Möglicherweise wird eine zukünftige Spezifikation eine Pseudoklasse :indeterminate für Elemente, die weder enabled noch disabled sind, beinhalten.
Hinweis:
Die Pseudoklasse checked ist integraler Bestandteil des Checkbox-Hack und kann damit genutzt werden, um dynamisches Verhalten rein mit CSS zu realisieren.

:valid und :invalid

Gültigkeit von eingegebenen Werten anzeigen ansehen …
form > * {
      float: left;
}
label {
      clear: both;
      line-height: 2em;
      margin-right: 1em;
}
label::after { 
      content:": ";}
input:valid {
      color: green;
}
input:invalid {
      background-color: #e00;
}
<form>
     <label for="input1">Bitte etwas eingeben</label>
     <input id="input1" required>
     <label for="input2">Bitte eine ganze Zahl eingeben</label>
     <input id="input2" required type="number">
     <label for="input3">Bitte eine ganze Zahl zwischen 10 und 20 eingeben</label>
     <input id="input3" required type="number" min="10" max="20">
</form>

Im vorliegenden Beispiel ändert sich die Hintergrundfarbe des Eingabefelds von rot auf transparent und die Textfarbe auf grün, sobald etwas eingegeben wurde (Beispiel 1), die Eingabe dem vereinbarten Typ (Beispiel 2) oder dem Wertebereich von 10-20 (Beispiel 3) entspricht.

Beachte: Die Browser haben ggf. noch weitere visuelle Hervorhebungen, insbesondere für die Pseudoklasse invalid, definiert. Dies kann zudem davon abhängig sein, ob sich die Elemente zur Eingabe innerhalb eines absendbaren Formulars befinden oder nicht.

Siehe auch

:in-range und :out-of-range

Die Pseudoklassen :in-range und :out-of-range selektieren Formularelemente danach, ob eine Eingabe inner- oder außerhalb der mit den Attributen min und max festgelegten Mindest- und Maximalwerten liegt. Diese Pseudoklasse gilt nur bei Elementen, bei denen eine Bereichsbegrenzung vorgenommen werden kann.


Alles im grünen Bereich? ansehen …
input {
    border: thin solid black;
}
input:in-range {
    background-color: rgb(0 255 0 / 0.25);
}
input:out-of-range {
    background-color: rgb(255 0 0 / 0.25);
    border: 2px solid red;
}
input:in-range + ::after {
    content:' ✔';
}
input:out-of-range + ::after {
    content:' außerhalb des Bereichs!';
}
<form action="" id="form1">
  <label for="alter">Ihr Alter ist: </label>
  <input id="alter" name="altersangabe" type="number" placeholder="6 bis 99" min="6" max="99">
  <span></span>
</form>

Im vorliegenden Beispiel ändert sich die Hintergrundfarbe des Eingabefelds von grün auf rot, sobald etwas außerhalb des Gültigkeitsbereichs eingegeben wurde. Sobald der eingegebene Wert wieder im Gültigkeitsbereich der Bereichsbegrenzung liegt, wird der Hintergrund wieder grün.

Siehe auch

funktionale Pseudoklassen

:where()

Die specificity-adjustment-Pseudoklasse :where() ist eine Variante der funktionalen Pseudoklasse :is(). Der einzige Unterschied ist, dass die Selektoren innerhalb von :where() nicht zur Spezifität des Gesamtselektors beitragen.

:is()

Die matches-any-Pseudoklasse :is() ist eine funktionale Pseudoklasse. Sie erhält eine Selektor-Liste als ihr Argument. Mit ihrer Hilfe können Selektoren gruppiert werden. Sie war ursprünglich als matches() (und any() bei Firefox) implementiert und wurde umbenannt.[1]

Selektoren, die innerhalb der :is()-Pseudoklasse angegeben werden, werden in der Spezifität des Selektors berücksichtigt. Wenn man das nicht wünscht, kann statt dessen die :where()-Pseudoklasse verwendet werden, die sich im Übrigen identisch zu :is() verhält.

Hinweis:
Nicht jeder CSS-Parser akzeptiert alle Typen von Selektoren innerhalb der Selektoren-Liste.[2] Bei Verwendung von :is() wird empfohlen sich auf verbundene Selektoren zu beschränken und keine Kombinatoren bzw. komplexe Selektoren zu verwenden.
Beachte: :is() darf nicht in sich selbst verschachtelt werden; etwas wie is(:is(...)) ist somit nicht erlaubt. Ebenfalls nicht erlaubt ist die Verwendung der Pseudoklasse :not() innerhalb von :is(). Auch ist die Verwendung von Pseudo-Elementen generell nicht erlaubt.
Beispiel
:is(:link, :visited) { color: red }

Das Beispiel setzt die Schriftfarbe aller Verweise auf rot (Hinweis: Das Beispiel ist äquivalent zu any-link bzw. [href]).


Hinweis bei Verwendung von CSS-Namespaces: Die Selektoren innerhalb von :is() beachten einen definierten Standard-Namespace nur, wenn sie explizit einen Typ- oder Universalselektor enthalten. Ein mögliches Namespace-Präfix außerhalb des :is() gilt dann nicht innerhalb von :is()!

Universalselektor innerhalb und außerhalb von :is()
*|*:is(:hover, :focus) { color: red }
*|*:is(*:hover, *:focus) { color: red }

Im ersten Beispiel wird jedem überfahrenen oder fokussierten Element die Schriftfarbe rot zugewiesen, egal in welchem Namespace es sich befindet. Im zweiten Beispiel betrifft dies ausschließlich die Elemente im Standard-Namespace, da der Universalselektor innerhalb von :is explizit angegeben wurde.


:not()

Die Pseudoklasse :not() erwartet als Argument einen beliebigen Selektor. Sie spricht dann alle diejenigen Elemente an, auf die das Argument nicht zutrifft.

In Level 3 der Selektoren-Spezifikation durfte :not() nur einen einfachen Selektor enthalten, und :not() durfte nicht geschachtelt werden. Die meisten Browser unterstützen mittlerweile den Level 4, der auch Kombinatoren und Selektorenlisten zulässt und das Schachtelungsverbot aufhebt.

Beispiel ansehen …
  a:not([href*="example."]) { background: red; }

In diesem Beispiel werden alle Link-Elemente, deren href-Attribut nicht die Zeichenkette „example.“ enthält mit einem roten Hintergrund versehen.

Beispiel
#inhalt :not(p) { color: red }

In diesem Beispiel würden alle Kindelemente des Elementes mit der ID „inhalt“, die keine Absätze sind, eine rote Schriftfarbe erhalten. Dies ist etwa sinnvoll, wenn dieses Element nur Überschriften, Absätze und Bilder enthält.

Weblinks

  1. W3C: Selectors Level 4 - The Matches-Any Pseudo-class (englisch)
  2. SelfHTML Wiki: Fast vs. Complete Selector Profiles (deutsch)