Schöne Zeilenumbrüche in CSS – text-wrap balance und pretty
Eine Überschrift, bei der ein einzelnes Wort einsam in der letzten Zeile hängt, sieht unruhig aus. Mit text-wrap balance und pretty überlässt du dem Browser das saubere Umbrechen – ohne manuelle <br> und ohne JavaScript.
Kennst du das: Eine Überschrift bricht so um, dass in der letzten Zeile nur ein einziges Wort steht? Oder ein Absatz endet mit einem einsamen „Wort." ganz allein in der Zeile? Das nennt man Schusterjunge bzw. Hurenkind – und es lässt sonst saubere Typografie unruhig wirken. Früher habe ich das mit von Hand gesetzten <br> geflickt. Die Umbrüche saßen dann aber nur bei genau einer Bildschirmbreite richtig. Heute erledigt das der Browser – mit text-wrap.
Für Überschriften: balance
text-wrap: balance verteilt die Wörter so auf die Zeilen, dass alle etwa gleich lang sind. Perfekt für Überschriften, Buttons und kurze Textblöcke:
h1, h2, h3,
.karte-titel,
blockquote {
text-wrap: balance;
}Der Browser rechnet dafür ein paar Umbruch-Varianten durch. Deshalb wirkt balance nur auf kurze Texte (die Engines begrenzen es meist auf wenige Zeilen) – genau da, wo man es braucht. Für einen langen Fließtext wäre es Verschwendung.
Für Fließtext: pretty
Bei längeren Absätzen willst du kein Gleichgewicht, sondern nur keine einsame letzte Zeile. Das macht text-wrap: pretty:
p, li {
text-wrap: pretty;
}pretty bricht wie gewohnt um, achtet aber am Ende darauf, dass nicht ein Wort allein übrig bleibt. Der Effekt ist dezent, aber ein gut gesetzter Absatz liest sich spürbar ruhiger.
Sicher einsetzen
Beides ist ein reiner Komfort-Gewinn: Wo ein älterer Browser balance oder pretty nicht kennt, bricht der Text einfach normal um – nichts geht kaputt. Du brauchst also keinen Fallback. Ich lege es global an und gut ist:
:where(h1, h2, h3, figcaption) { text-wrap: balance; }
:where(p, li, dd) { text-wrap: pretty; }Das :where() hält die Spezifität bei null, sodass du es an einzelnen Stellen mühelos wieder überschreiben kannst.
Ich setze das inzwischen in jedem Website-Projekt ein – es ist einer dieser Handgriffe, die niemandem auffallen und trotzdem den Unterschied zwischen „ganz ok" und „wirkt professionell" ausmachen. Wenn du eine Website mit sauberer Typografie und eigenem CMS möchtest, schreib mir auf bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
:is() und :where() – kürzere Selektoren, und einer davon wiegt nichts
Drei fast gleiche Selektoren untereinander, nur weil die Überschrift mal h2 und mal h3 heißt? :is() fasst das zusammen. Und :where() macht dasselbe, ohne die Spezifität hochzutreiben – der Unterschied ist der ganze Trick.
content-visibility – lange Seiten rendern, ohne dass der Browser alles auf einmal baut
Bei sehr langen Seiten rechnet der Browser Layout und Malen für jeden Abschnitt – auch für die, die 8.000 Pixel weiter unten liegen. Eine CSS-Eigenschaft verschiebt diese Arbeit auf den Moment, in dem sie gebraucht wird.
color-mix() – Hover- und Dark-Mode-Farben ausrechnen lassen, statt sie zu pflegen
Für jede Markenfarbe eine hellere, eine dunklere und eine transparente Variante von Hand zu pflegen, ist Fleißarbeit mit Fehlerquote. color-mix() mischt sie im Browser – aus genau einer Quellfarbe.