CSS-Selektoren und Kombinatoren

CSS-Selektoren werden verwendet, um ein Muster der Elemente zu definieren, die Sie auswählen möchten, um eine Reihe von CSS-Regeln auf die ausgewählten Elemente anzuwenden. Kombinatoren definieren die Beziehung zwischen den Selektoren. Durch die Verwendung verschiedener Selektoren und Kombinatoren können Sie die gewünschten Elemente präzise auswählen und stylen, basierend auf ihrem Typ, ihren Attributen, ihrem Zustand oder ihrer Beziehung zu anderen Elementen.

Arten von Selektoren

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

Grundlegende Selektoren

Der Typ-Selektor wählt alle Elemente aus, die den angegebenen Knotennamen haben. Zum Beispiel wird div alle <div>-Elemente auswählen und input wird jedes <input>-Element treffen. Der Universalselektor, dargestellt durch ein Sternchen (*), ist ein spezieller Typ-Selektor, der alle Elemente auswählt.

Der Klassenselektor wählt alle Elemente aus, die das angegebene class-Attribut haben, das durch den Klassennamen, vorangestellt mit einem Punkt (.), angegeben wird. Zum Beispiel wird .index jedes Element treffen, das class="index" hat. Der ID-Selektor wählt ein Element basierend auf dem Wert seines id-Attributs aus. Der Selektor ist die id, vorangestellt mit einem "Nummernzeichen" (U+0023, #). Zum Beispiel wird #toc das Element treffen, das id="toc" hat. Sowohl class als auch id sind globale Attribute. Es sollte nur ein Element mit einer gegebenen id in einem Dokument geben; aber wenn es mehr als eines gibt, wird der ID-Selektor alle Elemente mit dieser id treffen.

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

CSS

In diesem Beispiel deklarieren wir vier einfache Selektoren und einen zusammengesetzten Selektor mit den vier grundlegenden Selektortypen 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

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

Nachfahrkombinator

Der Nachfahrkombinator, dargestellt durch ein oder mehrere Leerzeichen, wählt Knoten aus, die Nachfahren des ersten Elements sind. Zum Beispiel wird div span alle <span>-Elemente treffen, die innerhalb eines <div>-Elements sind.

Kindkombinator

Der Kindkombinator ist spezifischer als der Nachfahrkombinator. Dargestellt durch das Größer-als-Zeichen (>), wählt der Kindkombinator 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.

Geschwisterkombinator

Zusätzlich zu Nachfahrselektoren ermöglicht CSS auch die Auswahl von Elementen basierend auf ihren Geschwistern. Der nachfolgende Geschwisterkombinator, dargestellt durch eine Tilde (~), wählt Geschwister aus. Angenommen A ~ B, werden alle Elemente, die B entsprechen, ausgewählt, wenn sie von A vorausgegangen werden, vorausgesetzt, sowohl A als auch B teilen denselben übergeordneten Knoten. Zum Beispiel wird h2 ~ p alle <p>-Elemente treffen, die auf ein h2 folgen, unmittelbar oder nicht.

Nachfolgender Geschwisterkombinator

Der nachfolgende Geschwisterkombinator, dargestellt durch das Pluszeichen (+), ist ähnlich wie der nachfolgende Geschwisterkombinator. Jedoch, angenommen A + B, wird es nur B treffen, wenn B unmittelbar von A vorausgegangen wird, wobei beide denselben übergeordneten Knoten teilen. Ergänzend zu unserem vorherigen Beispiel wird h2 + p nur das einzelne <p>-Element treffen, das unmittelbar auf ein <h2>-Element folgt.

Spaltenkombinator

Es gibt auch einen Spaltenkombinator, dargestellt durch zwei senkrechte Striche (||), der, wenn unterstützt, Knoten auswählt, die zu einer Spalte gehören. Zum Beispiel wird col || td alle <td>-Elemente treffen, die zum Bereich der <col> gehören.

Namespace-Trenner

Der Namespace-Trenner ist ein weiterer Kombinator, der in der Regel zusammen mit der @namespace-Regel verwendet wird. Dieser Kombinator wird durch ein einzelnes senkrechtes Zeichen (|) dargestellt. Er ermöglicht es, Typ-Selektoren und den Universalselektor auf einen bestimmten Namespace zu beschränken. Zum Beispiel könnte durch die Definition eines Namespace wie @namespace SVG url('http://www.w3.org/2000/svg'); ein Selektor enthalten sein, der nur auf Elemente abzielt, die in einem SVG-Namespace verschachtelt sind. Die Deklaration SVG|a würde Links innerhalb von SVGs und nicht in anderen Teilen des Dokuments treffen. Namespacing kann nützlich sein, um MathML-, SVG- oder andere XML-basierte Inhalte innerhalb Ihres HTML zu adressieren.

CSS

In diesem Beispiel deklarieren wir fünf relative Selektoren mit einfachen Selektoren, die mit Kombinatoren kombiniert werden.

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-Verschachtelung

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

CSS

In diesem Beispiel replizieren wir dieselben fünf relativen Selektoren mit einfachen Selektoren kombiniert mit Kombinatoren, diesmal aber mit CSS-Verschachtelung.

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

Attributselektoren

Attributselektoren wählen alle Elemente aus, die je nachdem, wie der Selektor geschrieben ist, entweder das gegebene Attribut haben oder das gegebene Attribut mit einem Teilstring-Wertübereinstimmung. Zum Beispiel wird [type] alle Elemente auswählen, die das type-Attribut gesetzt haben (auf jeden Wert), und [type="submit"] wird <input type="submit"> und <button type="submit"> treffen oder jedes Element mit type="submit" gesetzt, auch wenn dieses Attribut-Wert-Paar nur auf <input>- und <button>-Elementen unterstützt wird. Die Übereinstimmung ist nicht case-sensitiv.

Die Groß-/Kleinschreibung des Attributs hängt von der Sprache ab. Im Allgemeinen, in HTML, wenn ein Attribut aufgezählt ist, ist der Wert im Selektor nicht case-sensitiv, selbst wenn der Wert nicht einer 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 aufgezählte Attribute wie class, id oder jedes data-*-Attribut oder für nicht-HTML-Attribute wie role oder aria-*-Attribute, ist die Wertübereinstimmung case-sensitiv; die Übereinstimmung kann mit einem nicht case-sensitiven Modifikator (i) nicht case-sensitiv gemacht werden.

Pseudo-Klassen-Selektoren

Das CSS-Selektoren-Modul definiert über 60 Pseudo-Klassen. Pseudo-Klassen sind einfache Selektoren, vorangestellt mit einem Doppelpunkt (:), die es ermöglichen, Elemente basierend auf Zustandsinformationen auszuwählen, die nicht im Dokumentenbaum enthalten sind. pseudo-classes können verwendet werden, um ein Element basierend auf seinem Zustand zu stylen. Zum Beispiel zielt der :target einfache Selektor auf ein Element eines URLs mit einem Fragmentidentifier, und der a:visited zusammengesetzte Selektor trifft alle <a>-Elemente, die von einem Benutzer besucht wurden.

Die Pseudo-Klassen können als Anzeigezustand eines Elements, Eingabe, sprachlich, Standort, Ressourcenzustand, zeitdimensionale, Baumstruktur, Benutzeraktion und funktional kategorisiert werden.

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

Pseudo-Element-Selektoren

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

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

Spezifikationen

Specification
Selectors Level 4
CSS Pseudo-Elements Module Level 4

Weitere Details zu diesen finden Sie in den Spezifikationstabellen für Pseudo-Klassen und Pseudo-Elemente.

Siehe auch