CSS-Selektoren Crashkurs: Klassen, IDs & Kombinatoren erklärt

CSS-Selektoren sind das Fundament jeder modernen Webseite – sie bestimmen, welche HTML-Elemente gestylt werden und wie präzise diese Ansprache erfolgt. Ob einfache Element-Selektoren, Klassen mit dem Punkt-Operator oder IDs mit der Raute: Wer CSS-Selektoren versteht, hat die volle Kontrolle über das Design seiner Website. In diesem umfassenden Crashkurs erklären wir alle wichtigen Selektor-Typen, zeigen praxisnahe Beispiele und geben Tipps zur optimalen Nutzung – von den Grundlagen bis hin zu fortgeschrittenen Techniken wie Pseudo-Klassen, Attribut-Selektoren und der entscheidenden Spezifitäts-Berechnung.

Inhaltsverzeichnis

Was sind CSS-Selektoren?

CSS-Selektoren sind Muster, mit denen der Browser bestimmt, auf welche HTML-Elemente eine bestimmte Stilregel angewendet wird. Ohne Selektoren wäre CSS nutzlos – sie sind die Brücke zwischen dem HTML-Dokument und den visuellen Gestaltungsanweisungen. Jede CSS-Regel besteht aus einem Selektor und einem Deklarationsblock mit Eigenschaft-Wert-Paaren.

Das grundlegende Prinzip ist einfach: Der Selektor zeigt auf ein oder mehrere Elemente, und die geschweiften Klammern enthalten die Styling-Anweisungen. Je präziser der Selektor, desto gezielter wird das Styling angewendet.

selektor {
  eigenschaft: wert;
  eigenschaft: wert;
}

Die Grundlagen: Element-, Klassen- und ID-Selektoren

Element-Selektor (Typ-Selektor)

Der einfachste Selektor spricht HTML-Tags direkt über ihren Namen an. Er wirkt auf alle Elemente dieses Typs auf der gesamten Seite. Das ist nützlich für grundlegende Basis-Styles, kann aber schnell zu ungewollten Seiteneffekten führen, wenn man nicht aufpasst.

