ToolHub
View All Posts

Diseño web en modo oscuro: Mejores prácticas y guía de implementación

El modo oscuro ha evolucionado de una preferencia de desarrolladores a una expectativa de diseño generalizada. Más del 80% de los desarrolladores usan modo oscuro en sus IDE, y los principales sistemas operativos ahora incluyen temas oscuros a nivel de sistema. Los usuarios esperan que los sitios web y aplicaciones respeten sus preferencias. Esta guía cubre los principios de diseño, teoría del color, implementación CSS y consideraciones de accesibilidad necesarias para crear experiencias efectivas de modo oscuro.

Por qué el modo oscuro es importante

El modo oscuro no es solo una elección estética. Ofrece beneficios tangibles a los usuarios. En entornos de poca luz, los fondos oscuros reducen la fatiga ocular al disminuir la cantidad de luz emitida por la pantalla. Para pantallas OLED y AMOLED, los píxeles oscuros consumen mucha menos energía que los píxeles brillantes, prolongando la duración de la batería en dispositivos móviles. El modo oscuro también crea jerarquía visual a través del contraste, atrayendo la atención hacia el contenido y los elementos interactivos.

Sin embargo, un modo oscuro mal implementado puede ser peor que no tener ninguno. El alto contraste entre texto blanco puro y fondo negro puro puede causar un efecto de halo donde el texto parece borroso o brillante. La clave es encontrar el equilibrio correcto entre contraste y comodidad.

Teoría del color para modo oscuro

El error más común en el diseño de modo oscuro es simplemente invertir el esquema claro. Este enfoque falla porque la percepción del color cambia en fondos oscuros. Los colores que se ven vibrantes sobre blanco pueden parecer chillones o abrumadores en superficies oscuras, mientras que las diferencias sutiles en sombras claras se vuelven invisibles sobre oscuro.

Colores de fondo

