CSS-Selektoren und Kombinatoren

CSS-Selektoren werden verwendet, um ein Muster der Elemente zu definieren, die Sie auswählen möchten, um eine Gruppe von CSS-Regeln auf die ausgewählten Elemente anzuwenden. Kombinatoren definieren die Beziehung zwischen den Selektoren. Mithilfe verschiedener Selektoren und Kombinatoren können Sie gezielt Elemente basierend auf ihrem Typ, Attributen, Zustand oder ihrer Beziehung zu anderen Elementen auswählen und stylen.

Arten von Selektoren

Es gibt über 80 Selektoren und Kombinatoren. CSS-Selektoren können in die folgenden Kategorien gruppiert werden, basierend auf dem Typ der Elemente, die sie auswählen können.

Basis-Selektoren

Der Typ-Selektor wählt alle Elemente aus, die den angegebenen Knoten-Namen aufweisen. Zum Beispiel wird div alle <div>-Elemente und input jedes <input>-Element auswählen. Der universelle Selektor, gekennzeichnet durch ein Sternchen (*), ist ein spezieller Typ-Selektor, der alle Elemente auswählt.

Der Klassen-Selektor wählt alle Elemente aus, die das angegebene class-Attribut besitzen, gekennzeichnet durch den Klassennamen mit einem vorangestellten Punkt (.). Zum Beispiel wird .index jedes Element auswählen, das class="index" hat. Der ID-Selektor wählt ein Element basierend auf dem Wert seines id-Attributs aus. Der Selektor wird durch das id mit einem vorangestellten "Nummernzeichen" (U+0023, #) angegeben. Zum Beispiel wird #toc das Element auswählen, welches id="toc" hat. Sowohl class als auch id sind globale Attribute. Es sollte nur ein Element mit einem bestimmten id in einem Dokument geben; wenn es jedoch mehr als eines gibt, wird der ID-Selektor alle Elemente mit diesem id auswählen.

Wenn ein Typ- oder universeller Selektor mit einem Klassen- oder ID-Selektor kombiniert wird, um einen zusammengesetzten Selektor zu erstellen, muss der Typ- oder universelle Selektor dem Klassen- oder ID-Selektor vorausgehen.

CSS

In diesem Beispiel deklarieren wir vier einfache Selektoren und einen zusammengesetzten Selektor mithilfe der vier Arten von Basis-Selektoren, wie oben beschrieben.

css
* {
  font-style: italic;
}
p {
  color: red;
}
.myClass {
  text-decoration: underline;
}
#myId {
  font-family: monospace;
}
p.myClass#myId {
  font-size: 1.5rem;
}

HTML

html
<p class="myClass" id="myId">I match everything.</p>
<p>I match the universal and type selectors only.</p>

Ergebnis

Kombinatoren

Mithilfe von CSS-Kombinatoren können wir Selektoren kombinieren, um DOM-Knoten basierend auf ihrer Beziehung zu anderen Elementen innerhalb des Dokumentknotenbaums auszuwählen. Diese Kombination von Selektoren mit Kombinatoren erzeugt komplexe Selektoren.

Nachfahren-Kombinator

Der Nachfahren-Kombinator, gekennzeichnet durch eines oder mehrere Leerzeichen, wählt Knoten aus, die Nachfahren des ersten Elements sind. Zum Beispiel wird div span alle <span>-Elemente auswählen, die sich innerhalb eines <div>-Elements befinden.

Kind-Kombinator

Der Kind-Kombinator ist spezifischer als der Nachfahren-Kombinator. Mit dem Größer-als-Zeichen (>), wählt der Kind-Kombinator Knoten aus, die direkte Kinder des ersten Elements sind. Im Vergleich zu unserem vorherigen Beispiel wird div > span nur die <span>-Elemente auswählen, die direkte Kinder eines <div>-Elements sind.

Nachfolgender-Geschwister-Kombinator

