Menu

calc() in CSS: unità miste, regole di sintassi ed esempi

calc() ti permette di fare calcoli in CSS e di mescolare unità, come il 100% meno una barra laterale fissa di 200px. Impara le regole di sintassi (gli spazi contano), calc() con le variabili CSS, i layout tipici che risolve e perché un calc() non valido viene ignorato senza avvisi.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Cosa fa calc()

calc() fa aritmetica dentro un valore CSS, e può mescolare unità che ricevono una dimensione solo al momento del layout. Il caso classico è "tutta la larghezza meno una barra laterale fissa":

100% si conosce solo quando la pagina è stata impaginata, e 180px è fisso, quindi nessuna unità da sola potrebbe esprimerlo. calc() fa il conto: in un'anteprima larga 800px la riga misura 784px e la colonna principale riceve 604px, e la riga sotto il layout stampa i numeri reali. Oggi flexbox o grid farebbero questo layout senza calcoli, ma la stessa sottrazione ricorre ovunque: un'altezza meno un header, una larghezza meno uno spazio.

Le regole di sintassi

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 */
RegolaValidoNon valido
Spazi attorno a + e -calc(100% - 20px)calc(100%-20px)
*: almeno un lato è un numero semplicecalc(2 * 1rem)calc(2px * 3px)
/: dividi una lunghezza per un numero semplicecalc(100% / 3)width: calc(300px / 3px) (non è una lunghezza)
Le unità devono essere compatibilicalc(1rem + 10px)calc(1rem + 2s)

La regola degli spazi esiste perché 100% -20px verrebbe letto come due valori separati, il secondo negativo. Quando un calc() non è valido, l'intera dichiarazione viene scartata e l'elemento mantiene il valore che aveva dalle regole precedenti.

Prova un'espressione

Scrivi un'espressione qualsiasi per la larghezza del box. Il browser ti dice se è valida e a quale larghezza corrisponde:

Prova 100%-200px (non valido, senza spazi), 100% / 3, 50% + 4rem, 2 * 120px, 200px * 2px (non valido) e (100% - 40px) / 2.

calc() con le variabili CSS

Le variabili e calc() vanno d'accordo: salvi un valore di base una volta sola e ricavi il resto da lì. Una variabile senza unità diventa una lunghezza quando la moltiplichi per un'unità:

Cambia --space in 12px o --cols in 4 e ogni valore derivato si adegua. La pagina sulle variabili CSS spiega come dichiararle e il loro ambito.

Usi comuni

Esigenzacalc()
Riempire lo spazio accanto a un elemento fissowidth: calc(100% - 240px)
Sezione sotto un header fissomin-height: calc(100vh - 64px)
Metà della larghezza meno metà dello spaziowidth: calc(50% - 8px)
Centrare un box di 100px in posizione assolutaleft: calc(50% - 50px)
Dimensione del font che cresce un po' con lo schermofont-size: calc(1rem + 0.5vw)
Trasformare una variabile numerica in una lunghezzacalc(var(--n) * 1px)
L'opposto di una variabilecalc(var(--space) * -1)

Per un valore che deve restare entro dei limiti, usa clamp(), che accetta gli stessi calcoli nei suoi argomenti senza scrivere calc().

Dove funziona calc()

Ovunque sia ammessa una lunghezza, una percentuale, un numero, un angolo o un tempo: width, margin, padding, top, font-size, line-height, le dimensioni delle tracce della griglia, transition-delay e gli angoli dentro transform. Si può annidare, e un calc() annidato equivale a semplici parentesi.

Gli angoli sono un buon esempio. Ogni tacca qui sotto ha il suo --i (da 0 a 11), e una sola regola lo trasforma in un angolo con calc(var(--i) * 30deg):

La tacca 3 riceve rotate(90deg), che Chrome riporta come la matrice matrix(0, 1, -1, 0, 0, 0): un quarto di giro. left: calc(50% - 2px) centra ogni tacca sottraendo metà della sua larghezza di 4px.

Errori comuni

  • Nessuno spazio attorno a - o +. calc(100%-20px) non è valido e viene ignorato.
  • Moltiplicare due lunghezze. calc(10px * 2px) non ha significato in CSS. Un lato di * deve essere un numero semplice.
  • Usare calc() per un'altezza in percentuale senza altezza del genitore. calc(100% - 20px) per height richiede un genitore con un'altezza impostata, proprio come height: 100%.
  • Usare calc() dove basterebbero flexbox o grid. width: calc(33.333% - 10px) per le colonne è fragile; display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px non richiede calcoli.
  • Aspettarsi un messaggio di errore. Il browser non avvisa di un calc() non valido. Controlla l'elemento negli strumenti per sviluppatori: una dichiarazione non valida compare barrata.

Domande frequenti

Cosa fa calc() in CSS?

Calcola un valore da un'espressione con +, -, * e /, e può mescolare unità che il browser conosce solo al momento del layout. width: calc(100% - 200px) è l'intera larghezza del genitore meno 200px, qualunque sia la larghezza del genitore.

Perché il mio calc() non funziona?

La causa più comune sono gli spazi mancanti: + e - devono avere uno spazio su entrambi i lati, quindi calc(100%-20px) non è valido. Altre cause sono moltiplicare due lunghezze (10px * 2px) o dividere per una lunghezza, che non dà una lunghezza. Un calc() non valido rende non valida l'intera dichiarazione, quindi il browser la ignora.

Posso usare le variabili CSS in calc()?

Sì. calc(var(--gap) * 2) raddoppia una variabile, e calc(var(--columns) * 1px) trasforma un numero senza unità in pixel. Prima viene sostituito il valore della variabile, poi si fa il calcolo.

Servono gli spazi attorno a * e / in calc()?

No. Solo + e - richiedono gli spazi, perché senza -20px verrebbe letto come un numero negativo. Gli spazi attorno a * e / sono facoltativi, ma metterli ovunque è la regola più facile da ricordare.

Che differenza c'è tra calc() e clamp()?

calc() calcola un valore da un'espressione. clamp(MIN, VAL, MAX) mantiene un valore tra due limiti. Si combinano: ogni argomento di clamp() può già contenere calcoli come quelli di calc, per esempio clamp(1rem, 1rem + 2vw, 3rem).

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA