Menu

CSS ::before und ::after: Pseudoelemente mit Beispielen

::before und ::after fügen generierten Inhalt als erstes und letztes Kind eines Elements ein, direkt aus dem CSS. Hier lernst du die Eigenschaft content, warum ein leeres content Pflicht ist, wie du sie positionierst, Tooltips mit attr(), Zähler und wo sie nicht funktionieren.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Was ::before und ::after machen

::before fügt eine Box als erstes Kind eines Elements ein und ::after als letztes Kind. Was in der Box steht, legt die Eigenschaft content fest. Am HTML ändert sich nichts: Der Browser erzeugt die Box aus dem CSS.

Im HTML stehen nur 9 und Tests pass. Das Dollarzeichen, das Label „/ month“ und das Häkchen kommen alle aus dem CSS. Sie erben die Styles des Elements (Schrift, Farbe), solange du sie nicht überschreibst, wie es die Beispiele oben tun.

Syntax

selector::before {
  content: "text";   /* required */
  /* any other styles */
}

selector::after {
  content: "";       /* empty string: a box with no text */
}
Wert von contentErgebnis
"text"Ein String. Nimm "\A" für einen Zeilenumbruch (mit white-space: pre), "\2192" für ein Unicode-Zeichen (→)
""Eine leere Box, für Formen und Dekorationen
attr(data-label)Der Wert eines Attributs des Elements
counter(step)Der Wert eines CSS-Zählers
open-quote / close-quoteAnführungszeichen für die Sprache des Elements
none oder normalKein Pseudoelement (normal ist der Standard)

content ist Pflicht. Ohne diese Eigenschaft werden ::before und ::after nie erzeugt, egal wie viele andere Eigenschaften du ihnen gibst.

Dekorative Formen mit content: ""

Mit content: "" ist das Pseudoelement eine leere Box, der du Größe und Farbe geben kannst. Standardmäßig ist sie inline, und eine Inline-Box ignoriert width und height, also gib ihr display: block, inline-block oder position: absolute:

Ein Pseudoelement positionieren

Für eine Dekoration, die auf oder um das Element liegt, setzt du position: absolute auf das Pseudoelement und position: relative auf das Element selbst, damit die Abstände vom Element aus gemessen werden:

Achte auf die Reihenfolge, wenn du es mit einer Pseudoklasse kombinierst: Zuerst kommt der Zustand, dann das Pseudoelement, also .link:hover::after, niemals .link::after:hover.

Attribute mit attr() lesen: ein Tooltip

attr() holt den Wert eines Attributs in content, sodass eine einzige Regel an jedem Element einen anderen Text zeigen kann:

Einen Tooltip, der nur beim Hovern erscheint, sehen Tastatur- und Touch-Nutzer nicht. Alles Wichtige gehört als Text in die Seite, oder du zeigst ihn zusätzlich bei :focus, mit tabindex="0" am Element.

Nummerieren mit Zählern

CSS-Zähler und ::before nummerieren Dinge, ohne dass du die Zahlen eintippst:

Füge einen Schritt hinzu oder entferne einen, und die Nummern passen sich selbst an.

Wo ::before und ::after nicht funktionieren

Pseudoelemente werden innerhalb des Elements eingefügt, zwischen seinen Tags. Elemente ohne ein solches Inneres können sie nicht anzeigen:

  • <img>, <video>, <iframe> (ersetzte Elemente)
  • <input>, <select>, <textarea> (Formularelemente) und <br>

Manche Browser zeichnen sie an einer Checkbox oder einem kaputten Bild, aber nicht einheitlich. Setz das Pseudoelement stattdessen an einen Wrapper: <span class="field"><input></span> und style .field::after.

Häufige Fehler

  • Kein content. Der mit Abstand häufigste Grund, warum nichts erscheint. Füge content: "" hinzu.
  • Einem Inline-Pseudoelement eine Größe geben. width und height bewirken nichts, bis du display: block, inline-block oder position: absolute setzt.
  • Falsche Reihenfolge mit einem Zustand. a:hover::after funktioniert; a::after:hover nicht.
  • Absolute Position ohne positioniertes Elternelement. Das Pseudoelement richtet sich dann an einem weit entfernten Vorfahren aus. Gib dem Element position: relative.
  • Echten Inhalt ins CSS schreiben. Text in content lässt sich weder markieren noch kopieren. Informationen gehören ins HTML.

Häufig gestellte Fragen

Was macht ::before in CSS?

Es erzeugt ein Pseudoelement, das das erste Kind des ausgewählten Elements ist, gefüllt mit dem, was die Eigenschaft content angibt. ::after macht dasselbe als letztes Kind. Keins von beiden steht im HTML, deshalb eignen sie sich für Icons, Labels und Dekorationen.

Warum wird mein ::before oder ::after nicht angezeigt?

Der häufigste Grund ist eine fehlende Eigenschaft content: Ohne sie wird das Pseudoelement nicht erzeugt. Nimm content: "" für eine leere dekorative Box. Weitere Ursachen: ein Inline-Pseudoelement mit Breite und Höhe (gib ihm display: block oder inline-block) oder ein Element wie <img> oder <input>, das sie nicht aufnehmen kann.

Was ist der Unterschied zwischen :before und ::before?

Im Verhalten keiner. ::before mit zwei Doppelpunkten ist die aktuelle Syntax, die Pseudoelemente kennzeichnet; :before mit einem Doppelpunkt ist die ältere Schreibweise aus CSS2, die Browser für before, after, first-line und first-letter weiterhin akzeptieren.

Kann ich ::before an einem img oder input verwenden?

Nicht zuverlässig. Pseudoelemente werden in den Inhalt des Elements eingefügt, und ersetzte Elemente wie <img> sowie Formularelemente wie <input> haben dafür keine Inhaltsbox. Pack das Element in ein <span> oder <div> und setz das Pseudoelement an diesen Wrapper.

Lesen Screenreader den Inhalt von CSS ::before vor?

In der Regel ja: Text in content fließt meist in den zugänglichen Namen ein, lässt sich aber weder markieren noch kopieren. Behalte echte Informationen im HTML und nutze Pseudoelemente für Dekoration und kleine visuelle Hinweise.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S