Zusätzlich zu Nachfahren-Selektoren ermöglicht CSS auch die Auswahl von Elementen basierend auf ihren Geschwistern. Der nachfolgende-Geschwister-Kombinator, gekennzeichnet durch eine Tilde (~), wählt Geschwister aus. Bei A ~ B werden alle Elemente, die B entsprechen, ausgewählt, wenn sie von A vorangegangen werden, vorausgesetzt, dass beide das gleiche Elternteil haben. Zum Beispiel wird h2 ~ p alle <p>-Elemente auswählen, die einem h2 folgen, direkt oder nicht.

Direkt-nachfolgender-Geschwister-Kombinator

Der direkt-nachfolgende-Geschwister-Kombinator, gekennzeichnet durch das Pluszeichen (+), ähnelt dem nachfolgenden-Geschwister-Kombinator. Jedoch wird bei A + B nur B ausgewählt, wenn B direkt von A vorangegangen wird und beide dasselbe Elternteil haben. In Bezug auf unser vorheriges Beispiel wird h2 + p nur das <p>-Element auswählen, das direkt einem <h2>-Element folgt.

Spalten-Kombinator

Es gibt auch einen Spalten-Kombinator, gekennzeichnet durch doppelte senkrechte Striche (||), der, wenn unterstützt, Knoten auswählt, die zu einer Spalte gehören. Zum Beispiel wird col || td alle <td>-Elemente auswählen, die zum Kontext des <col> gehören.

Namensraum-Trennzeichen

Das Namensraum-Trennzeichen ist ein weiteres Kombinator, das allgemein in Verbindung mit der @namespace-Regel verwendet wird. Es wird durch ein einzelnes senkrechtes Strich-Zeichen (|) dargestellt. Es ermöglicht die Einschränkung von Typ-Selektoren und des universellen Selektors auf einen spezifischen Namensraum. Zum Beispiel, wenn ein Namensraum wie @namespace SVG url('http://www.w3.org/2000/svg'); definiert wurde, kann man Selektoren erstellen, die nur auf Elemente im SVG-Namensraum abzielen. Die Deklaration SVG|a würde Links innerhalb von SVGs auswählen, aber nicht die im Rest des Dokuments. Namespaces können nützlich sein, um MathML-, SVG- oder andere XML-basierte Inhalte innerhalb von HTML gezielt anzusprechen.

CSS

In diesem Beispiel deklarieren wir fünf relative Selektoren, indem wir einfache Selektoren mit Kombinatoren kombinieren.

css
h2 + p ~ p {
  font-style: italic;
}
h2 + p + p {
  color: red;
}
.myClass + p {
  text-decoration: underline;
}
#myId > .myClass {
  outline: 3px dashed red;
}
* > p {
  font-size: 1.1rem;
}

HTML

html
<h2 class="myClass" id="myId">
  No selectors match. <span class="myClass">This span has an outline</span> as
  it is both myClass and a child of #myId.
</h2>
<p>The first paragraph is underlined. All the paragraphs are 1.1rem.</p>
<p>
  The second paragraph is red. This and the following paragraphs are italic.
</p>
<p>The third paragraph is NOT red. It is italic and 1.1rem.</p>
<p class="myClass">
  Does not have an outline; this is a sibling of H2, not a child. It is italic
  and 1.1rem.
</p>

Ergebnis

Erstellen komplexer Selektoren mit CSS-Nesting

Die oben genannten komplexen Selektoren können auch mit einfachen Selektoren, Kombinatoren und CSS-Nesting mit oder ohne den &-Nesting Selektor definiert werden.

CSS

In diesem Beispiel replizieren wir die gleichen fünf relativen Selektoren unter Verwendung einfacher Selektoren kombiniert mit Kombinatoren, dieses Mal jedoch mit CSS-Nesting.

css
h2 {
  & + p {
    & ~ p {
      font-style: italic;
    }
    & + p {
      color: red;
    }
  }
}
.myClass {
  & + p {
    text-decoration: underline;
  }
}
#myId {
  & > .myClass {
    outline: 3px dashed red;
  }
}
* {
  & > p {
    font-size: 1.1rem;
  }
}

HTML

html
<h2 class="myClass" id="myId">
  No selectors match. <span class="myClass">This span has an outline</span> as
  it is both myClass and a child of #myId.
