Alternancia automática y manual del modo oscuro
Cree un selector de tema que respete de forma predeterminada la preferencia del sistema y permita sobrescribirla manualmente.
Alternancia automática y manual del modo oscuro es una lección gratuita de CSS Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de CSS Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de CSS Academy incluye 4 lecciones en total.
El objetivo
Una implementación ideal del modo oscuro detecta automáticamente la preferencia del sistema operativo de forma predeterminada y ofrece un botón de alternancia que permite al usuario ignorarla de manera independiente, conservando la preferencia entre las cargas de la página.
Descripción general de la arquitectura
Hay tres estados que debe gestionar:
- Preferencia del sistema: utilice
prefers-color-schemecon variables CSS - Anulación del usuario: oscuro: establezca una clase o un atributo de datos en
<html> - Anulación del usuario: claro: establezca una clase diferente para impedir el modo oscuro automático
Configuración de tokens CSS
Defina variables CSS que se propaguen correctamente en todos los estados:
<div class="demo" data-theme="dark">Dark token demo</div>
<div class="demo" data-theme="light">Light token demo</div>
Lógica de alternancia en JavaScript
Lea la preferencia guardada, aplíquela y actualícela al alternar:
<div class="demo" id="theme-demo">Toggle my theme</div>
<div class="demo" data-theme="dark">Dark override example</div>
<button id="toggle-btn">Toggle Theme</button>
<script>
function toggleTheme() {
const current = document.getElementById('theme-demo').dataset.theme;
const system = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
if (!current) {
const next = system === 'dark' ? 'light' : 'dark';
document.getElementById('theme-demo').dataset.theme = next;
} else {
delete document.getElementById('theme-demo').dataset.theme;
}
}
document.getElementById('toggle-btn').addEventListener('click', toggleTheme);
</script>
Alternancia de tres estados
Una alternancia de tres estados más refinada: Claro | Sistema | Oscuro:
<div class="demo" id="theme-demo">Cycles: light → system → dark</div>
<div class="demo" data-theme="dark">Dark state example</div>
<p id="state-label">system</p>
<button id="cycle-btn">Cycle Theme</button>
<script>
const states = ['light', 'system', 'dark'];
let current = 'system';
const demo = document.getElementById('theme-demo');
const label = document.getElementById('state-label');
document.getElementById('cycle-btn').addEventListener('click', () => {
current = states[(states.indexOf(current) + 1) % states.length];
label.textContent = current;
if (current === 'system') { delete demo.dataset.theme; } else { demo.dataset.theme = current; }
});
</script>
Cómo evitar el parpadeo del tema incorrecto
Aplique el tema guardado de forma sincrónica antes de que se renderice la página:
<pre class="code-sample"><!-- In <head>, before any styles -->
<script>
const t = localStorage.getItem("theme");
if (t) document.documentElement.dataset.theme = t;
</script></pre>
Accesibilidad del botón de alternancia
El botón de alternancia debe comunicar el estado actual a los lectores de pantalla. Actualice la etiqueta accesible al alternar:
<button id="theme-toggle" aria-label="Switch to dark mode">🌙</button>
Transición de tema animada
Transiciones suaves de color cuando cambia el tema:
<div class="demo" id="at-demo">Smooth theme transition</div>
<button onclick="document.documentElement.classList.add('theme-transitioning'); const d=document.getElementById('at-demo'); const dark = d.style.background==='rgb(17, 17, 17)'; d.style.background = dark ? '#fff' : '#111'; d.style.color = dark ? '#111' : '#fff'; setTimeout(()=>document.documentElement.classList.remove('theme-transitioning'),250);">Toggle</button>
Escucha de cambios del sistema
Reaccione también si el usuario cambia la preferencia de su sistema operativo mientras la página está abierta:
<p id="status">Listening for system theme changes…</p>
<script>
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
document.getElementById('status').textContent = 'System changed to ' + (e.matches ? 'dark' : 'light');
});
</script>
Iconos del modo oscuro
Intercambie los iconos para cada modo. Utilice el elemento picture para las imágenes adaptadas al tema, o CSS para mostrar u ocultar distintos iconos:
<div>Light: <span class="icon-sun">☀️</span><span class="icon-moon">🌙</span></div>
<div data-theme="dark">Dark: <span class="icon-sun">☀️</span><span class="icon-moon">🌙</span></div>
Resumen: lista de comprobación de implementación
Lista de comprobación del modo oscuro:
- Variables CSS para todos los tokens de color
- Media query prefers-color-scheme para la detección automática
- Atributo data-theme para la anulación manual
- localStorage para conservar la preferencia
- Script insertado en head para evitar el parpadeo
- Botón de alternancia accesible con aria-label dinámico
Comprobación rápida
¿Qué técnica evita un "parpadeo del tema incorrecto" cuando se carga la página?
Resumen
Una alternancia de modo oscuro completa utiliza variables CSS para los tokens del tema, una consulta prefers-color-scheme para la detección automática, un atributo data-theme para la anulación manual, localStorage para conservar la preferencia y un script sincrónico en head para evitar el parpadeo. Ofrezca una alternancia accesible de tres estados (claro/sistema/oscuro) para proporcionar la mejor experiencia de usuario.
Preguntas frecuentes
¿La lección «Alternancia automática y manual del modo oscuro» es gratis?
Sí — el texto completo de «Alternancia automática y manual del modo oscuro» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de CSS Academy, actualiza a CoddyKit PRO. El curso de CSS Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Alternancia automática y manual del modo oscuro»?
Cree un selector de tema que respete de forma predeterminada la preferencia del sistema y permita sobrescribirla manualmente. Practicas CSS Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar CSS Academy?
No se requiere experiencia previa. CSS Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Alternancia automática y manual del modo oscuro»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de CSS Academy?
Sí. Cada lección de CSS Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Media query prefers-color-scheme
- Variables CSS para temas
- Propiedad color-scheme
- Alternancia automática y manual del modo oscuro