Le CSS Custom Properties, comunemente chiamate variabili CSS, rappresentano uno strumento potente e flessibile per gestire i temi dinamici nelle applicazioni frontend moderne. In questo articolo approfondiremo come sfruttare queste proprietà per creare interfacce adattabili che migliorano l’esperienza utente e semplificano lo sviluppo e la manutenzione del codice.
Introduzione ai CSS Custom Properties
Le Custom Properties sono variabili definite direttamente nel CSS, accessibili e modificabili in runtime tramite CSS o JavaScript. A differenza delle tradizionali variabili pre-processore (come Sass o Less), le proprietà CSS sono dinamiche e ereditabili, il che le rende ideali per gestire cambi di tema e design responsivo.
:root {
--colore-primario: #005f73;
--colore-secondario: #0a9396;
--spaziatura-base: 1rem;
}
body {
background-color: var(--colore-primario);
color: white;
padding: var(--spaziatura-base);
}
In questo esempio, abbiamo definito alcune variabili globali nel selettore :root
. Queste possono essere riutilizzate in tutto il CSS tramite la funzione var(--nome-variabile)
.
Benefici delle variabili CSS
- Dinamismo: le proprietà possono essere cambiate facilmente anche via JavaScript per aggiornare temi o stili in tempo reale.
- Ereditarietà: le variabili sono ereditate dai figli del DOM, facilitando la scrittura di stili modulari.
- Manutenzione semplificata: centralizzare i colori, misure, font consente modifiche immediate e coerenti.
- Compatibilità: supportate da tutti i browser moderni, integrate nel flusso CSS nativo senza tooling aggiuntivo.
Creazione di un tema dinamico
Un tema dinamico ci permette di variare l’aspetto di un sito o applicazione senza modificare la struttura HTML o riscrivere ampie parti di CSS. Tradizionalmente, questo comportava l’uso di classi specifiche o pre-processori. Con le Custom Properties, basta cambiare i valori nel :root
o in un contenitore specifico.
/* Tema chiaro */
:root {
--background: #ffffff;
--text-color: #222222;
--accent-color: #1e90ff;
}
/* Tema scuro */
[data-theme="dark"] {
--background: #121212;
--text-color: #e0e0e0;
--accent-color: #bb86fc;
}
body {
background-color: var(--background);
color: var(--text-color);
}
a {
color: var(--accent-color);
}
Con questa struttura, è sufficiente cambiare l’attributo data-theme
sul tag <html> o <body> per attivare il tema scuro o chiaro.
Switch del tema con JavaScript
const toggleTheme = () => {
const currentTheme = document.documentElement.getAttribute('data-theme');
if (currentTheme === 'dark') {
document.documentElement.setAttribute('data-theme', 'light');
} else {
document.documentElement.setAttribute('data-theme', 'dark');
}
};
const button = document.getElementById('theme-toggle');
button.addEventListener('click', toggleTheme);
Questo snippet mostra come cambiare dinamicamente il tema sfruttando le Custom Properties, migliorando la reattività senza ricaricare o cambiare classi multiple.
Implementazione in un progetto
Il modo migliore per integrare i temi dinamici è creare un set organizzato di variabili nel :root
e gestire i cambi via JavaScript o meccanismi di stato se si usa un framework.
Utilizzando anche le funzioni CSS come min(), max() e clamp(), si può estendere la flessibilità di dimensioni e spaziature in modo responsivo.
:root {
--font-size-base: clamp(1rem, 1vw + 0.5rem, 1.25rem);
}
body {
font-size: var(--font-size-base);
}
Questa tecnica consente che la dimensione del font si adatti fluidamente a diverse larghezze viewport, integrando perfettamente la gestione tematica con il design responsivo, come approfondito nella guida alle media queries.
Esempi pratici
1. Palette colori dinamica per UI
:root {
--colore-primario: #4caf50;
--colore-secondario: #ff9800;
--colore-sfondo: #ffffff;
}
[data-theme='dark'] {
--colore-primario: #81c784;
--colore-secondario: #ffb74d;
--colore-sfondo: #121212;
}
.button {
background-color: var(--colore-primario);
color: var(--colore-sfondo);
border: 2px solid var(--colore-secondario);
padding: 0.5em 1em;
border-radius: 4px;
}
La classe .button
sfrutta le variabili per applicare automaticamente colori diversi a seconda del tema attivo, senza cambiare il CSS o HTML.
2. Spaziatura scalabile
:root {
--spaziatura-base: 16px;
}
.card {
margin: var(--spaziatura-base);
padding: calc(var(--spaziatura-base) * 1.5);
background: var(--colore-sfondo);
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
Modificando --spaziatura-base
in base al tema o breakpoint si adatta anche la distanza e padding coerentemente.
3. Animazioni sincronizzate con tema
Utilizzeremo variabili per definire colori animati correlati al tema, combinati con le animazioni CSS moderne.
:root {
--colore-animazione: #1e90ff;
}
[data-theme='dark'] {
--colore-animazione: #bb86fc;
}
@keyframes pulse {
0%, 100% { box-shadow: 0 0 10px var(--colore-animazione); }
50% { box-shadow: 0 0 20px var(--colore-animazione); }
}
.button-animata {
animation: pulse 2s infinite;
background-color: var(--colore-primario);
border: none;
color: var(--colore-sfondo);
padding: 1rem 2rem;
border-radius: 5px;
}
Applicando la classe .button-animata
, l’interfaccia risulta più viva e in sintonia con il tema attivo.
Conclusioni e risorse
Le CSS Custom Properties sono un elemento cardine nel moderno sviluppo frontend per realizzare temi dinamici, responsive e facilmente gestibili. Integrare queste variabili con strumenti e tecniche avanzate come container queries e funzioni CSS (min/max/clamp()) permette di elevare significativamente la qualità e flessibilità del CSS.
Per una gestione più accessibile e complessa, consigliamo di approfondire tecniche come la gestione accessibile dei tooltip con CSS :has e JS, che spesso si integra con temi e stati dinamici.
In fine, ricordate di adottare un approccio mobile-first e sfruttare i feedback degli utenti per adattare i temi alle preferenze reali, migliorando così la user experience complessiva.