Menu

CSS clamp(): fließende Schriftgrößen, min() und max()

clamp(MIN, PREFERRED, MAX) liefert den bevorzugten Wert, aber nie weniger als MIN oder mehr als MAX. Hier lernst du, wie damit Schriftgrößen und Abstände ohne Media Queries fließend werden, wie du den mittleren Wert berechnest und wie min() und max() damit zusammenhängen.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Was clamp() macht

clamp(MIN, PREFERRED, MAX) nimmt drei Werte und liefert den mittleren, solange er zwischen den anderen beiden bleibt. Der klassische Einsatz ist eine Überschrift, die mit dem Bildschirm wächst, aber an sinnvollen Grenzen haltmacht, ganz ohne Media Query:

Der bevorzugte Wert ist 1rem + 3vw: 16px plus 3% der Breite. In einer 800px breiten Vorschau sind das 16 + 24 = 40px, was zwischen 24px (1.5rem) und 48px (3rem) liegt, also ist die Überschrift 40px groß. Auf einem 320px-Handy ist der bevorzugte Wert 25,6px. Ab 1067px würde er 48px überschreiten, also bleibt er bei 48px stehen. Ändere die Fenstergröße, um die Zahl sich ändern zu sehen; vw ist hier ein Prozentsatz der Breite des Vorschau-Frames.

Ohne das Fenster zu verkleinern

vw folgt dem Viewport, den du beim Lesen nicht einfach ändern kannst. Container-Query-Einheiten folgen stattdessen einem Container: cqi ist 1% der Breite des Containers. Zieh am Schieberegler, um die Box zu ändern, und dieselbe Art von clamp() reagiert:

Schieb ihn an den Anfang, und der Titel bleibt bei 20px stehen (das MIN). Schieb ihn ans Ende, und er bleibt bei 40px stehen (das MAX). Dazwischen folgt er 0.5rem + 6cqi. Das ist derselbe Mechanismus wie in der vw-Version, nur mit einem kleineren Lineal.

Die drei Argumente

font-size: clamp(1rem, 0.8rem + 1vw, 1.5rem);
/*               MIN   PREFERRED     MAX    */
ArgumentRolleTypische Einheit
MINder kleinste Wert, den es annehmen darfrem
PREFERREDder Wert, der sich mit dem Bildschirm ändertrem + vw (oder cqi)
MAXder größte Wert, den es annehmen darfrem

In jedem Argument funktioniert Rechnen, ohne calc() zu schreiben: 1rem + 2vw passt so, wie es ist. + und - brauchen auf beiden Seiten ein Leerzeichen, sonst ist die ganze Deklaration ungültig.

Ist MIN größer als MAX, gewinnt MIN: clamp(3rem, 5vw, 2rem) ist immer 3rem.

Den mittleren Wert berechnen

Damit eine Schrift von 16px auf einem 320px-Bildschirm auf 24px auf einem 1280px-Bildschirm wächst:

  1. Steigung: (24 − 16) ÷ (1280 − 320) = 8 ÷ 960 = 0,00833, also 0.833vw (vw ist pro 100px).
  2. Startwert: 16px − 0,00833 × 320px = 13,33px, also 0.833rem.
  3. Setz die Grenzen drumherum:
font-size: clamp(1rem, 0.833rem + 0.833vw, 1.5rem);

Bei 320px Breite ergibt das 13,33 + 2,67 = 16px, bei 1280px ergibt es 13,33 + 10,67 = 24px, und außerhalb dieses Bereichs bleibt es an den Grenzen. Online-„Clamp-Rechner“ machen genau diese Rechnung.

min() und max()

clamp() ist eine Kombination aus zwei einfacheren Funktionen:

  • min(a, b) liefert den kleineren Wert und setzt damit eine Obergrenze.
  • max(a, b) liefert den größeren Wert und setzt damit eine Untergrenze.
  • clamp(MIN, VAL, MAX) ist dasselbe wie max(MIN, min(VAL, MAX)).

Die Namen wirken anfangs verdreht: Um „höchstens 600px“ zu sagen, nimmst du min().

