CSS – clamp() – flüssige Größen

Responsive Schriftgrößen und Abstände wurden lange über Media Queries gelöst: bei 768px eine andere Größe, bei 1200px wieder eine andere. Das funktioniert, ist aber aufwendig. Mit clamp() kannst du Größen definieren, die sich kontinuierlich an die Bildschirmbreite anpassen – zwischen einem Minimum und einem Maximum, ganz ohne einen einzigen Breakpoint.

Abschnitte: Die Syntax, Schriftgrößen mit clamp(), Abstände mit clamp(), Den mittleren Wert berechnen, min() und max() als Verwandte.

Die Syntax

clamp() nimmt genau drei Werte entgegen:

element {
  eigenschaft: clamp(minimum, bevorzugt, maximum);
}
  • minimum – der kleinste erlaubte Wert. Darunter geht die Eigenschaft nie, egal wie klein der Bildschirm ist.
  • bevorzugt – der Wert, den der Browser anstrebt. Meist eine vw-Angabe, damit er sich mit der Viewport-Breite skaliert.
  • maximum – der größte erlaubte Wert. Darüber wächst die Eigenschaft nicht weiter.

Der Browser wählt immer den mittleren Wert – es sei denn, er liegt außerhalb der Grenzen. Dann greift das Minimum oder Maximum.

Schriftgrößen mit clamp()

Das klassische Anwendungsbeispiel: Eine Überschrift, die auf kleinen Bildschirmen kompakter und auf großen Bildschirmen größer erscheint – ohne Media Query:

h1 {
  font-size: clamp(2.4rem, 4vw, 4.8rem);
  /* Minimum: 24px | bevorzugt: 4% der Viewport-Breite | Maximum: 48px */
}

p {
  font-size: clamp(1.6rem, 1.5vw + 0.5rem, 2rem);
  /* Fließtext: sanft skalierend zwischen 16px und 20px */
}

Der bevorzugte Wert 4vw bedeutet: 4 % der Viewport-Breite. Bei einem 1200px breiten Bildschirm wären das 48px – genau das Maximum. Bei 600px Breite wären es 24px – genau das Minimum. Dazwischen skaliert der Wert flüssig.

Abstände mit clamp()

clamp() funktioniert mit jeder CSS-Eigenschaft, die numerische Werte akzeptiert – also auch mit padding, margin, gap oder width:

.section {
  padding: clamp(2rem, 5vw, 6rem);
  /* Außenabstand wächst mit dem Viewport – nie unter 20px, nie über 60px */
}

.grid {
  gap: clamp(1.6rem, 3vw, 3.2rem);
  /* Abstand zwischen Grid-Elementen skaliert sanft mit */
}

Damit entfällt das übliche Muster: Standard-Padding setzen, dann per Media Query für größere Bildschirme überschreiben. Ein einziger clamp()-Wert erledigt beides.

Den mittleren Wert berechnen

Der bevorzugte Wert muss nicht eine einfache vw-Angabe sein – du kannst Einheiten kombinieren. Das gibt dir eine lineare Skalierung, die du präzise auf zwei Breakpoints abstimmen kannst:

h2 {
  /*
   * Ziel: bei 400px → 20px, bei 1200px → 36px
   *
   * Steigung: (36 - 20) / (1200 - 400) = 16 / 800 = 0.02 → 2vw
   * Versatz:  20px - 0.02 × 400px = 20 - 8 = 12px → 1.2rem
   */
  font-size: clamp(2rem, 2vw + 1.2rem, 3.6rem);
}

Die Formel klingt aufwendig, lässt sich aber einmal herleiten und dann als Muster verwenden. Online-Rechner wie clamp.font-size.app nehmen dir die Arbeit ab – du gibst Mindest- und Maximalgröße plus die gewünschten Breakpoints ein und bekommst den fertigen clamp()-Wert.

min() und max() als Verwandte

clamp() hat zwei nützliche Geschwister, die du separat einsetzen kannst:

  • min(a, b) – nimmt den kleineren der beiden Werte. Praktisch wenn eine Breite nicht über einen bestimmten Wert hinauswachsen soll: width: min(100%, 60rem)
  • max(a, b) – nimmt den größeren Wert. Nützlich um ein Minimum sicherzustellen: padding: max(2rem, 5vw)
.container {
  width: min(100%, 120rem);
  /* nie breiter als 1200px, aber auf kleinen Screens 100% */
}

.karte {
  padding: max(1.6rem, 3vw);
  /* mindestens 16px, wächst aber mit dem Viewport */
}

/* clamp() ist im Grunde ein max() innerhalb eines min(): */
/* clamp(min, val, max) ≡ max(min, min(val, max)) */

Alle drei Funktionen – clamp(), min() und max() – lassen sich auch verschachteln und mit calc() kombinieren. In der Praxis reicht für die meisten Fälle ein einfaches clamp() mit einem vw-basierten mittleren Wert vollkommen aus.