content

Zuletzt aktualisiert am 15. Februar 2026

content erzeugt Inhalte über die Pseudo-Elemente ::before und ::after, ohne das HTML zu verändern. Damit fügst du dekorative Elemente wie Icons, Sterne für Pflichtfelder oder automatische Nummerierungen ein. Wichtig: Generated Content gehört nicht zum DOM und wird von Screenreadern unterschiedlich behandelt. Verwende content nur für dekorative Zwecke und nie für inhaltlich relevante Informationen.

Syntax
content: normal | none | <string> | attr() | url() | counter() | open-quote | close-quote
Initialwert
normal
Vererbt
Nein
Animierbar
Nein

Grundlagen

Pseudo-Elemente ::before und ::after erzeugen ein zusätzliches Element als erstes bzw. letztes Kind des Elements. Damit sie erscheinen, brauchen sie zwingend die content-Eigenschaft. Selbst wenn der Inhalt leer sein soll, muss content: "" gesetzt werden.

Der erzeugte Inhalt ist standardmäßig ein Inline-Element. Du kannst ihn mit display: block oder display: inline-block umformatieren und wie jedes andere Element mit Padding, Margin, Hintergrund und Rahmen stylen.

Ein zentraler Punkt: Generated Content existiert nicht im HTML-DOM. Du kannst ihn nicht mit JavaScript selektieren, er wird nicht von der Textauswahl erfasst, und Screenreader behandeln ihn inkonsistent. Manche lesen ihn vor, manche ignorieren ihn. Deswegen gilt: Nur dekorativen Inhalt mit content erzeugen.

Syntax & Werte

Wert Beschreibung Beispiel
normal Für ::before und ::after: Kein Pseudo-Element wird erzeugt. (Standard) content: normal
none Pseudo-Element wird nicht erzeugt oder ein bestehendes wird entfernt. content: none
"text" Fügt den angegebenen Text ein. Mehrere Strings und Funktionen können kombiniert werden. content: "→ "
attr(name) Fügt den Wert eines HTML-Attributs ein. content: attr(data-label)
url(pfad) Fügt ein Bild oder eine Ressource ein. content: url("icon.svg")
counter(name) Gibt den Wert eines CSS-Counters aus. Nützlich für automatische Nummerierungen. content: counter(section)
open-quote / close-quote Fügt Anführungszeichen basierend auf der quotes-Eigenschaft ein. content: open-quote

Mehrere Werte lassen sich kombinieren: content: "Kapitel " counter(chapter) ": " erzeugt z.B. “Kapitel 3: ”.

Beispiele

Ein häufiges Muster: Ein kleines Symbol vor oder nach einem Element einfügen.

Pfeil-Icon vor Links
.arrow-link::before {
  content: "→ ";
  color: #059669;
}

Pflichtfeld-Stern bei Formularen

Der rote Stern nach Pflichtfeld-Labels ist ein klassischer Anwendungsfall für ::after.

Pflichtfeld-Stern
.required::after {
  content: " *";
  color: #dc2626;
}

Zeige bei externen Links automatisch ein Hinweis-Symbol an. Der Attribut-Selektor erkennt Links, die mit http beginnen.

Externe Links markieren
/* Links die mit http beginnen */
a[href^="http"]::after {
  content: " ↗";
  font-size: 0.85em;
  color: #6b7280;
}

Attribut-Werte mit attr() anzeigen

attr() liest den Wert eines HTML-Attributs und fügt ihn als Text ein. Praktisch für Tooltips oder Daten-Labels.

Tooltip mit attr()
.tooltip::after {
  content: attr(data-tooltip);
  position: absolute;
  top: calc(100% + 6px);
  background: #1e293b;
  color: white;
  padding: 4px 10px;
  border-radius: 4px;
  opacity: 0;
  transition: opacity 0.2s;
}

.tooltip:hover::after {
  opacity: 1;
}

Custom List Bullets

Ersetze die Standard-Aufzählungszeichen durch eigene Symbole mit ::before.

Eigene Aufzählungszeichen
.custom-list {
  list-style: none;
  padding: 0;
}

.custom-list li {
  padding-left: 24px;
  position: relative;
}

