clamp()

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2020.

Die clamp() CSS Funktion begrenzt einen Mittelwert innerhalb eines Bereichs von Werten zwischen einer definierten minimalen und einer maximalen Grenze. Die Funktion nimmt drei Parameter entgegen: einen minimalen Wert, einen bevorzugten Wert und einen maximal zulässigen Wert.

Probieren Sie es aus

Beachten Sie, dass die Verwendung von clamp() für Schriftgrößen, wie in diesen Beispielen, es Ihnen ermöglicht, eine Schriftgröße festzulegen, die mit der Größe des Viewports wächst, aber nicht unter eine minimale Schriftgröße oder über eine maximale Schriftgröße hinausgeht. Es hat denselben Effekt wie der Code in Fluid Typography, aber alles in einer Zeile und ohne die Verwendung von Medienabfragen.

Syntax

css
/* Static values */
width: clamp(200px, 40%, 400px);
width: clamp(20rem, 30vw, 70rem);
width: clamp(10vw, 20em, 100vw);

/* Calculated values */
width: clamp(min(10vw, 20rem), 300px, max(90vw, 55rem));
width: clamp(100px, calc(30% / 2rem + 10px), 900px);

Parameter

Die clamp(min, val, max) Funktion akzeptiert drei durch Kommas getrennte Ausdrücke als Parameter.

min

Der minimale Wert ist der kleinste (am negativsten) Wert. Dies ist die Untergrenze im Bereich der zulässigen Werte. Wenn der bevorzugte Wert kleiner als dieser Wert ist, wird der minimale Wert verwendet.

val

Der bevorzugte Wert ist der Ausdruck, dessen Wert verwendet wird, solange das Ergebnis zwischen den minimalen und maximalen Werten liegt.

max

Der maximale Wert ist der größte (am positivsten) Ausdruckswert, dem der Wert der Eigenschaft zugewiesen wird, wenn der bevorzugte Wert größer als diese Obergrenze ist.

Die Ausdrücke können mathematische Funktionen sein (siehe calc() für weitere Informationen), Literale, andere Ausdrücke, die zu einem gültigen Argumenttyp auswerten (wie <length>), oder verschachtelte min() und max() Funktionen. Für mathematische Ausdrücke können Sie Addition, Subtraktion, Multiplikation und Division verwenden, ohne die calc() Funktion selbst zu nutzen. Sie können auch Klammern verwenden, um die Reihenfolge der Berechnungen festzulegen, wenn nötig.

Sie können verschiedene Einheiten für jeden Wert in Ihren Ausdrücken und verschiedene Einheiten in jeder mathematischen Funktion verwenden, die irgendeines der Argumente bildet.

Behalten Sie die folgenden Aspekte im Hinterkopf, während Sie mit der Funktion arbeiten:

  • Mathematische Ausdrücke, die Prozentsätze für Breiten und Höhen bei Tabellenzellen, Tabellenspalten, Tabellenspalten-Gruppen, Tabellenzeilen, Tabellenzeilen-Gruppen in sowohl automatischen als auch festen Layout-Tabellen betreffen, können so behandelt werden, als ob auto angegeben worden wäre.
  • Es ist erlaubt, max() und min() Funktionen als Ausdruckswerte zu verschachteln, wobei die inneren als einfache Klammern betrachtet werden. Die Ausdrücke sind vollständige mathematische Ausdrücke, sodass Sie direkte Addition, Subtraktion, Multiplikation und Division verwenden können, ohne die calc() Funktion selbst zu nutzen.
  • Der Ausdruck kann Werte enthalten, die die Operatoren Addition ( + ), Subtraktion ( - ), Multiplikation ( * ) und Division ( / ) kombinieren, unter Verwendung von Standardoperator-Prioritätsregeln. Stellen Sie sicher, dass auf jeder Seite der + und - Operanden ein Leerzeichen vorhanden ist. Die Operanden im Ausdruck können jedem <length> Syntaxwert entsprechen. Sie können verschiedene Einheiten für jeden Wert in Ihrem Ausdruck verwenden. Sie können auch Klammern verwenden, um die Reihenfolge der Berechnungen festzulegen, wenn nötig.
  • Oftmals möchten Sie min() und max() innerhalb einer clamp() Funktion verwenden.

Rückgabewert

clamp(MIN, VAL, MAX) wird aufgelöst als max(MIN, min(VAL, MAX)).

Basierend auf den bereitgestellten Parametern gibt die Funktion <length>, <frequency>, <angle>, <time>, <percentage>, <number>, oder <integer> zurück.

Formale Syntax

<clamp()> = 
clamp( [ <calc-sum> | none ] , <calc-sum> , [ <calc-sum> | none ] )

<calc-sum> =
<calc-product> [ [ '+' | '-' ] <calc-product> ]*

<calc-product> =
<calc-value> [ [ '*' | '/' ] <calc-value> ]*

<calc-value> =
<number> |
<dimension> |
<percentage> |
<calc-keyword> |
( <calc-sum> )

<calc-keyword> =
e |
pi |
infinity |
-infinity |
NaN

Beispiele

Vergleich von min(), max() und clamp()

In diesem Beispiel haben wir eine Webseite, die min(), max(), und clamp() verwendet, um Größen responsiv festzulegen.