h1 { color: #1a5276; }
p { font-size: 16px; line-height: 1.6; }
div { margin: 10px 0; }
a { color: #2980b9; text-decoration: none; }
Praxis-Tipp: Element-Selektoren eignen sich hervorragend für CSS-Resets und Basis-Typografie. Für komponentenspezifisches Styling sind Klassen-Selektoren die bessere Wahl.

Klassen-Selektor (.)

Der Klassen-Selektor ist das Arbeitspferd im CSS-Alltag. Er wird mit einem Punkt (.) eingeleitet und spricht alle Elemente an, die das entsprechende class-Attribut tragen. Klassen können beliebig oft pro Seite verwendet werden, und ein einzelnes Element kann mehrere Klassen gleichzeitig besitzen.

<!– HTML –>
<div class=„card“>Inhalt</div>
<div class=„card highlight“>Hervorgehoben</div>
<p class=„card“>Auch ein Card</p>
.card {
  padding: 20px;
  border-radius: 8px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}

.highlight {
  border-left: 4px solid #2ecc71;
  background: #eafaf1;
}

Das Prinzip der Mehrfachklassen ist extrem mächtig: Mit class="card highlight active" kann ein Element drei unabhängige Stilregeln kombinieren. So entsteht modulares, wiederverwendbares CSS.

ID-Selektor (#)

Der ID-Selektor wird mit einer Raute (#) eingeleitet und spricht genau ein einziges Element pro Seite an. IDs haben eine deutlich höhere Spezifität als Klassen – das kann schnell zu Problemen führen, wenn man sie zu oft fürs Styling einsetzt.

#main-header {
  background: linear-gradient(135deg, #1a5276, #2980b9);
  color: #ffffff;
  padding: 20px;
}
Wichtig: In der modernen Webentwicklung gilt die Faustregel: IDs für JavaScript und Anker-Links, Klassen für CSS-Styling. Wer IDs im CSS verwendet, erhöht die Spezifität unnötig und macht den Code schwer wartbar.

Übersicht: Alle Selektor-Typen im Vergleich

🏷️

Element

Spricht HTML-Tags direkt an.

p { }   div { }

Spezifität: 0-0-1

📎

Klasse (.)

Wiederverwendbar, beliebig oft.

.card { }   .active { }

Spezifität: 0-1-0

🔑

ID (#)

Einmalig pro Seite, hohe Spezifität.

#header { }   #nav { }

Spezifität: 1-0-0

Universal (*)

Trifft auf jedes Element zu.

* { box-sizing: border-box; }

Spezifität: 0-0-0

Kombinatoren: Elemente in Beziehung zueinander ansprechen

Kombinatoren verbinden zwei oder mehr Selektoren und definieren die Beziehung zwischen den Elementen. Damit lassen sich sehr präzise Styling-Regeln erstellen, ohne zusätzliche Klassen im HTML vergeben zu müssen.

Nachfahren-Selektor (Leerzeichen)

Der Nachfahren-Selektor (ein einfaches Leerzeichen) trifft auf alle Elemente zu, die irgendwo innerhalb eines übergeordneten Elements verschachtelt sind – egal wie tief.

.nav   a → Jedes <a>-Element innerhalb von .nav, egal wie tief verschachtelt
.nav a { color: white; text-decoration: none; }

Kind-Selektor (>)

Der Kind-Selektor trifft nur auf direkte Kindelemente zu – also Elemente, die genau eine Ebene tiefer liegen. Das ist präziser als der Nachfahren-Selektor und verhindert ungewollte Seiteneffekte bei tiefer verschachtelten Strukturen.

.menu > li → Nur <li>-Elemente, die direkte Kinder von .menu sind
.menu > li { list-style: none; padding: 10px; }

Nachbar-Selektor (+)

Der Nachbar-Selektor (Adjacent Sibling) trifft auf das unmittelbar folgende Geschwisterelement zu. Damit lässt sich zum Beispiel der erste Absatz nach einer Überschrift besonders stylen.

h2 + p → Nur das <p>, das direkt nach einem <h2> steht
h2 + p { font-size: 18px; font-weight: 500; color: #555; }

Allgemeiner Geschwister-Selektor (~)

Der allgemeine Geschwister-Selektor trifft auf alle folgenden Geschwisterelemente zu – nicht nur das unmittelbar nächste.

h2 ~ p → Alle <p>-Elemente, die nach einem <h2> auf derselben Ebene stehen
h2 ~ p { color: #666; margin-left: 15px; }

Kombinatoren-Referenz im Überblick

Kombinator Syntax Beschreibung Beispiel
Nachfahre A B B irgendwo innerhalb von A .nav a
Kind A > B B als direktes Kind von A .menu > li
Nachbar A + B B direkt nach A (gleiche Ebene) h2 + p
Geschwister A ~ B Alle B nach A (gleiche Ebene) h2 ~ p

Attribut-Selektoren: Elemente nach Attributen ansprechen

Attribut-Selektoren sind besonders mächtig, wenn man Elemente nicht über Klassen oder IDs, sondern über ihre HTML-Attribute ansprechen möchte. Das ist zum Beispiel bei Formularen, Links oder data-*-Attributen extrem nützlich.

Exakte Übereinstimmung

/* Input-Felder vom Typ „text“ */
input[type=“text“] { border: 2px solid #3498db; }

/* Links die auf „_blank“ öffnen */
a[target=“_blank“] { color: #e74c3c; }

Teilweise Übereinstimmung

CSS bietet verschiedene Operatoren, um Attributwerte nur teilweise abzugleichen – ideal für dynamische Inhalte und CMS-generierte Klassen.

Operator Bedeutung Beispiel Trifft auf
[attr^="wert"] Beginnt mit a[href^="https"] Alle HTTPS-Links
[attr$="wert"] Endet mit img[src$=".webp"] Alle WebP-Bilder
[attr*="wert"] Enthält [class*="btn"] Alle Elemente mit „btn“ in der Klasse
[attr~="wert"] Wort in Liste [data-tags~="sale"] Elemente mit „sale“ als separatem Wort
[attr|="wert"] Beginnt mit (Sprache) [lang|="de"] de, de-DE, de-AT …
SEO-Tipp: Attribut-Selektoren sind ideal, um in Content-Management-Systemen wie WordPress oder Shopify automatisch generierte Elemente gezielt anzusprechen, ohne das Template ändern zu müssen. Zum Beispiel a[href*="shopify.com"] für alle Shopify-Links.

Pseudo-Klassen: Zustände und Positionen

Pseudo-Klassen sprechen Elemente in einem bestimmten Zustand oder an einer bestimmten Position im DOM an. Sie werden mit einem Doppelpunkt (:) geschrieben und sind unverzichtbar für interaktives CSS.

Zustands-Pseudo-Klassen

👆

:hover

Mauszeiger befindet sich über dem Element. Der Klassiker für interaktive Effekte bei Links, Buttons und Karten.

🎯

:focus

Element hat den Fokus (z.B. per Mausklick oder Tab-Taste). Essenziell für Barrierefreiheit bei Formularen.

:active

Element wird gerade angeklickt (Mausklick gedrückt). Nützlich für Button-Feedback.

🔗

:visited

Link wurde bereits besucht. Farbe und einige Eigenschaften können angepasst werden.

a:hover { color: #e74c3c; text-decoration: underline; }
input:focus { outline: 3px solid #2980b9; box-shadow: 0 0 8px rgba(41,128,185,0.3); }
button:active { transform: scale(0.98); }
.checkbox:checked + label { font-weight: bold; color: #27ae60; }

Struktur-Pseudo-Klassen

Struktur-Pseudo-Klassen ermöglichen es, Elemente basierend auf ihrer Position innerhalb des Elternelements auszuwählen – ohne zusätzliche Klassen im HTML.

/* Erstes Listenelement */
li:first-child { font-weight: bold; }

/* Letztes Listenelement */
li:last-child { border-bottom: none; }

/* Jedes zweite Element (Zebra-Streifen) */
tr:nth-child(even) { background: #f8f9fa; }

/* Jedes dritte Element */
li:nth-child(3n) { color: #2980b9; }

/* Einziges Kind */
p:only-child { font-style: italic; }

/* Leeres Element */
div:empty { display: none; }

Negation und Auswahl

/* Alle Inputs außer Submit-Buttons */
input:not([type=“submit“]) { border: 1px solid #ccc; }

/* Paragraphen die eine bestimmte Klasse NICHT haben */
p:not(.intro) { font-size: 14px; }

Pseudo-Elemente: Virtuelle Teile eines Elements

Pseudo-Elemente erzeugen virtuelle Elemente im DOM, die im HTML nicht existieren. Sie werden mit doppeltem Doppelpunkt (::) geschrieben und ermöglichen Styling, das ohne zusätzliches HTML-Markup funktioniert.

/* Erste Zeile eines Absatzes */
p::first-line { font-variant: small-caps; font-weight: 600; }

/* Erster Buchstabe (Initiale) */
.article p:first-of-type::first-letter {
  font-size: 3em;
  float: left;
  margin-right: 8px;
  color: #1a5276;
}

/* Inhalt vor einem Element */
.external-link::after {
  content: “ ↗“;
  font-size: 0.8em;
}

/* Dekorative Linie unter Überschriften */
h2::after {
  content: „“;
  display: block;
  width: 60px;
  height: 3px;
  background: #2980b9;
  margin-top: 8px;
}
Hinweis: Die alte Schreibweise mit nur einem Doppelpunkt (:before, :after) funktioniert aus Kompatibilitätsgründen noch, aber die korrekte CSS3-Schreibweise verwendet zwei Doppelpunkte (::before, ::after).

Spezifität: Welche Regel gewinnt?

Wenn mehrere CSS-Regeln auf dasselbe Element zutreffen, entscheidet die Spezifität (Specificity), welche Regel angewendet wird. Dieses Konzept ist einer der häufigsten Stolpersteine für Webentwickler – und gleichzeitig einer der wichtigsten Faktoren für sauberen, wartbaren CSS-Code.

So wird Spezifität berechnet

Jeder Selektor bekommt einen Spezifitätswert nach dem Schema (Inline, ID, Klasse, Element). Die Regel mit dem höchsten Wert gewinnt:

Spezifitäts-Hierarchie

p 0-0-0-1
.card 0-0-1-0
.card p 0-0-1-1
#header 0-1-0-0
#header .nav a 0-1-1-1
style="" (inline) 1-0-0-0
!important Überschreibt alles
Best Practice: Halte die Spezifität so flach wie möglich. Verwende primär Klassen-Selektoren (0-0-1-0) und vermeide IDs im CSS. Wer mit !important arbeiten muss, hat meistens ein Architektur-Problem. Die Ausnahme: Utility-Klassen wie .hidden { display: none !important; }.

Die Kaskade bei gleicher Spezifität

Bei identischer Spezifität gewinnt die Regel, die im Stylesheet weiter unten (oder später im Dokument) steht. Das ist die sogenannte Kaskadenregel – daher der Name Cascading Style Sheets.

.text { color: blue; }
.text { color: red; } /* ← gewinnt (steht weiter unten) */

Fortgeschrittene Selektoren für die Praxis

Mehrfach-Selektoren (Gruppierung)

Mit einem Komma lassen sich mehrere Selektoren zusammenfassen, die denselben Stil erhalten sollen:

h1, h2, h3 {
  font-family: ‚Segoe UI‘, sans-serif;
  color: #1a5276;
}

.btn-primary, .btn-secondary, .btn-outline {
  padding: 10px 20px;
  border-radius: 6px;
  cursor: pointer;
}

Verkettete Selektoren (ohne Leerzeichen)

Selektoren ohne Leerzeichen zwischen sich sprechen Elemente an, die alle Bedingungen gleichzeitig erfüllen:

/* Nur <a>-Elemente mit der Klasse .active */
a.active { font-weight: bold; }

/* Nur <div>-Elemente mit der ID #content */
div#content { max-width: 960px; }

/* Elemente die BEIDE Klassen haben */
.card.featured { border: 2px solid gold; }

Praxisbeispiel: WordPress und Shopify Themes

In der täglichen Arbeit mit Content-Management-Systemen wie WordPress oder Shopify kommt man häufig in Situationen, in denen die Theme-Styles überschrieben werden müssen. Hier zeigt sich die Stärke kombinierter Selektoren:

/* WordPress: Spezifische Widgets im Sidebar ansprechen */
.sidebar .widget_recent_posts ul > li { padding: 8px 0; }

/* Shopify: Produkt-Karten im Collection-Grid */
.collection-grid .card-product:hover .card-product__title {
  color: #2980b9;
}

/* WooCommerce: Preis-Anzeige nur im Single-Product */
.single-product .summary .price .amount {
  font-size: 24px;
  color: #27ae60;
}

Selektor-Cheatsheet: Die wichtigsten Selektoren auf einen Blick

Selektor Beispiel Beschreibung
**Alle Elemente
elementpAlle <p>-Elemente
.klasse.cardAlle Elemente mit class=“card“
#id#headerElement mit id=“header“
A B.nav aA-Nachfahren vom Typ B
A > Bul > liDirekte Kinder
A + Bh2 + pDirekter Nachbar
A ~ Bh2 ~ pAlle folgenden Geschwister
[attr][disabled]Hat das Attribut
[attr="x"][type="email"]Attribut ist genau „x“
:hovera:hoverMaus über Element
:nth-child()li:nth-child(odd)Ungerade Listenelemente
::before.icon::beforeVirtuelles Element davor
::after.link::afterVirtuelles Element danach
:not()input:not(.big)Negation

Häufige Fehler und wie man sie vermeidet

Selbst erfahrene Webentwickler tappen gelegentlich in typische Selektor-Fallen. Hier die häufigsten Stolpersteine – und wie man sie umgeht:

Zu hohe Spezifität

Wer IDs im CSS nutzt und dann mit !important gegensteuern muss, hat ein strukturelles Problem. Lösung: Konsequent Klassen verwenden.

Zu lange Selektor-Ketten

body .page .main .content .article p span – Das ist fragil und bricht bei jeder HTML-Änderung. Lösung: Maximal 3 Ebenen tief.

Universal-Selektor missbrauchen

* { margin: 0; padding: 0; } als Reset kann Performance kosten. Besser: Gezielte Resets für tatsächlich betroffene Elemente.

Klasse vs. Element verwechseln

div { } stylt ALLE divs. .container { } nur die mit der Klasse. Im Zweifelsfall: Immer Klassen verwenden.

Was ist der Unterschied zwischen Klasse (.) und ID (#) in CSS?

Eine Klasse wird mit einem Punkt (.) angesprochen und kann beliebig oft pro Seite verwendet werden. Eine ID wird mit einer Raute (#) angesprochen und sollte nur einmal pro Seite vorkommen. IDs haben eine höhere Spezifität als Klassen, weshalb in der modernen Webentwicklung empfohlen wird, IDs nur für JavaScript und Anker-Links zu verwenden und CSS-Styling ausschließlich über Klassen zu steuern.

Was bedeutet Spezifität in CSS und warum ist sie wichtig?

Spezifität bestimmt, welche CSS-Regel gewinnt, wenn mehrere Regeln auf dasselbe Element zutreffen. Die Berechnung folgt dem Schema: Inline-Styles (1000) > IDs (100) > Klassen (10) > Elemente (1). Wer die Spezifität versteht, vermeidet typische Probleme wie überschriebene Styles und den übermäßigen Einsatz von !important.

Was ist ein Nachfahren-Selektor und wie unterscheidet er sich vom Kind-Selektor?

Der Nachfahren-Selektor (Leerzeichen, z.B. .nav a) trifft auf alle verschachtelten Elemente zu, egal wie tief sie liegen. Der Kind-Selektor (>, z.B. .menu > li) trifft nur auf direkte Kindelemente zu – also Elemente, die genau eine Ebene tiefer liegen. Der Kind-Selektor ist präziser und verhindert ungewollte Seiteneffekte.

Was sind Pseudo-Klassen und Pseudo-Elemente in CSS?

Pseudo-Klassen (mit einem Doppelpunkt, z.B. :hover, :focus, :nth-child) sprechen Elemente in einem bestimmten Zustand oder an einer bestimmten Position an. Pseudo-Elemente (mit doppeltem Doppelpunkt, z.B. ::before, ::after, ::first-line) erzeugen virtuelle Elemente, die im HTML-Code nicht existieren, aber gestylt werden können – z.B. für dekorative Elemente oder Icons.

Wie spreche ich HTML-Elemente nach ihren Attributen an?

Mit Attribut-Selektoren in eckigen Klammern: [attr] prüft ob das Attribut existiert, [attr=“wert“] auf exakte Übereinstimmung, [attr^=“wert“] ob der Wert beginnt mit, [attr$=“wert“] ob er endet mit, und [attr*=“wert“] ob er den Wert enthält. Besonders nützlich bei Formular-Inputs (input[type=“email“]) oder Links (a[href^=“https“]).

Warum sollte man !important in CSS vermeiden?

!important überschreibt alle normalen Spezifitätsregeln und macht CSS-Code schwer wartbar. Wenn eine Regel mit !important überschrieben werden muss, hilft nur ein weiteres !important – das führt zu einer Eskalationsspirale. Besser: Spezifität bewusst niedrig halten, konsequent Klassen verwenden und CSS-Architektur sauber aufbauen. Die einzige Ausnahme sind Utility-Klassen wie .hidden { display: none !important; }.

Letzte Bearbeitung am Freitag, 27. März 2026 – 9:08 Uhr von Alex, Webmaster für Google und Bing SEO.

Ähnliche Beiträge