back to top

Utilizzare i CSS Custom Properties per Temi Dinamici

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.

Condividi

Articoli Recenti

Categorie popolari