Volver al Generador

Guía de Diseño de Modo Oscuro

Domina el arte del diseño de interfaces oscuras

14 secciones~25 min de lectura11 demos interactivos

1. Introducción: La Revolución del Modo Oscuro

El modo oscuro ha pasado de ser una preferencia de nicho a una expectativa estándar. El 82% de los usuarios lo prefieren, y las grandes empresas como Apple, Google y Microsoft lo han adoptado como característica principal.

1.1 ¿Por qué el Modo Oscuro?

🌙 Beneficios Reales

  • Reduce fatiga visual en ambientes oscuros
  • Ahorra batería en pantallas OLED (hasta 60%)
  • Mejora el enfoque en el contenido
  • Reduce emisión de luz azul
  • Estética moderna y premium

⚠️ Mitos Desmentidos

  • ✗ "Es mejor para todos" - No en ambientes muy iluminados
  • ✗ "Siempre ahorra batería" - Solo en OLED, no LCD
  • ✗ "Es más accesible" - Depende del usuario
  • ✗ "Solo invierte colores" - Es mucho más complejo

📊 Estadísticas Clave

82%
prefieren dark mode
60%
ahorro batería OLED
91%
de apps top lo tienen

1.2 Lo que Aprenderás

Esta guía te convertirá en experto en diseño de modo oscuro:

  1. Ciencia del color en interfaces oscuras
  2. Errores comunes y cómo evitarlos
  3. Sistema de elevación y profundidad
  4. Adaptación de colores y contraste
  5. Implementación técnica con CSS
  6. Transiciones suaves entre modos
  7. Testing y accesibilidad

2. La Ciencia del Modo OscuroInteractivo

Entender la fisiología del ojo es crucial para diseñar interfaces oscuras efectivas.

2.1 Cómo Percibimos la Luz

Nuestros ojos tienen dos tipos de fotorreceptores:

🔆 Conos (Visión Fotópica)

Activos con luz brillante. Detectan color. Concentrados en la fóvea.

🌑 Bastones (Visión Escotópica)

Activos con poca luz. No detectan color. Distribuidos en la periferia.

2.2 El Problema del Contraste Excesivo

