Menu

CSS calc(): Einheiten mischen, Syntaxregeln und Beispiele

Mit calc() rechnest du in CSS und mischst Einheiten, etwa 100% minus eine feste 200px-Seitenleiste. Hier lernst du die Syntaxregeln (die Leerzeichen zählen), calc() mit CSS-Variablen, typische Layouts, die es löst, und warum ein ungültiges calc() stillschweigend ignoriert wird.

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

Was calc() macht

calc() rechnet innerhalb eines CSS-Werts und kann Einheiten mischen, die erst beim Layout eine Größe bekommen. Der klassische Fall ist „die volle Breite minus eine feste Seitenleiste“:

100% steht erst fest, wenn die Seite angeordnet ist, und 180px ist fest, also könnte keine einzelne Einheit das ausdrücken. calc() rechnet es aus: In einer 800px breiten Vorschau ist die Zeile 784px breit, und die Hauptspalte bekommt 604px; die Zeile unter dem Layout gibt die echten Zahlen aus. Heute würden Flexbox oder Grid dieses Layout ohne Rechnen erledigen, aber dieselbe Subtraktion taucht trotzdem überall auf: eine Höhe minus ein Header, eine Breite minus eine Lücke.

Die Syntaxregeln

width: calc(100% - 2rem);          /* + and - need spaces on both sides */
width: calc(100% / 3);             /* divide by a plain number */
margin: calc(var(--space) * 2);    /* multiply by a plain number */
height: calc(100vh - (64px + 1rem)); /* parentheses group */
RegelGültigUngültig
Leerzeichen um + und -calc(100% - 20px)calc(100%-20px)
*: mindestens eine Seite ist eine reine Zahlcalc(2 * 1rem)calc(2px * 3px)
/: eine Länge durch eine reine Zahl teilencalc(100% / 3)width: calc(300px / 3px) (keine Länge)
Einheiten müssen zusammenpassencalc(1rem + 10px)calc(1rem + 2s)

Die Leerzeichenregel gibt es, weil 100% -20px als zwei getrennte Werte gelesen würde, der zweite davon eine negative Zahl. Ist ein calc() ungültig, wird die ganze Deklaration verworfen, und das Element behält den Wert, den es aus früheren Regeln hatte.

Probier einen Ausdruck aus

Tipp einen beliebigen Ausdruck für die Breite der Box ein. Der Browser meldet, ob er gültig ist und welche Breite herauskommt:

Probier 100%-200px (ungültig, keine Leerzeichen), 100% / 3, 50% + 4rem, 2 * 120px, 200px * 2px (ungültig) und (100% - 40px) / 2.

calc() mit CSS-Variablen

Variablen und calc() gehören zusammen: Speichere einen Basiswert einmal und leite den Rest davon ab. Eine Variable ohne Einheit wird zu einer Länge, wenn du sie mit einer Einheit multiplizierst:

Ändere --space in 12px oder --cols in 4, und jeder abgeleitete Wert folgt. Die Seite zu CSS Variablen behandelt Deklaration und Geltungsbereich.

Typische Einsätze

Bedarfcalc()
Den Platz neben einem festen Element füllenwidth: calc(100% - 240px)
Abschnitt unter einem fixierten Headermin-height: calc(100vh - 64px)
Halbe Breite minus halbe Lückewidth: calc(50% - 8px)
Eine absolut positionierte 100px-Box zentrierenleft: calc(50% - 50px)
Schriftgröße, die etwas mit dem Bildschirm wächstfont-size: calc(1rem + 0.5vw)
Eine Zahlenvariable in eine Länge umwandelncalc(var(--n) * 1px)
Negativer Wert einer Variablecalc(var(--space) * -1)

Für einen Wert, der zwischen Grenzen bleiben muss, nimm clamp(), das dieselben Rechnungen in seinen Argumenten ohne calc() akzeptiert.

Wo calc() funktioniert

Überall, wo eine Länge, ein Prozentwert, eine Zahl, ein Winkel oder eine Zeit erlaubt ist: width, margin, padding, top, font-size, line-height, Spurgrößen im Grid, transition-delay und Winkel in transform. Es lässt sich verschachteln, und ein verschachteltes calc() ist dasselbe wie einfache Klammern.

Winkel sind ein gutes Beispiel. Jeder Strich unten hat sein eigenes --i (0 bis 11), und eine einzige Regel macht daraus mit calc(var(--i) * 30deg) einen Winkel:

Strich 3 bekommt rotate(90deg), was Chrome als Matrix matrix(0, 1, -1, 0, 0, 0) meldet: eine Vierteldrehung. left: calc(50% - 2px) zentriert jeden Strich, indem es die Hälfte seiner eigenen Breite von 4px abzieht.

Häufige Fehler

  • Keine Leerzeichen um - oder +. calc(100%-20px) ist ungültig und wird ignoriert.
  • Zwei Längen multiplizieren. calc(10px * 2px) hat in CSS keine Bedeutung. Eine Seite von * muss eine reine Zahl sein.
  • calc() für eine Prozenthöhe ohne Höhe am Elternelement. calc(100% - 20px) für height braucht ein Elternelement mit festgelegter Höhe, genau wie height: 100%.
  • calc() nutzen, wo Flexbox oder Grid reichen würden. width: calc(33.333% - 10px) für Spalten ist fragil; display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px braucht keine Rechnung.
  • Eine Fehlermeldung erwarten. Der Browser warnt nicht vor einem ungültigen calc(). Prüf das Element in den Entwicklertools: Eine ungültige Deklaration wird durchgestrichen angezeigt.

Häufig gestellte Fragen

Was macht calc() in CSS?

Es berechnet einen Wert aus einem Ausdruck mit +, -, * und / und kann Einheiten mischen, die der Browser erst beim Layout kennt. width: calc(100% - 200px) ist die volle Breite des Elternelements minus 200px, egal wie breit das Elternelement ist.

Warum funktioniert mein calc() nicht?

Die häufigste Ursache sind fehlende Leerzeichen: + und - brauchen auf beiden Seiten Leerraum, also ist calc(100%-20px) ungültig. Weitere Ursachen sind das Multiplizieren zweier Längen (10px * 2px) oder das Dividieren durch eine Länge, was keine Länge ergibt. Ein ungültiges calc() macht die ganze Deklaration ungültig, und der Browser ignoriert sie.

Kann ich CSS-Variablen in calc() verwenden?

Ja. calc(var(--gap) * 2) verdoppelt eine Variable, und calc(var(--columns) * 1px) macht aus einer Zahl ohne Einheit Pixel. Zuerst wird der Wert der Variable eingesetzt, dann wird gerechnet.

Brauche ich in calc() Leerzeichen um * und /?

Nein. Nur + und - brauchen Leerzeichen, weil -20px ohne sie als negative Zahl gelesen würde. Leerzeichen um * und / sind optional, aber sie überall zu schreiben, ist die Regel, die du dir am leichtesten merkst.

Was ist der Unterschied zwischen calc() und clamp()?

calc() berechnet einen Wert aus einem Ausdruck. clamp(MIN, VAL, MAX) hält einen Wert zwischen zwei Grenzen. Beide lassen sich kombinieren: Jedes Argument von clamp() kann schon Rechnungen wie in calc() enthalten, etwa clamp(1rem, 1rem + 2vw, 3rem).

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S