Evita usar negro puro (#000000) como fondo. El negro puro produce un contraste excesivo con el texto blanco, causando fatiga ocular. En su lugar, usa grises oscuros con un ligero matiz que añadan profundidad e interés visual.

Nivel de fondoColorCaso de uso
Base#0f172aFondo de página
Superficie#1e293bTarjetas, modales
Elevado#334155Estado hover, menús desplegables
Superposiciónrgba(0,0,0,0.5)Fondo de modal

Colores de texto

De manera similar, evita el blanco puro (#ffffff) para el texto del cuerpo. Usa tonos blanquecinos que mantengan la legibilidad mientras reducen el deslumbramiento. Reserva el blanco puro para títulos y acentos.

Colores de acento

Los colores de acento a menudo necesitan ajustes para el modo oscuro. Los colores saturados que funcionan bien sobre fondos blancos pueden parecer que vibran en superficies oscuras. Reduce ligeramente la saturación de los colores de acento y aumenta su luminosidad para mantener la visibilidad sin causar fatiga visual.

Implementación CSS

El enfoque más mantenible para el modo oscuro es usar propiedades personalizadas CSS (variables) con la media query prefers-color-scheme. Esto te permite definir colores una vez y cambiar temas modificando los valores de las variables.

Usar propiedades personalizadas CSS

:root {
  --bg: #f8fafc;
  --bg-card: #ffffff;
  --text: #1e293b;
  --text-muted: #64748b;
  --primary: #3b82f6;
  --border: #e2e8f0;
}

@media (prefers-color-scheme: dark) {
  :root {
    --bg: #0f172a;
    --bg-card: #1e293b;
    --text: #e2e8f0;
    --text-muted: #94a3b8;
    --primary: #60a5fa;
    --border: #334155;
  }
}

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

Alternancia manual con JavaScript

Aunque prefers-color-scheme maneja las preferencias del sistema, los usuarios también necesitan un interruptor manual. Almacena la preferencia en localStorage y aplícala mediante un atributo data en el elemento raíz.

function toggleTheme() {
  const current = document.documentElement.dataset.theme;
  const next = current === 'dark' ? 'light' : 'dark';
  document.documentElement.dataset.theme = next;
  localStorage.setItem('theme', next);
}

// On page load
const saved = localStorage.getItem('theme');
if (saved) {
  document.documentElement.dataset.theme = saved;
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
  document.documentElement.dataset.theme = 'dark';
}

Luego usa selectores de atributos en CSS junto con el enfoque de media queries:

[data-theme="dark"] {
  --bg: #0f172a;
  --bg-card: #1e293b;
  --text: #e2e8f0;
}

Manejo de jerarquía y profundidad

En el modo claro, las sombras transmiten jerarquía. En el modo oscuro, las sombras son menos visibles en superficies oscuras. En su lugar, usa colores de fondo progresivamente más claros para representar la jerarquía. Cada capa debe ser ligeramente más clara que la que está debajo, creando una jerarquía visual que imita la luz cayendo sobre superficies elevadas.

Imágenes y medios en modo oscuro

Las imágenes brillantes pueden parecer discordantes en fondos oscuros. Usa filtros CSS para reducir ligeramente el brillo de las imágenes en modo oscuro. Para logos e iconos, proporciona versiones alternativas en claro.

[data-theme="dark"] img {
  filter: brightness(0.9);
}

[data-theme="dark"] .logo-dark {
  display: inline-block;
}

[data-theme="dark"] .logo-light {
  display: none;
}

Consideraciones de accesibilidad

El modo oscuro debe cumplir los mismos estándares de accesibilidad que el modo claro. Las pautas WCAG 2.1 requieren una relación de contraste mínima de 4.5:1 para texto normal y 3:1 para texto grande. Usa herramientas de comprobación de contraste para probar tu tema oscuro y asegurar el cumplimiento.

Errores comunes del modo oscuro

¿Necesitas comprobar el contraste de tu diseño en modo oscuro? Prueba nuestra herramienta gratuita de comprobación de contraste para asegurar que tus colores cumplan con los estándares de accesibilidad WCAG.

Comprobar contraste ahora

Preguntas frecuentes

¿Debo usar negro puro para el fondo del modo oscuro?

No, el negro puro (#000000) crea un contraste excesivo con el texto blanco, causando fatiga ocular y efecto de halo. Usa grises oscuros como #121212, #1e293b o #0f172a en su lugar. Estos colores proporcionan suficiente contraste para la legibilidad siendo más suaves para la vista.

¿Cómo detectar la preferencia de modo oscuro del usuario en CSS?

Usa la media query prefers-color-scheme: @media (prefers-color-scheme: dark) { /* estilos de modo oscuro */ }. Esto aplica automáticamente los estilos oscuros cuando el usuario habilita el modo oscuro en la configuración de su sistema operativo.

¿Cuánto contraste debe tener el texto en modo oscuro?

WCAG 2.1 requiere una relación de contraste mínima de 4.5:1 para texto normal y 3:1 para texto grande. En modo oscuro, usa texto gris claro (#e2e8f0 o #f1f5f9) sobre fondos oscuros en lugar de blanco puro para reducir el deslumbramiento mientras mantienes suficiente contraste.

¿Debería ser el modo oscuro la opción predeterminada?

Sigue la preferencia del sistema del usuario con prefers-color-scheme. Si no se detecta ninguna preferencia, el modo claro es una opción predeterminada más segura porque tiene una compatibilidad más amplia y la mayoría de los usuarios prefieren el modo claro durante el uso diurno. Proporciona siempre un botón de alternancia para que los usuarios puedan cambiar manualmente.

¿Cómo manejar imágenes en modo oscuro?

Usa CSS filter: brightness(0.9) en modo oscuro para reducir ligeramente el brillo de las imágenes, evitando que parezcan demasiado brillantes sobre fondos oscuros. Para logos e iconos, proporciona versiones en claro. Considera usar ajustes de transparencia para imágenes decorativas.