Texto blanco puro (#FFFFFF) sobre negro puro (#000000) causa:

  • Efecto de halo: El texto parece "brillar" y difuminarse
  • Fatiga visual: La pupila se contrae/dilata constantemente
  • Afterimage: Imágenes residuales al mirar a otro lado

Contraste 21:1

❌ Demasiado intenso

Contraste 15.8:1

✓ Óptimo para dark mode

2.3 La Regla del 87%

Material Design recomienda que el texto principal en modo oscuro tenga 87% de opacidad sobre el fondo, no 100%. Esto reduce el contraste a niveles cómodos manteniendo la legibilidad.

Comparación de Contraste

Título de Ejemplo

Este es texto de cuerpo. Nota cómo la versión de alto contraste causa un efecto de "halo" donde el texto parece brillar y difuminarse en los bordes. La versión optimizada es mucho más cómoda para la vista.

Actual: #FFFFFF sobre #000000
Ratio de Contraste: 21:1
⚠️ Puede causar fatiga visual

3. Los 7 Errores Fatales del Modo OscuroInteractivo

Evita estos errores que arruinan la experiencia de usuario.

❌ Error 1: Usar Negro Puro (#000000)

El negro puro no existe en la naturaleza. Usa #121212 o más claro.

❌ Error 2: Colores Saturados

Los colores brillantes "queman" sobre fondos oscuros. Reduce saturación 10-20%.

100%
Desaturado

❌ Error 3: Sombras Tradicionales

Las sombras oscuras no funcionan sobre fondos oscuros. Usa elevación con luminosidad.

❌ Error 4: Invertir Colores Directamente

filter: invert(1) destruye imágenes, logos y la identidad de marca.

❌ Error 5: Mismo Color Primario

Tu azul #2563EB puede necesitar ser #60A5FA en dark mode para mantener contraste.

❌ Error 6: Ignorar Estados de Componentes

Hover, focus, active, disabled - todos necesitan ajustes específicos para dark mode.

❌ Error 7: Transición Brusca

Cambiar de modo sin transición es agresivo. Usa transition: 200-300ms.

Comparador de Errores Comunes

❌ Mal

Texto de Ejemplo

✓ Bien

Texto de Ejemplo

4. Sistema de Colores para Modo OscuroInteractivo

Un sistema de colores bien diseñado es la base de un modo oscuro exitoso.

4.1 Fondos: Sistema de Capas

Material Design usa un sistema de elevación donde superficies más elevadas son más claras:

dp 0 - Base #121212
dp 1 - Cards #1E1E1E
dp 2 - Elevated #232323
dp 3 - Nav bars #252525
dp 4 - Modals #272727

4.2 Texto: Jerarquía con Opacidad

Texto Principal (87%)

Texto secundario con 60% de opacidad para crear jerarquía visual.

Texto deshabilitado o de menor importancia al 38%.

4.3 Colores de Marca

Ajusta tus colores de marca para dark mode:

  • Reduce saturación: -10% a -20%
  • Aumenta luminosidad: +10% a +20%
  • Verifica contraste: Mínimo 4.5:1 con el fondo

Generador de Paleta Dark Mode

#6366F1
#7c7ee9
Vista Previa

Texto primario al 87% de opacidad

Texto secundario al 60% de opacidad

background

surface1

surface2

surface3

primary

primary Variant

5. Elevación y ProfundidadInteractivo

En modo oscuro, la elevación se comunica con luminosidad, no con sombras.

5.1 El Concepto de Overlay

Cada nivel de elevación añade una capa semi-transparente blanca sobre el fondo base:

Elevación Overlay Uso
0dp 0% Fondo de página
1dp 5% Cards, listas
2dp 7% Botones elevados
3dp 8% FAB, snackbars
4dp 9% App bar, nav
6dp 11% Menús
8dp 12% Modales, diálogos
24dp 16% Elementos máximos

5.2 Implementación CSS

/* Sistema de elevación dark mode */
.surface-0 { background: #121212; }
.surface-1 { background: #1E1E1E; } /* 5% overlay */
.surface-2 { background: #232323; } /* 7% overlay */
.surface-3 { background: #252525; } /* 8% overlay */
.surface-4 { background: #272727; } /* 9% overlay */

/* O con CSS custom properties */
:root[data-theme="dark"] {
  --surface-base: #121212;
  --surface-1: color-mix(in srgb, white 5%, #121212);
  --surface-2: color-mix(in srgb, white 7%, #121212);
}

Sistema de Elevación

1dp - Cards, listas

Overlay blanco: 5%

#1E1E1E

6. Adaptación de Componentes UIInteractivo

Cada componente necesita consideraciones específicas para modo oscuro.

6.1 Botones

Light Mode
Dark Mode

6.2 Inputs y Forms

6.3 Cards

En dark mode, las cards usan elevación en lugar de sombras:

  • Fondo más claro que la página base
  • Bordes sutiles opcionales (#333)
  • Sin box-shadow o muy sutil

6.4 Iconos

Los iconos necesitan ajustes de opacidad:

  • Activos: 87% opacidad
  • Inactivos: 60% opacidad
  • Deshabilitados: 38% opacidad

Galería de Componentes

LIGHT MODE

DARK MODE

7. Colores Semánticos en Dark ModeInteractivo

Los colores semánticos (éxito, error, warning, info) necesitan ajustes específicos para dark mode.

7.1 El Problema de los Colores Brillantes

Los colores semánticos estándar son demasiado intensos sobre fondos oscuros:

❌ Sin ajustar
Success - Demasiado brillante
Error - Quema los ojos
Warning - Muy intenso
✅ Ajustados
Success - Desaturado
Error - Suavizado
Warning - Equilibrado

7.2 Tabla de Conversión

Estado Light Mode Dark Mode Ajuste
Success #22C55E #4ADE80 +15% luminosidad
Error #EF4444 #F87171 +20% luminosidad
Warning #F59E0B #FCD34D +25% luminosidad
Info #3B82F6 #60A5FA +15% luminosidad

7.3 Fondos de Alertas

En dark mode, usa fondos semi-transparentes en lugar de colores sólidos:

/* Light mode */
.alert-success { background: #DCFCE7; }

/* Dark mode */
.alert-success { background: rgba(74, 222, 128, 0.15); }

Colores Semánticos para Dark Mode

success

#4ADE80

error

#F87171

warning

#FCD34D

info

#60A5FA

✓ Colores desaturados y aclarados para una visualización cómoda

8. Imágenes y Contenido MultimediaInteractivo

Las imágenes y videos necesitan tratamiento especial en modo oscuro.

8.1 El Problema del Brillo

Imágenes brillantes sobre fondos oscuros crean un contraste incómodo. Soluciones:

Opción 1: Reducir Brillo

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

Opción 2: Overlay Sutil

.image-container::after {
  content: '';
  position: absolute;
  inset: 0;
  background: rgba(0,0,0,0.1);
  pointer-events: none;
}

Opción 3: Imágenes Alternativas

<picture>
  <source srcset="hero-dark.jpg" 
          media="(prefers-color-scheme: dark)">
  <img src="hero-light.jpg" alt="Hero">
</picture>

8.2 Logos y SVGs

Los logos necesitan versiones específicas para dark mode:

  • Logo oscuro: Para fondos claros
  • Logo claro: Para fondos oscuros
  • Logo monocromático: Que funcione en ambos

💡 Pro Tip

Usa currentColor en SVGs para que hereden el color del texto y se adapten automáticamente.

8.3 Videos

Para videos embebidos, considera:

  • Bordes redondeados con fondo oscuro
  • Thumbnails con overlay sutil
  • Controles personalizados que respeten el tema

Ajuste de Brillo de Imágenes

Brillo completo - puede ser muy intenso

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

9. Implementación TécnicaInteractivo

Múltiples formas de implementar dark mode, cada una con pros y contras.

9.1 CSS Custom Properties (Recomendado)

:root {
  /* Light mode (default) */
  --color-bg: #FFFFFF;
  --color-surface: #F9FAFB;
  --color-text: #111827;
  --color-text-secondary: #6B7280;
  --color-primary: #3B82F6;
  --color-border: #E5E7EB;
}

[data-theme="dark"] {
  --color-bg: #121212;
  --color-surface: #1E1E1E;
  --color-text: rgba(255,255,255,0.87);
  --color-text-secondary: rgba(255,255,255,0.60);
  --color-primary: #60A5FA;
  --color-border: #333333;
}

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

9.2 Detección de Preferencia del Sistema

/* CSS */
@media (prefers-color-scheme: dark) {
  :root {
    --color-bg: #121212;
    /* ... resto de variables dark */
  }
}

/* JavaScript */
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)');

// Escuchar cambios
prefersDark.addEventListener('change', (e) => {
  document.documentElement.dataset.theme = e.matches ? 'dark' : 'light';
});

9.3 Toggle Manual con Persistencia

// Leer preferencia guardada o del sistema
function getTheme() {
  const saved = localStorage.getItem('theme');
  if (saved) return saved;
  return window.matchMedia('(prefers-color-scheme: dark)').matches 
    ? 'dark' 
    : 'light';
}

// Aplicar tema
function setTheme(theme) {
  document.documentElement.dataset.theme = theme;
  localStorage.setItem('theme', theme);
}

// Toggle
function toggleTheme() {
  const current = document.documentElement.dataset.theme;
  setTheme(current === 'dark' ? 'light' : 'dark');
}

// Inicializar
setTheme(getTheme());

9.4 Evitar Flash de Tema Incorrecto

<!-- En el <head>, ANTES de cualquier CSS -->
<script>
  (function() {
    const theme = localStorage.getItem('theme') || 
      (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
    document.documentElement.dataset.theme = theme;
  })();
</script>

Código de Implementación

// Dark Mode Implementation
const getTheme = () => {
  const saved = localStorage.getItem('theme');
  if (saved) return saved;
  return window.matchMedia('(prefers-color-scheme: dark)').matches 
    ? 'dark' : 'light';
};

const setTheme = (theme) => {
  document.documentElement.dataset.theme = theme;
  localStorage.setItem('theme', theme);
};

// Initialize on load
setTheme(getTheme());

// Listen for system changes
window.matchMedia('(prefers-color-scheme: dark)')
  .addEventListener('change', (e) => {
    if (!localStorage.getItem('theme')) {
      setTheme(e.matches ? 'dark' : 'light');
    }
  });

10. Transiciones SuavesInteractivo

Una transición bien diseñada hace que el cambio de tema sea agradable en lugar de brusco.

10.1 Transición Básica

/* Transición global */
* {
  transition: background-color 200ms ease, 
              color 200ms ease,
              border-color 200ms ease;
}

/* Excluir elementos que no deben animar */
img, video, iframe {
  transition: none;
}

10.2 Transición Avanzada con View Transitions API

// Navegadores modernos
function toggleTheme() {
  if (!document.startViewTransition) {
    // Fallback para navegadores sin soporte
    setTheme(getNextTheme());
    return;
  }
  
  document.startViewTransition(() => {
    setTheme(getNextTheme());
  });
}

/* CSS para la animación */
::view-transition-old(root),
::view-transition-new(root) {
  animation-duration: 300ms;
}

::view-transition-old(root) {
  animation: fade-out 300ms ease;
}

::view-transition-new(root) {
  animation: fade-in 300ms ease;
}

10.3 Efecto de Expansión Circular

Un efecto premium donde el nuevo tema se expande desde el botón de toggle:

function toggleWithCircle(event) {
  const x = event.clientX;
  const y = event.clientY;
  const endRadius = Math.hypot(
    Math.max(x, window.innerWidth - x),
    Math.max(y, window.innerHeight - y)
  );
  
  const transition = document.startViewTransition(() => {
    setTheme(getNextTheme());
  });
  
  transition.ready.then(() => {
    document.documentElement.animate(
      { clipPath: [
        `circle(0px at ${x}px ${y}px)`,
        `circle(${endRadius}px at ${x}px ${y}px)`
      ]},
      { duration: 500, easing: 'ease-out', pseudoElement: '::view-transition-new(root)' }
    );
  });
}

Demo de Transición de Tema

Contenido de Ejemplo

Observa cómo se siente la transición a diferentes duraciones. 200-300ms suele ser óptimo.

✓ Rango óptimo

11. Accesibilidad en Modo OscuroInteractivo

El modo oscuro tiene sus propios desafíos de accesibilidad.

11.1 Contraste WCAG

Los requisitos de contraste son los mismos, pero más difíciles de lograr:

✅ Cumple AA (4.5:1)

Texto #E0E0E0 sobre #121212

Ratio: 13.5:1

❌ No cumple (2.8:1)

Texto #666666 sobre #121212

Ratio: 2.8:1

11.2 Focus States

Los indicadores de focus deben ser muy visibles en dark mode:

[data-theme="dark"] :focus-visible {
  outline: 2px solid #60A5FA;
  outline-offset: 2px;
}

/* O con box-shadow para más visibilidad */
[data-theme="dark"] :focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px rgba(96, 165, 250, 0.5);
}

11.3 Usuarios con Sensibilidad a la Luz

Algunos usuarios necesitan modo oscuro por razones médicas:

  • Migrañas: La luz brillante puede desencadenarlas
  • Fotofobia: Sensibilidad extrema a la luz
  • Astigmatismo: El texto claro sobre oscuro puede ser más difícil

💡 Recomendación

Ofrece un "modo oscuro verdadero" con fondos más oscuros (#0A0A0A) como opción adicional para usuarios que lo necesiten.

11.4 Respeta las Preferencias del Usuario

/* Respetar prefers-reduced-motion */
@media (prefers-reduced-motion: reduce) {
  * {
    transition: none !important;
  }
}

/* Respetar prefers-contrast */
@media (prefers-contrast: more) {
  [data-theme="dark"] {
    --color-text: #FFFFFF;
    --color-bg: #000000;
  }
}

Verificador de Contraste Dark Mode

Texto de Ejemplo

Texto de cuerpo para lectura

14.19:1

WCAG AA

✓ Pass

WCAG AAA

✓ Pass

12. Testing y QA

Un checklist completo para asegurar que tu modo oscuro funciona perfectamente.

12.1 Checklist de Testing

  • Contraste: Todos los textos cumplen WCAG AA (4.5:1)
  • Colores: No hay colores saturados que "quemen"
  • Imágenes: Logos y fotos se ven bien
  • Forms: Inputs, selects, checkboxes funcionan
  • Estados: Hover, focus, active, disabled visibles
  • Transición: Cambio de tema es suave
  • Persistencia: Preferencia se guarda correctamente
  • Sistema: Respeta prefers-color-scheme
  • Flash: No hay flash de tema incorrecto al cargar
  • Terceros: Widgets externos se adaptan

12.2 Herramientas de Testing

  • Chrome DevTools: Rendering > Emulate CSS prefers-color-scheme
  • Firefox: about:config > ui.systemUsesDarkTheme
  • Contrast Checker: WebAIM, Colour Contrast Analyser
  • Lighthouse: Auditoría de accesibilidad

12.3 Testing en Dispositivos

Prueba en diferentes condiciones:

  • Pantallas OLED vs LCD
  • Diferentes niveles de brillo
  • Luz ambiente (día vs noche)
  • iOS y Android (diferentes implementaciones)

13. Casos de EstudioInteractivo

Analicemos cómo las mejores apps implementan modo oscuro.

13.1 Twitter/X

Dim Mode

Twitter ofrece dos modos oscuros: "Dim" (azulado) y "Lights Out" (negro puro para OLED).

Lección: Ofrece opciones. Algunos prefieren negro puro, otros un gris suave.

13.2 Slack

Dark Mode Profesional

Slack usa un gris muy oscuro con acentos de color personalizables por workspace.

Lección: Mantén la identidad de marca incluso en dark mode.

13.3 Discord

Dark by Default

Discord nació oscuro. Su modo claro vino después como opción secundaria.

Lección: Si tu audiencia es tech-savvy, considera dark mode como default.

13.4 GitHub

Múltiples Temas

GitHub ofrece varios temas oscuros: Default dark, Dimmed, High contrast.

Lección: Para apps de productividad, ofrece opciones de contraste.

Visor de Casos de Estudio

Twitter/X

@twitter

Dos modos oscuros: Dim (azulado) y Lights Out (negro OLED)

14. Conclusión y Recursos

El modo oscuro bien implementado mejora significativamente la experiencia de usuario.

Resumen de Principios Clave

  1. 1 Nunca uses negro puro (#000000)
  2. 2 Desatura colores brillantes 10-20%
  3. 3 Usa elevación con luminosidad, no sombras
  4. 4 Texto principal al 87% de opacidad
  5. 5 Verifica contraste WCAG en todo
  6. 6 Transiciones suaves (200-300ms)
  7. 7 Respeta las preferencias del sistema

Recursos Adicionales

  • Material Design Dark Theme: Guía oficial de Google
  • Apple Human Interface: Dark Mode guidelines
  • A11y Project: Recursos de accesibilidad
  • CSS-Tricks: Artículos sobre implementación

¿Listo para implementar?

Usa nuestras herramientas para crear paletas dark mode perfectas.

Ir al Generador →

¿Listo para implementar modo oscuro?

Usa nuestro Generador de Paletas para crear sistemas de color dark mode perfectos.