In der breiten Vorschau bleibt die erste Karte bei 420px stehen. Im 260px breiten Elternelement ist 100% der kleinere Wert, also ist die zweite Karte 260px breit. max(12px, 3%) gibt der ersten Karte 3% der Breite ihres Elternelements (des body: in einer 800px-Vorschau etwa 23,5px) und der zweiten 12px, weil 3% von 260px (7,8px) unter der Untergrenze liegen.

width: min(100%, 420px) ersetzt das ältere Paar width: 100%; max-width: 420px; in einer einzigen Deklaration.

Mehr als Schriftgrößen: Abstände und Breiten

clamp() funktioniert in jeder Eigenschaft, die eine Länge annimmt. Prozentwerte im mittleren Wert machen eine Komponente fließend relativ zu ihrem Elternelement statt zum Viewport:

Im 300px breiten Elternelement ist die Karte 240px breit (80%) mit 15px Padding (5% von 300px). Im 760px breiten Elternelement wären 80% 608px, also bleibt die Karte bei ihrem Maximum von 520px stehen, und 5% von 760px sind 38px, also bleibt das Padding bei 32px stehen.

Barrierefreiheit: rem im mittleren Wert behalten

Eine Schriftgröße nur aus vw, etwa font-size: 5vw, wächst nicht, wenn der Leser die Standardschriftgröße in den Browsereinstellungen erhöht, und sie wächst auch nicht mit dem Browserzoom, weil Zoomen den Viewport in CSS-Pixeln schmaler macht. Ein Anteil in rem (1rem + 2vw) und Grenzen in rem halten den Text an die Einstellung des Lesers gebunden. Die Seite zu Einheiten erklärt rem und vw im Detail.

Häufige Fehler

  • min() für ein Minimum nehmen. min() wählt den kleineren Wert, und das ist eine Obergrenze. Für „mindestens 12px“ nimmst du max(12px, ...).
  • Keine Leerzeichen um + oder -. clamp(1rem, 1rem+2vw, 3rem) ist ungültig, und die Eigenschaft fällt auf ihren vorherigen Wert zurück.
  • Nur vw in der Mitte. Der Text ignoriert dann die Schriftgrößeneinstellung des Lesers. Ergänze einen rem-Anteil.
  • MIN größer als MAX. Das Ergebnis ist immer MIN, was selten gemeint ist.
  • Grenzen in px für Schriftgrößen. Sie deckeln den Text auch für Leser, die ihn größer brauchen. Nimm rem.

Häufig gestellte Fragen

Was macht clamp() in CSS?

clamp(MIN, PREFERRED, MAX) verwendet den bevorzugten Wert, solange er zwischen den beiden Grenzen liegt, und sonst die nächstgelegene Grenze. font-size: clamp(1rem, 4vw, 2rem) folgt 4% der Viewport-Breite, geht aber nie unter 1rem oder über 2rem.

Wie mache ich mit clamp eine responsive Schriftgröße?

Setz einen viewportbasierten Wert in die Mitte und feste Grenzen an die Seiten, und misch rem in den mittleren Wert, damit der Text weiterhin der Schriftgrößeneinstellung des Lesers folgt: font-size: clamp(1.5rem, 1rem + 2vw, 3rem);.

Was passiert, wenn in clamp() das Minimum größer als das Maximum ist?

Das Minimum gewinnt. clamp(3rem, 5vw, 2rem) ergibt immer 3rem, weil clamp() das Minimum nach dem Maximum anwendet.

Was ist der Unterschied zwischen min() und max() in CSS?

min() liefert den kleinsten seiner Werte und wirkt damit als Obergrenze: width: min(100%, 600px) wird nie breiter als 600px. max() liefert den größten und wirkt damit als Untergrenze: font-size: max(1rem, 2vw) wird nie kleiner als 1rem.

Wird clamp() von allen Browsern unterstützt?

Ja, clamp(), min() und max() funktionieren in allen aktuellen Versionen von Chrome, Edge, Firefox und Safari und lassen sich in jeder Eigenschaft verwenden, die eine Länge, Zahl, einen Prozentwert oder einen Winkel annimmt.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S