Menu

Variabili CSS: custom properties, :root e var()

Le variabili CSS (custom properties) memorizzano un valore una volta e lo riutilizzano con var(). Impara a dichiararle in :root, a limitarne l'ambito e sovrascriverle, a dare un valore di fallback, a cambiare tema con JavaScript e a evitare la trappola del valore non valido.

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

Dichiarare e usare una variabile CSS

Una variabile CSS, ufficialmente una custom property, è una proprietà il cui nome inizia con --. Dichiarala una volta, di solito su :root così tutta la pagina la eredita, e leggila ovunque con var().

Cambia --brand in #16a34a e il bordo della card e il pulsante cambiano insieme. È proprio questo il punto: un valore, un solo posto dove cambiarlo. Le variabili si combinano anche con calc(), come mostra il padding laterale del pulsante.

Sintassi

:root {
  --name: value;         /* declare */
}

.element {
  color: var(--name);                 /* use */
  color: var(--name, #111827);        /* use, with a fallback */
  padding: calc(var(--space) * 2);    /* compute with it */
}
RegolaDettaglio
NomeInizia con --, poi lettere, cifre, - o _. Distingue maiuscole e minuscole: --Brand non è --brand.
ValoreQuasi qualsiasi cosa: un colore, una lunghezza, una lista, una stringa. Non viene controllato finché non viene usato.
Dove dichiararlaIn qualsiasi regola. :root per le globali, il selettore di un componente per i valori locali.
EreditarietàLe custom properties si ereditano, quindi un figlio vede i valori dei suoi antenati.
Dove funziona var()Solo nei valori delle proprietà, non nei selettori, nei nomi delle proprietà o nelle condizioni @media.

:root seleziona l'elemento <html>. Si usa al posto di html perché ha la specificità di una classe e, per convenzione, indica "impostazioni globali".

Ambito: sovrascrivere una variabile per componente

Dato che le variabili si ereditano, dichiararne di nuovo una su un elemento la cambia per quell'elemento e per tutto ciò che contiene. La regola che usa la variabile resta la stessa.

Le varianti impostano solo una variabile, mai il bordo in sé. Aggiungere una quarta variante è una riga.

Valori di fallback

var(--name, fallback) usa il fallback quando la variabile non è definita sull'elemento né su alcun antenato. Tutto ciò che viene dopo la prima virgola è il fallback, quindi può contenere a sua volta delle virgole (var(--font, Georgia, serif)) e può essere un altro var().

Cambiare le variabili con JavaScript: un selettore di tema

JavaScript può impostare una variabile su qualsiasi elemento con style.setProperty(). Impostala su document.documentElement (l'elemento <html>) e tutta la pagina la segue. Lo schema più comune attiva e disattiva una classe che ridefinisce le variabili:

Rileggi una variabile con getComputedStyle(element).getPropertyValue('--text'). Nota che setProperty scrive uno stile inline su <html>, che batte la classe .dark, quindi dopo aver premuto il secondo pulsante il colore del testo resta fisso in entrambi i temi finché il valore inline non viene rimosso con root.style.removeProperty('--text').

Passare valori dall'HTML

Una variabile in un attributo style è il modo più pulito per passare dati di ogni elemento a un foglio di stile. Il design resta nel CSS; l'HTML fornisce solo un numero.

calc(var(--value) * 1%) trasforma il numero semplice in una percentuale. Le variabili possono anche cambiare dentro una media query: @media (min-width: 900px) { :root { --space: 20px; } } fa crescere sugli schermi larghi ogni spaziatura che legge --space.

La trappola del valore non valido

Il browser non può sapere in anticipo se una variabile contiene un valore valido per la proprietà che la usa. Quando non lo contiene, la proprietà non torna alla dichiarazione precedente nella regola. Diventa non valida al momento del valore calcolato e si comporta come se fosse impostata a unset: le proprietà ereditate prendono il valore del genitore, le altre il loro valore iniziale.

Il testo eredita 16px da <body>, e border-width torna al suo valore iniziale, medium, che i browser disegnano come 3px. Senza variabili, una dichiarazione non valida viene scartata e quella precedente sopravvive; con le variabili, è troppo tardi per farlo. Un fallback non aiuta quando la variabile è definita ma sbagliata: il fallback vale solo per una variabile non definita.

Variabili CSS vs variabili Sass

Variabili CSSVariabili Sass
Sintassi--brand: #2563eb; e var(--brand)$brand: #2563eb;
Quando vengono risolteNel browser, dal vivoIn fase di build, spariscono dall'output
Cambiare per elementoSì, per ereditarietàNo
Cambiare con una classe o una media querySìNo
Cambiare da JavaScriptSìNo
Usare in selettori o condizioni mediaNoSì

Le due lavorano insieme: molti progetti usano Sass per la logica in fase di build e generano variabili CSS per tutto ciò che deve cambiare con il tema.

Errori comuni

  • Dimenticare i due trattini. var(brand) e --brand dichiarata come -brand non funzionano.
  • Usare una variabile in una media query. @media (min-width: var(--bp)) non è valido. Le condizioni media hanno bisogno di valori letterali.
  • Aspettarsi che la dichiarazione precedente sopravviva a una variabile non valida. Non sopravvive; vedi la trappola qui sopra.
  • Combinare le unità nel modo sbagliato. --gap: 10; e poi margin: var(--gap)px non produce 10px. Usa calc(var(--gap) * 1px) o memorizza 10px.
  • Dichiararla sull'elemento sbagliato. Una variabile dichiarata su .card non è visibile ai suoi fratelli né al genitore; dichiara i valori condivisi su :root.

Domande frequenti

Come si dichiara una variabile CSS?

Scrivi dentro una regola una proprietà il cui nome inizia con due trattini, di solito in :root per un valore globale: :root { --brand: #2563eb; }. Leggila ovunque con var(--brand), per esempio color: var(--brand);.

Cos'è :root in CSS?

:root è una pseudo-classe che seleziona l'elemento radice del documento, che in una pagina HTML è <html>. Le variabili dichiarate lì vengono ereditate da ogni elemento. Ha la specificità di una classe, quindi batte un semplice selettore html.

Come si imposta un valore di default per una variabile CSS?

Passa un secondo argomento a var(): color: var(--accent, #2563eb);. Il fallback viene usato quando --accent non è definita sull'elemento o sui suoi antenati. Non viene usato quando la variabile è definita con un valore non valido per la proprietà.

Come si cambia una variabile CSS con JavaScript?

Chiama setProperty sullo style di un elemento: document.documentElement.style.setProperty('--brand', '#16a34a'). Tutte le regole che usano var(--brand) si aggiornano insieme. Leggi il valore corrente con getComputedStyle(el).getPropertyValue('--brand').

Che differenza c'è tra variabili CSS e variabili Sass?

Le variabili Sass vengono sostituite dai loro valori quando il foglio di stile viene compilato, quindi non possono cambiare nel browser. Le variabili CSS vivono nel browser: si ereditano, possono essere diverse per ogni elemento, rispondono a media query e classi, e si possono cambiare da JavaScript.

I nomi delle variabili CSS distinguono maiuscole e minuscole?

Sì. --Brand e --brand sono due variabili diverse, a differenza dei normali nomi di proprietà come color, che non le distinguono.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA