Ir al contenido

IDEAS PRÁCTICAS · ASIMOV INGENIERÍA

Theme Switching con Variables CSS: Guía Completa y Ejemplos Prácticos

Aprende a implementar cambio de temas (claro/oscuro y más) usando variables CSS, con ejemplos, mejores prácticas, comparativas y solución de problemas.

Imagen ilustrativa · Amper / Unsplash.

Table of contents

No titles in the blog post

En este artículo exploramos cómo cambiar entre temas claros y oscuros (y más) usando únicamente variables CSS, con ejemplos prácticos, mejores prácticas y comparativas.

Boceto de un sitio web en papel junto a una pluma naranja
Imagen ilustrativa · Compagnons / Unsplash.

1. ¿Por qué usar variables CSS para temas?

  • Sin JavaScript pesado: el navegador recalcula los valores automáticamente.
  • Compatibilidad nativa con :root y prefers-color-scheme.
  • Facilidad para mantener un único punto de definición de colores.

2. Definición de variables en :root

:root {
  /* Paleta base */
  --color-bg: #ffffff;
  --color-fg: #212529;
  --color-primary: #0d6efd;
  --color-secondary: #6c757d;
}

/* Tema oscuro */
[data-theme="dark"] {
  --color-bg: #121212;
  --color-fg: #e0e0e0;
  --color-primary: #bb86fc;
  --color-secondary: #03dac6;
}

3. Aplicación de variables en componentes

body {
  background-color: var(--color-bg);
  color: var(--color-fg);
}

a {
  color: var(--color-primary);
}

4. Cambiar de tema con JavaScript

const toggle = document.getElementById('theme-toggle');
const root = document.documentElement;

function setTheme(theme) {
  root.setAttribute('data-theme', theme);
  localStorage.setItem('theme', theme);
}

// Detectar preferencia del sistema
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
const savedTheme = localStorage.getItem('theme');
setTheme(savedTheme || (prefersDark ? 'dark' : 'light'));

toggle.addEventListener('click', () => {
  const current = root.getAttribute('data-theme');
  setTheme(current === 'dark' ? 'light' : 'dark');
});

5. UI de conmutación (Bootstrap)

6. Comparativa de características (Light vs Dark)

Modo Claro
  • Fondo claro (#ffffff)
  • Contraste óptimo en pantallas brillantes
  • Menor consumo de energía en monitores LCD
Modo Oscuro
  • Fondo oscuro (#121212)
  • Reduce fatiga visual en entornos con poca luz
  • Beneficia a dispositivos OLED (menos consumo)

7. Comparación con otras técnicas

Técnica Ventajas Desventajas Compatibilidad
Variables CSS + prefers-color-scheme Sin JS, rendimiento nativo, fácil de mantener Requiere fallback para navegadores antiguos Chrome + Edge + Firefox + Safari (≥ 9)
Preprocesadores (Sass, Less) Funciones avanzadas, estructuras complejas Necesita compilación, no permite cambios en tiempo de ejecución Todo navegador (CSS generado)
Bibliotecas JS (styled‑components, Theme UI) Integración con frameworks React/Vue, theming dinámico Mayor bundle size, dependencia extra Depende del framework, navegadores modernos

8. Buenas prácticas y seguridad

  • Persistencia segura: Usa localStorage con nombres de clave únicos y valida el valor antes de aplicarlo.
  • Fallback CSS: Declara valores por defecto en :root para navegadores que no soporten variables.
  • Accesibilidad: Mantén suficiente contraste (≥ 4.5:1) y permite al usuario sobrescribir el tema manualmente.
  • Performance: Cambiar el atributo data-theme en html o body evita re‑flujo amplio.

9. Solución de problemas comunes

  1. Variables no se aplican: Verifica que el selector tenga la misma raíz (:root o [data‑theme]) y que no haya errores de sintaxis.
  2. El tema no persiste tras recargar: Asegúrate de leer localStorage antes de aplicar prefers-color-scheme y de guardar el valor correctamente.
  3. Contraste insuficiente en modo oscuro: Usa herramientas como Contrast Checker para validar colores.

10. Escalabilidad: múltiples temas

/* Tema solarizado */
[data-theme="solarized"] {
  --color-bg: #fdf6e3;
  --color-fg: #657b83;
  --color-primary: #268bd2;
}

/* Tema high‑contrast */
[data-theme="high-contrast"] {
  --color-bg: #000000;
  --color-fg: #ffffff;
  --color-primary: #ffde00;
}

Simplemente agrega botones o un <select> que llame a setTheme() con el nombre del tema.

Conclusión

El uso de variables CSS para el theme switching ofrece una solución ligera, mantenible y altamente compatible. Con los ejemplos y prácticas descritas, puedes implementar desde un simple modo oscuro hasta sistemas de tematización multi‑tema sin depender de librerías externas.