Das Beispiel passt die Größen von Seitenelementen auf drei Arten an:

  • die Längen der Textzeilen
  • die Schriftgröße von Absätzen
  • die Schriftgröße von Überschriften

In allen drei Fällen verwendet die Seite eine Kombination von viewport-relativen Einheiten (vw und <percentage>), um eine Größe festzulegen, die sich mit der Viewport-Breite ändert, und einen Wert, der nicht viewport-relativ ist (rem und px), um Mindest- und/oder Höchstgrößen zu implementieren.

Das Beispiel finden Sie unter https://mdn.github.io/css-examples/min-max-clamp/. Öffnen Sie es in einem neuen Fenster und versuchen Sie, die Fensterbreite anzupassen.

Die Zeilenlänge (gesteuert durch die width des <body> Elements) wird zunehmen, wenn die Fensterbreite zunimmt, aber nur bis zu einem bestimmten Punkt (1000px), und über diesen Punkt hinaus wird sie nicht weiter zunehmen. Wir verwenden min(), um eine maximale Zeilenlänge festzulegen: sie kann unter 1000px gehen, aber nicht darüber hinaus. Das ist hilfreich, weil lange Zeilen schwer zu lesen sind, daher möchten wir oft begrenzen, wie lang eine Zeile sein kann. Um dies zu erreichen, verwenden wir min(1000px, calc(70% + 100px)): wenn das Ergebnis der prozentualen Berechnung über 1000px geht, wechseln wir zu dem festen Wert 1000px.

Die Größe des Absatztexts, gesteuert durch die font-size des <p> Elements, verringert sich, wenn das Fenster schmaler wird, aber nur bis zu einem bestimmten Punkt, und über diesen Punkt hinaus (der Punkt, an dem 1.2vw weniger als 1.2rem ist) wird es nicht kleiner: es bleibt bei 1.2rem. Wir verwenden max(), um eine minimale Schriftgröße festzulegen: die Schrift kann über 1.2rem wachsen, wird aber nie darunter fallen. Das ist hilfreich, weil wirklich kleiner Text schwer zu lesen ist. Um dies zu erreichen, verwenden wir max(1.2rem, 1.2vw). Das bedeutet, dass die font-size auf 1.2rem gesetzt wird, es sei denn, der berechnete Wert von 1.2vw ist größer als der von 1.2rem, in diesem Fall wird sie stattdessen auf 1.2vw gesetzt.

Die Größe des Überschriftentexts, gesteuert durch die font-size des <h1> Elements, hat einen viewport-relativen Wert mit sowohl einer maximalen als auch einer minimalen Schwelle. Um dies zu erreichen, verwenden wir clamp(1.8rem, 2.5vw, 2.8rem). Der viewport-relative Wert ist 2.5vw, aber er ist zwischen 1.8rem und 2.8rem begrenzt, also:

  • wenn der berechnete Wert von 2.5vw weniger als 1.8rem ist, wird 1.8rem verwendet
  • wenn der berechnete Wert von 2.5vw größer als 2.8rem ist, wird 2.8rem verwendet.

Dies verhindert, dass der Überschriftentext in einem sehr schmalen Fenster zu klein oder in einem sehr breiten Fenster zu groß wird.

HTML

html
<h1>Simple responsive test</h1>
<p>
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. In orci orci,
  eleifend id risus nec, mattis rutrum velit. Suspendisse fringilla egestas erat
  eu convallis. Phasellus eu velit ut magna dapibus elementum cursus at ligula.
  Ut tempus varius nibh, nec auctor sapien iaculis sit amet. Fusce iaculis,
  libero quis elementum viverra, nulla ante accumsan lectus, sit amet convallis
  lacus ipsum vel est. Curabitur et urna non est consectetur pulvinar vel id
  risus. Ut vestibulum, sem in semper aliquet, felis arcu euismod sapien, ac
  imperdiet massa nisl quis sem. Vestibulum ac elementum felis, in tempor velit.
  Pellentesque purus ex, mattis at ornare quis, porta condimentum mi. Donec
  vestibulum ligula vel nulla blandit, quis euismod nulla vestibulum.
  Suspendisse potenti. Nunc neque mauris, tempor sed facilisis at, ultrices eget
  nulla. Pellentesque convallis ante nec augue porttitor, id tempus ante luctus.
</p>

<p>
  Integer rutrum sollicitudin tellus, quis cursus nulla scelerisque nec. Nunc eu
  facilisis lorem. Maecenas faucibus sapien eleifend, semper tellus at, pharetra
  quam. Cras feugiat vulputate tortor at rhoncus. Class aptent taciti sociosqu
  ad litora torquent per conubia nostra, per inceptos himenaeos. Nam non felis
  quis sem lobortis sodales vel id libero. Phasellus sit amet placerat lorem.
</p>

CSS

css
html {
  font-family: sans-serif;
}

body {
  margin: 0 auto;
  width: min(1000px, calc(70% + 100px));
}

h1 {
  letter-spacing: 2px;
  font-size: clamp(1.8rem, 2.5vw, 2.8rem);
}

p {
  line-height: 1.5;
  font-size: max(1.2rem, 1.2vw);
}

Spezifikationen

Specification
CSS Values and Units Module Level 4
# calc-notation

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch