Schriftgrößen an Breakpoints zu stufen, ergibt eine Seite, die an drei Stellen stimmt und dazwischen springt. Fluide Typografie ersetzt die Stufen durch eine Gerade: Du legst zwei Punkte fest, den Rest rechnet der Browser. Dieser Leitfaden zeigt die Formel dahinter, wie daraus eine ganze Skala im Theme wird, warum die Zeilenlänge wichtiger ist als jede einzelne Größe und wie zwei neue CSS-Werte den Umbruch beruhigen.
- clamp beschreibt eine Gerade zwischen zwei Punkten: eine Größe bei schmaler Breite, eine bei breiter. Dazwischen rechnet der Browser, und die Breakpoint-Präfixe entfallen.
- In den mittleren Wert gehört immer ein rem-Anteil. Ohne ihn hängt die Schrift allein am Fenster und übergeht, was jemand im Browser eingestellt hat.
- Die Zeilenlänge ist die eigentliche Stellschraube. Etwa 65 Zeichen, und die Zeilenhöhe gegenläufig zur Größe.
- text-wrap: balance beruhigt Überschriften, pretty verhindert einzelne Wörter am Absatzende. Wo ein Browser den Wert nicht kennt, bleibt alles beim Alten.
Warum reichen feste Schriftgrößen nicht?
Der übliche Weg sind Stufen an Breakpoints: text-3xl auf dem Handy, ab 768 Pixeln md:text-5xl, ab 1024 dann lg:text-6xl. Das stimmt an genau drei Stellen. Dazwischen passiert nichts, und dann springt die Überschrift um zwanzig Pixel, weil das Fenster um ein Pixel breiter geworden ist.
Der Sprung selbst wäre zu verschmerzen, niemand zieht ein Fenster langsam auf und schaut dabei zu. Ärgerlicher ist die Strecke davor. Zwischen 768 und 1024 Pixeln wächst die Fläche um ein Drittel, die Schrift aber bleibt stehen. Genau dort, auf kleinen Laptops und querliegenden Tablets, wirkt eine Seite dann entweder gedrängt oder verloren.
Fluide Typografie dreht das um. Statt Stufen zu setzen, beschreibst du eine Gerade: So groß ist die Schrift auf dem schmalsten Gerät, so groß auf dem breitesten, dazwischen rechnet der Browser. Aus drei Klassen mit Breakpoint-Präfix wird eine ohne.
Ein Breakpoint ist eine Entscheidung über das Layout. Für eine Schriftgröße ist er selten die richtige Antwort.
Wie funktioniert clamp genau?
clamp nimmt drei Werte: eine Untergrenze, einen Wunschwert und eine Obergrenze. Der Browser nimmt den Wunschwert, solange er zwischen den Grenzen liegt, sonst die nächstgelegene Grenze. Das Interessante steckt in der Mitte.
Der Wunschwert besteht aus zwei Teilen: einem festen Sockel in rem und einer Steigung in vw. Der vw-Anteil macht die Größe von der Fensterbreite abhängig, der rem-Anteil hält sie an der Grundschriftgröße fest. Zusammen ergeben sie eine Gerade zwischen zwei Punkten.
Diese beiden Punkte legst du fest: eine Größe bei einer schmalen Breite, eine bei einer breiten. Daraus folgt die Steigung, aus der Steigung der Sockel. Für 32 Pixel bei 360 und 56 Pixel bei 1280 sind das 24 Pixel Zuwachs auf 920 Pixel Strecke, also 2,61vw, und ein Sockel von 1,41rem.
/* 32px bei 360px Breite, 56px bei 1280px Breite */.ueberschrift { font-size: clamp(2rem, 1.41rem + 2.61vw, 3.5rem); line-height: 1.05;} /* 16px bei 360px, 18px bei 1280px */.absatz { font-size: clamp(1rem, 0.95rem + 0.22vw, 1.125rem); line-height: 1.6;}
Wie wird aus zwei Größen eine ganze Skala?
Eine einzelne Überschrift ist schnell gemacht. Eine Seite braucht aber fünf bis sieben Größen, die zueinander passen. Der übliche Weg ist ein Verhältnis: Jede Stufe ist um denselben Faktor größer als die vorige, zum Beispiel 1,2 auf dem Handy und 1,333 auf dem Desktop.
Dass das Verhältnis oben größer sein darf als unten, ist der eigentliche Gewinn. Auf einem schmalen Bildschirm müssen die Größen nah beieinander liegen, sonst sprengt die Überschrift die Zeile. Auf einem breiten dürfen sie auseinanderlaufen, weil dort Platz für einen deutlichen Unterschied ist. Fluide Werte erledigen diese Spreizung von selbst, wenn du für jede Stufe eigene Endpunkte wählst.
Benenne die Stufen nach ihrer Aufgabe, nicht nach ihrer Größe. display, title, lead, body, small: Diese Namen überleben eine Neugestaltung. text-56 überlebt sie nicht, denn spätestens wenn daraus 48 Pixel werden, steht eine Lüge im Code.
/* app.css */@theme { --text-display: clamp(2.5rem, 1.72rem + 3.48vw, 4.5rem); --text-display--line-height: 1.02; --text-display--letter-spacing: -0.03em; --text-title: clamp(1.75rem, 1.41rem + 1.52vw, 2.625rem); --text-title--line-height: 1.15; --text-lead: clamp(1.125rem, 1.03rem + 0.43vw, 1.375rem); --text-lead--line-height: 1.45;}
Wenige Rollen schlagen viele Werte.
Eine Liste aus Hex-Zahlen ist eine Bestandsaufnahme. Ein System wird daraus erst, wenn jeder Wert eine Aufgabe hat.
Warum ist die Zeilenlänge wichtiger als die Schriftgröße?
Eine fluide Skala löst ein Problem und schafft ein zweites. Wenn die Schrift mit der Breite wächst, wächst auch die Zeile, und ab einer gewissen Länge verliert das Auge beim Rücksprung die nächste. Zwischen sechzig und fünfundsiebzig Zeichen liegt der Bereich, in dem längere Texte ruhig lesbar bleiben.
Die Einheit dafür ist ch. Sie misst die Breite der Ziffer Null, ist also eine Näherung und keine Zählung, aber eine brauchbare: max-width: 65ch trifft in den meisten Schriften ziemlich genau die gewünschte Zeile. In Tailwind heißt dieselbe Größe max-w-prose.
Die Zeilenhöhe gehört dazu, und zwar gegenläufig zur Größe. Große Schrift braucht wenig Durchschuss, weil die Zeilen ohnehin weit auseinanderliegen. Kleine Schrift braucht mehr, sonst klebt der Absatz zusammen. Etwa 1,05 für eine große Überschrift und 1,6 für Fließtext sind ein brauchbarer Ausgangspunkt.
- Fließtext über die volle Breite laufen lassen. Bei 1600 Pixeln sind das gut 160 Zeichen pro Zeile, und nach dem dritten Absatz liest niemand mehr genau.
- Dieselbe Zeilenhöhe für Überschrift und Absatz setzen, meist 1,5. Die Überschrift zerfällt dann in zwei Zeilen, die nichts miteinander zu tun haben.
- Die Untergrenze für Fließtext unter 16 Pixel legen, damit auf dem Handy mehr hineinpasst.
- Die Laufweite aus dem Entwurf für alle Größen übernehmen. Was einer Überschrift guttut, macht Fließtext luftig bis unleserlich.
- Den Textkörper auf etwa 65ch begrenzen und die frei werdende Breite dem Layout geben, nicht der Zeile.
- Die Zeilenhöhe an die Größe koppeln: eng oben, weit unten. In Tailwind v4 steht sie direkt neben dem Wert der Stufe.
- Fließtext bei 16 Pixeln beginnen lassen. Das ist die Voreinstellung der Browser, und sie ist keine Schwäche, sondern eine Absprache.
- Negative Laufweite erst ab der Titelgröße aufwärts, und dort in kleinen Schritten.
Die Schriftgröße entscheidet, wie es aussieht. Die Zeilenlänge entscheidet, ob es gelesen wird.
Wie bricht man Überschriften ruhig um?
Eine fluide Überschrift hat einen unangenehmen Nebeneffekt: Der Umbruch verschiebt sich ständig mit. Mal stehen fünf Wörter oben und eines unten, mal bleibt das letzte Wort allein auf der zweiten Zeile. Kaputt ist daran nichts, aber es sieht nach Zufall aus, und Zufall liest sich unruhig.
Dafür gibt es seit Kurzem zwei CSS-Werte, die genau diese Arbeit übernehmen. text-wrap: balance verteilt die Wörter so auf die Zeilen, dass alle ungefähr gleich lang werden. Das ist für Überschriften gedacht und dort auch wirklich gut. text-wrap: pretty geht andersherum vor: Es lässt den Umbruch weitgehend, wie er ist, verhindert aber, dass am Ende ein einzelnes Wort allein steht.
Beide Werte kosten Rechenzeit, deshalb sind sie begrenzt. balance arbeitet in Chromium bis sechs Zeilen, in Firefox bis zehn, in Safari ohne feste Grenze. Darüber fällt es auf den normalen Umbruch zurück, ohne Fehler und ohne Sprung. Das trifft den Anwendungsfall gut, denn ausbalancieren will man Überschriften mit zwei oder drei Zeilen, keine Absätze.
.ueberschrift { text-wrap: balance;} .absatz { text-wrap: pretty;} /* dasselbe in Tailwind */ <h1 className="text-display text-balance"> <p className="text-lead max-w-prose text-pretty">
Was gehört ins Theme und was ins Markup?
Tailwind v4 hat für diesen Fall alles an Bord. Eine Variable unter --text- im @theme-Block wird zu einer Utility-Klasse, und die zugehörigen Angaben hängst du mit doppeltem Bindestrich daran: --text-title--line-height und --text-title--letter-spacing. Aus drei Zeilen CSS wird eine Klasse.
Im Markup bleibt damit ein Wort übrig. text-title setzt Größe, Zeilenhöhe und Laufweite zugleich, und zwar für jede Fensterbreite. Die Breakpoint-Präfixe verschwinden, weil sie nichts mehr zu tun haben.
Einzelne Ausreißer kommen in eckigen Klammern dazu, aber sparsam. Wenn dieselbe eckige Klammer zum dritten Mal auftaucht, ist sie keine Ausnahme mehr, sondern eine Stufe, und gehört ins Theme. Genau diese Grenze hält eine Skala klein.
/* vorher */<h1 className="text-3xl leading-tight md:text-5xl lg:text-6xl"> /* nachher */ <h1 className="text-display text-balance"> /* und der Absatz darunter */ <p className="text-lead max-w-prose text-pretty">
Welche Fehler kosten am meisten?
Die Formel ist der einfache Teil. Die Stellen, an denen eine fluide Skala kippt, liegen woanders: bei den Grenzen, beim Laden der Schrift und bei der Frage, ob überhaupt das Fenster gemeint war.
- Die Obergrenze fehlt. Ohne dritten Wert wächst die Überschrift auf einem breiten Monitor immer weiter. Bei 2560 Pixeln steht dann eine Zeile im Bild, die niemand mehr als Überschrift liest, sondern als Plakat.
- Die Untergrenze ist zu klein. Auf dem Handy gewinnt man mit 14 statt 16 Pixeln ein paar Zeichen pro Zeile und verliert alle, die das Gerät näher heranhalten müssen. Fließtext beginnt bei 16.
- Die Schrift springt beim Laden. Eine fluide Größe macht den Wechsel von der Ersatzschrift zur echten Schrift sichtbarer, weil die Zeile ohnehin knapp gerechnet ist. font-display: swap und ein size-adjust auf der Ersatzschrift halten den Sprung klein.
- Gemeint war der Kasten, nicht das Fenster. In einer schmalen Seitenspalte hängt die Schriftgröße weiterhin an der Fensterbreite, und eine Karte im Drittel bekommt dieselbe Überschrift wie eine über die volle Breite. Dafür gibt es cqi statt vw innerhalb eines @container.
Der letzte Punkt ist zugleich der Übergang zum nächsten Werkzeug. cqi verhält sich zu einem Container genau so wie vw zum Fenster: ein Prozent der Inline-Breite. Wer Bausteine baut, die an mehreren Stellen landen, tauscht vw gegen cqi und bekommt eine Schrift, die sich am tatsächlich vorhandenen Platz orientiert statt an einer Zahl, die woanders entsteht.
vw fragt das Fenster. cqi fragt den Platz, den der Baustein wirklich hat.




