CSS-Pseudoklasse :has() – CSS Parent-Selector
In CSS können mit Hilfe von :has() Elemente in Abhängigkeit von untergeordneten oder nachfolgenden Elementen ausgewählt werden. Die CSS-Pseudoklasse wird daher auch als CSS Parent Selektor bezeichnet.
Mit dem CSS-Selektor :has()
können Elemente in CSS abhängig von der Anwesenheit untergeordneter oder direkt nachfolgender Elementen angesprochen werden. Die Pseudoklasse kann als »Parent Selector« verwendet werden, ermöglicht aber auch deutlich komplexere Abhängigkeiten. Dadurch ist es möglich, Styling in sehr bestimmten Konstellationen auf Elemente anzuwenden.
Syntax von CSS :has
Die relationale Pseudoklasse :has()
besteht aus den folgenden Teilen:
<target>:has(<selector>) { /* … */ }
<target>
ist der Selektor für das Element, auf das zugegriffen wird, wenn die als Argument übergebene Bedingung erfüllt ist. <selector>
ist die mittels CSS-Selektor definierte Bedingung, die erfüllt sein muss, damit Styles auf den Selektor angewendet werden. Die als Argumente verwendeten Selektoren verhalten sich relativ zum Zielselektor. Mehrere Selektoren können kommasepariert angegeben werden.
:has()
ist als »Parent Selector« nur unzureichend beschrieben, denn wie bei den meisten Pseudoklassen können Selektoren verkettet werden, so dass sowohl untergeordnete als auch benachbarte Elemente des Zielelements als Bedingung verwendet werden können.
Anwendungsbeispiele
In der einfachsten Ausführung wird :has()
als »Parent Selector« verwendet, da hier ein übergeordnetes Element (Elternelement) angesprochen wird, wenn es bestimmte untergeordnete Elemente (Kindelemente) beinhaltet.
/* Spricht <figure>-Elemente an, die <figcaption> als untergeordnetes Element enthalten */
figure:has(figcaption) { /* … */ }
/* Spricht <section>-Elemente an, die <h1>-, <h2>- oder <h3>-Elemente enhalten */
section:has(h1, h2, h3)) { /* … */}
Durch die Verwendung von >
und +
lassen sich auch direkte Kind- und Geschwisterelemente ansprechen. Außerdem können Kindelemente in Abhängigkeit von anderen Kindelementen ausgewählt werden.
/* Spricht <a>-Elemente an, die direkt ein <img>-Element enthalten */
a:has(> img) { /* … */ }
/* Spricht <p>-Elemente an, auf die ein <img>-Element folgt */
p:has(+ img) { /* … */ }
/* Spricht <img>-Elemente an, die einem <figure>-Element untergeordnet sind, welches ein <figcaption>-Element enthält */
figure:has(figcaption) img { /* … */ }
Anhand dieser kurzen Beispiele wird deutlich, wie vielseitig und nützlich die Pseudoklasse :has()
ist. In Kombination mit anderen Pseudoklassen wie :not()
oder vielschichtigeren Konstellationen können komplexe relationale Selektoren erstellt werden, die ein sehr zielgerichtetes Styling ermöglichen.
Browser Support
Den detaillierten Browser-Support für dieses Feature könnt ihr auf caniuse.com einsehen.
Wenn man nicht mehr weiß, was man schreiben soll, schreibt man über die has-Pseudoklasse. ;)
Tolle Sache, wenn sie denn endlich mal in allen modernen Browsern implementiert und nutzbar wäre. Die Spezifikation dazu gibt’s schon lange (ist nächstes Jahr nicht runder Geburtstag?), nur wollen die Browserhersteller anscheinend nicht damit weiterkommen.