.custom-list li::before {
  content: "✓";
  position: absolute;
  left: 0;
  color: #059669;
  font-weight: bold;
}

Barrierefreiheit

Generated Content via content ist für Screenreader unzuverlässig. Das Verhalten variiert stark zwischen Screenreadern und Browsern: Manche lesen content: "text" vor, andere ignorieren es komplett. Du darfst dich nicht darauf verlassen, dass assistive Technologien den Inhalt erfassen.

Verwende content nur für dekorative Zwecke. Pfeile, Trennzeichen, Ornamente und visuelle Hinweise sind in Ordnung. Aber niemals wichtige Informationen wie Preise, Statusmeldungen oder Anleitungen in Pseudo-Elementen verstecken. Diese Inhalte müssen im echten HTML-DOM stehen.

Der Pflichtfeld-Stern ist ein Sonderfall: content: " *" für Pflichtfelder ist akzeptabel, aber nur in Kombination mit dem required-Attribut am Input-Element und optionalem aria-required="true". Der Stern ist dann rein visuell, die Pflicht-Information kommt aus dem HTML.

attr() für semantische Inhalte ist riskant. Während content: attr(data-tooltip) technisch funktioniert, sollten wichtige Tooltips stattdessen über aria-label, aria-describedby oder echte HTML-Elemente mit passenden ARIA-Rollen bereitgestellt werden. Die WCAG 1.3.1 (Info and Relationships) fordert, dass Informationen programmatisch verfügbar sind.

Alt-Texte in content: url() funktionieren nicht verlässlich. Die Syntax content: url(icon.svg) / "Beschreibung" hat nur sehr begrenzte Browser-Unterstützung. Verwende für Icons stattdessen SVG direkt im HTML mit <title> oder echte <img>-Elemente mit alt-Attribut.

Häufige Fehler

  • content vergessen bei ::before/::after: Ohne content wird das Pseudo-Element nicht gerendert. Selbst für rein dekorative Elemente brauchst du mindestens content: "".
  • Wichtigen Inhalt mit content erzeugen: Generated Content ist nicht Teil des DOM, wird von der Textauswahl ausgeschlossen und von Screenreadern inkonsistent behandelt. Verwende ihn nur für Dekoration, nie für inhaltlich relevante Informationen.
  • content auf normalen Elementen setzen: content funktioniert nur auf ::before und ::after. Auf einem <div> oder <span> hat es keine Wirkung (außer bei Elementen mit display: contents, wo es den Inhalt ersetzt).
  • Anführungszeichen vergessen bei Strings: content: Hallo ist ungültig. Strings müssen in Anführungszeichen stehen: content: "Hallo".
  • Pseudo-Elemente auf void-Elemente: <img>, <input> und <br> können keine ::before/::after Pseudo-Elemente haben, weil sie keinen Inhalt enthalten können.

Browser-Kompatibilität

content wird von allen modernen Browsern vollständig unterstützt, inklusive attr(), counter() und url().

ClientUnterstützungHinweise
ChromeKomplett
FirefoxKomplett
SafariKomplett
EdgeKomplett
OperaKomplett

Email-Kompatibilität

content und Pseudo-Elemente werden in HTML-Emails kaum unterstützt. Verwende stattdessen echte HTML-Elemente.

ClientUnterstützungHinweise
Apple MailKomplett
GmailKeineGmail entfernt ::before und ::after Pseudo-Elemente komplett
OutlookKeineOutlook unterstützt keine Pseudo-Elemente
ThunderbirdKomplett
Yahoo MailKeinePseudo-Elemente werden nicht unterstützt

Verwandte Eigenschaften

Bleib auf dem Laufenden

Erhalte neue Inhalte direkt in dein Postfach

Mit der Anmeldung akzeptierst du unsere Datenschutzerklärung. Du kannst dich jederzeit über den Link in den E-Mails wieder abmelden.

Was erwartet dich?

Neue Artikel & Videos

Wenn ich was Neues veröffentliche, erfährst du's hier zuerst.

Plattform & Kurs-Updates

Neue Kurse, Referenz-Updates und gelegentlich Sonderpreise zum Launch.

Einmal die Woche in deinem Postfach

Kurz, auf den Punkt, kein Spam.