DevHub Global Solutions | Educativo

Diseño dark mode con prefers-color-scheme

Implementa un dark mode perfecto que respete las preferencias del sistema y ofrezca control al usuario. Esta guía cubre desde técnicas básicas hasta patrones avanzados para una transición suave entre modos.
Diseño dark mode con prefers-color-scheme
Comparativa entre light mode y dark mode en una aplicación web

Implementación Básica

Usando prefers-color-scheme y variables CSS:

:root {
  /* Light theme default */
  --bg-primary: #ffffff;
  --text-primary: #333333;
  --accent: #3498db;
}

@media (prefers-color-scheme: dark) {
  :root {
    /* Dark theme */
    --bg-primary: #121212;
    --text-primary: #f5f5f5;
    --accent: #1abc9c;
  }
}

body {
  background: var(--bg-primary);
  color: var(--text-primary);
  transition: background 0.3s, color 0.3s;
}

Usa variables CSS para mantener consistencia y facilitar cambios

Toggle Controlado por Usuario

Permitir cambiar modo independientemente del sistema:

// Almacenar preferencia
function setTheme(theme) {
  document.documentElement.setAttribute('data-theme', theme);
  localStorage.setItem('theme', theme);
}

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

// Toggle
document.getElementById('theme-toggle').addEventListener('click', () => {
  const currentTheme = document.documentElement.getAttribute('data-theme');
  setTheme(currentTheme === 'dark' ? 'light' : 'dark');
});

Técnicas Avanzadas

Mejorando la experiencia de dark mode:

Colores adaptativos

Ajustar saturaciones y contrastes

Imágenes

filter: brightness(0.8) para dark mode

SVG/Iconos

currentColor para iconos adaptativos

Transiciones

Suavizar cambios con transition

/* Imágenes adaptativas */
@media (prefers-color-scheme: dark) {
  img:not([data-theme-ignore]) {
    filter: brightness(0.8) contrast(1.2);
  }
}

/* SVG con currentColor */
.icon {
  color: var(--icon-color);
}

<svg>
  <path fill="currentColor" ... />
</svg>

/* Transiciones suaves */
:root {
  --transition-time: 0.4s;
}

body, img {
  transition: 
    background var(--transition-time),
    color var(--transition-time),
    filter var(--transition-time);
}

Accesibilidad y Mejores Prácticas

Criterios esenciales para dark mode de calidad:

/* Verificar contraste */
.text {
  color: var(--text-primary);
  background: var(--bg-primary);
  /* Contraste mínimo 4.5:1 */
}

/* Estilos para modo impresión */
@media print {
  :root {
    --bg-primary: white !important;
    --text-primary: black !important;
  }
}
Parámetro Light Mode Dark Mode
Contraste mínimo 4.5:1 (AA) 4.5:1 (AA)
Brillo texto #333 a #FFF #FFF a #121212
Saturación colores 100% Reducir 15-20%
Contraste profundidad Sombras oscuras Luces suaves
SR

Sobre el autor

Diseñadora UX especializada en modos de color. Ha implementado sistemas dark mode para aplicaciones con millones de usuarios.