</h2>
<p>The first paragraph is underlined. All the paragraphs are 1.1rem.</p>
<p>
  The second paragraph is red. This and the following paragraphs are italic.
</p>
<p>The third paragraph is NOT red. It is italic and 1.1rem.</p>
<p class="myClass">
  Does not have an outline; this is a sibling of H2, not a child. It is italic
  and 1.1rem.
</p>

Ergebnis

Attribut-Selektoren

Attribut-Selektoren wählen alle Elemente aus, die ein bestimmtes Attribut haben oder deren Attributwert mit einem gegebenen Substring übereinstimmt, je nachdem, wie der Selektor geschrieben ist. Zum Beispiel wird [type] alle Elemente auswählen, die das type-Attribut gesetzt haben (auf jeden beliebigen Wert), und [type="submit"] wird sowohl <input type="submit"> als auch <button type="submit"> oder jedes Element mit type="submit" auswählen, obwohl dieses Attribut-Wert-Paar nur bei <input>- und <button>-Elementen unterstützt wird. Der Abgleich ist nicht scharf auf Groß-/Kleinschreibung.

Die Groß-/Kleinschreibung eines Attributs hängt von der Sprache ab. Im Allgemeinen ist in HTML, wenn ein Attribut enumeriert ist, der Wert im Selektor nicht Groß-/Kleinschreibungs-sensitiv, selbst wenn der Wert keiner der aufgezählten Werte ist oder wenn das Attribut kein gültiger Wert für das Element ist, auf dem es gesetzt ist. Für nicht-enumerierte Attribute wie class, id oder data-*-Attribute oder für nicht-HTML-Attribute wie role oder aria-*-Attribute ist der Wertevergleich Groß-/Kleinschreibungs-sensitiv; der Abgleich kann durch einen Groß-/Kleinschreibung-ignorierenden Modifikator (i) nicht Groß-/Kleinschreibungs-sensitiv gemacht werden.

Pseudo-Klassen-Selektoren

Das CSS-Selektoren-Modul definiert über 60 Pseudo-Klassen. Pseudo-Klassen sind einfache Selektoren, die mit einem Doppelpunkt (:) versehen sind und die Auswahl von Elementen basierend auf Zustandsinformationen ermöglichen, die nicht im Dokumentbaum enthalten sind. pseudo-classes können verwendet werden, um ein Element basierend auf seinem Zustand zu stylen. Zum Beispiel selektiert der :target-einfache Selektor das Element einer URL mit einem Fragmentbezeichner, und der a:visited zusammengesetzte Selektor wählt alle <a>-Elemente aus, die von einem Benutzer besucht wurden.

Pseudo-Klassen können kategorisiert werden als Anzeigestatus des Elements, Eingabe-Pseudo-Klassen, linguistische, Lokationsbezogene, Ressourcenstatus, zeitdimensional, baumstrukturell, Nutzeraktion und funktional.

Es können mehrere Pseudo-Klassen kombiniert werden, um zusammengesetzte Selektoren zu erstellen. Wenn eine Pseudo-Klasse in einen zusammengesetzten Selektor mit einem Typ- oder universellen Selektor kombiniert wird, muss die Pseudo-Klasse dem Typ- oder universellen Selektor folgen, falls vorhanden.

Pseudo-Element-Selektoren

Nicht alle CSS-Selektoren sind im CSS-Selektoren-Modul definiert. CSS-Pseudo-Element-Selektoren sind im CSS-Pseudo-Elemente-Modul definiert.

CSS-Pseudo-Elemente, die mit zwei Doppelpunkten (::) beginnen, repräsentieren Entitäten, die nicht in HTML enthalten sind. Zum Beispiel wählt der einfache ::marker-Selektor Aufzählungszeichen und der zusammengesetzte Selektor p::first-line die erste Zeile aller <p>-Elemente aus.

Spezifikationen

Specification
Selectors Level 4
CSS Pseudo-Elements Module Level 4

Details zu Pseudo-Klassen und Pseudo-Elementen finden Sie in den Pseudo-Klassen-Spezifikationen und Pseudo-Element-Spezifikationen.

Siehe auch