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 content | Ergebnis |
|---|---|
"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-quote | Anführungszeichen für die Sprache des Elements |
none oder normal | Kein 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ügecontent: ""hinzu. - Einem Inline-Pseudoelement eine Größe geben.
widthundheightbewirken nichts, bis dudisplay: block,inline-blockoderposition: absolutesetzt. - Falsche Reihenfolge mit einem Zustand.
a:hover::afterfunktioniert;a::after:hovernicht. - 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
contentlä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.