Pseudoelemente
Pseudoelemente ermöglichen es, Teile eines Elements zu stylen (z.B. erster Buchstabe, erste Zeile oder zusätzlicher „virtueller“ Inhalt). Sie sind ideal für visuelle Details – nicht für semantisch relevante Inhalte.
Pseudo: Elemente & Klassen
Pseudoelemente vs. Pseudoklassen
:hoverPseudoklasse: Zustand/Position („wann / welches Element?“)::beforePseudoelement: Teil/Fragment („was für ein Teil?“)
Typische Einsätze: Marker, Icons, Labels, dekorative Elemente.
Merksatz: Pseudoklasse = welches Element? | Pseudoelement = welcher Teil?
Wichtig: :first-child / :nth-child() sind Pseudoklassen (wählen ein Element), nicht Pseudoelemente (stylen ein Fragment).
Syntax
Moderne Schreibweise: Doppelter Doppelpunkt ::.
Das ist ein klarer Hinweis: Es geht um ein Fragment, nicht um einen Zustand.
p::first-letter { ... }
p::before { ... }
Die Pseudoelemente im Überblick
::beforezusätzlicher Inhalt davor::afterzusätzlicher Inhalt danach::first-lettererster Buchstabe::first-lineerste Zeile::selectionmarkierter Text::markerListen-Marker
Praxis Beispiele
1. ::before und ::after
Erzeugen zusätzlichen, virtuellen Inhalt. Dieser Inhalt existiert nicht im HTML. Auch wenn Text ausgegeben wird, ist dieser nicht anklickbar.
::before und ::after können mit CSS gestylt und positioniert werden.
Wichtig: Ohne content wird nichts angezeigt.
Beispiel 1
Ich bin ein Paragraph mit einem ::before Element. (HTML Emojis)
.hint::before {
content: " \2603 ";
font-size: 30px;
color: blue;
}
Beispiel 2
Ich bin ein Paragraph mit einem ::before und einem ::after Element.
.wichtig::before {
content: "\276F";
color: red;
}
.wichtig::after {
content: "\276E";
color: red;
}
Beispiel 3
Ein ::after-Element kann über die content-Eigenschaft praktisch jede Art von Inhalt einfügen (Text, Bilder, Zitate, Attribute, Zähler) und wird dann mit normalen CSS-Eigenschaften gestylt.
.box::after{
content: "";
background: red;
width: 50px;
height: 50px;
position: absolute;
border-radius: 50%;
right: -15px;
top: -15px;
}
Beispiel 4 – Bild-Scrim für Textlesbarkeit
Ein praktischer Anwendungsfall: über einem Bild soll Text lesbar sein, ohne das Bild selbst abzudunkeln. Ein ::after legt einen Farbverlauf über das ganze Bild (position: absolute; inset: 0;), der Titel bekommt z-index: 1, damit er über dem Verlauf bleibt.
Sommerferien
.scrim-card {
position: relative;
}
.scrim-card::after {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(to top, rgba(0,0,0,0.75), transparent 60%);
}
.scrim-card h4 {
position: absolute;
z-index: 1;
left: 1rem;
bottom: 1rem;
color: white;
}
Wichtig: Der Container braucht position: relative, damit sich inset: 0 auf ihn bezieht. Und der Titel braucht z-index: 1 – sonst landet das später erzeugte ::after optisch über dem Text.
Beispiel 5 – content: attr()
Statt Text fix im CSS zu hinterlegen, kann content auch den Wert eines HTML-Attributs auslesen. So bekommt jedes Element automatisch seinen eigenen Text, ohne dass die CSS-Regel für jedes Element einzeln wiederholt werden muss.
<div class="row">
<div class="col s12 m4">
<div class="tile" data-label="Kachel A ansehen"></div>
</div>
<div class="col s12 m4">
<div class="tile" data-label="Kachel B ansehen"></div>
</div>
<div class="col s12 m4">
<div class="tile" data-label="Kachel C ansehen"></div>
</div>
</div>
.tile::after {
content: attr(data-label);
}
.tile:hover::after {
opacity: 1;
}
Wichtig: attr() liefert nur reinen Text, keine Bilder oder berechneten Werte. Für individuellen Text pro Element, ganz ohne JavaScript oder doppelten CSS-Code, ist es aber genau das richtige Werkzeug.
2. ::first-letter
Gestaltet den ersten Buchstaben (typisch: Editorial / Einleitung).
.intro::first-letter {
font-size: 2rem;
color: teal;
}
3. ::first-line
Gestaltet die erste Zeile. Die erste Zeile ist layout-abhängig: Ändert sich die Breite, kann sich auch die erste Zeile ändern.
p.demo::first-line {
font-size: 1.5rem;
color: yellowgreen;
/* text-transform: uppercase; */ /* wird ignoriert */
}
Warum funktioniert text-transform: uppercase hier nicht?::first-line darf nur Eigenschaften verwenden, die den Text nicht verändern. text-transform verändert den Textinhalt selbst und könnte dadurch den Zeilenumbruch verändern. Deshalb wird diese Eigenschaft vom Browser ignoriert.
Wichtig: ::first-line darf das Aussehen ändern – nicht den Text selbst.
4. ::selection
Gestaltet markierten Text (rein visuell, kein DOM-Element).
::selection{
background: indigo;
color: white;
}
5. ::marker
Das CSS-Pseudoelement ::marker wird verwendet, um die Markierungen von Listenelementen zu stylen. Dazu gehören standardmässig die Aufzählungspunkte (Bullets) bei ungeordneten Listen (<ul>) oder die Nummerierung bei geordneten Listen (<ol>).
- HTML-Struktur
- CSS anwenden
- Testen
.steps li::marker {
font-weight: bold;
color: red;
}
Wichtig: ::marker erlaubt nur wenige CSS-Eigenschaften
(z. B. color, font-size, font-weight).
Layout-Eigenschaften wie margin oder position funktionieren nicht
Weitere Pseudoelemente
Neben den "Klassikern" oben gibt es noch weitere Pseudoelemente, die im Alltag nützlich sind:
::placeholderPlatzhaltertext in Formularfeldern::backdropHintergrund hinter<dialog>/ Fullscreen-Elementen::file-selector-buttonButton von<input type="file">::part()Elemente in einem Shadow Tree mit passendempart-Attribut::slotted()Elemente, die in einen<slot>eingefügt wurden
Kurz gesagt
::before/::after= zusätzlicher virtueller Inhalt (mitcontent)::first-letter/::first-line= typografische Fragmente::selection= Markierung stylen:first-child/:nth-child()= Pseudoklassen (Position), nicht Pseudoelemente
Siehe auch Pseudoklassen.