Detectar el esquema de colores del sistema
Leer la preferencia del usuario por el modo oscuro del sistema operativo con prefers-color-scheme y actualizar el estado de React cuando cambie
Detectar el esquema de colores del sistema es una lección gratuita de React Academy en CoddyKit. Esta es la lección 1 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 React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.
La consulta de medios prefers-color-scheme
La consulta de medios CSS prefers-color-scheme detecta si el usuario ha configurado su sistema operativo para usar un tema de color oscuro o claro. Acepta dos valores: dark y light. Esta preferencia se establece en el nivel del sistema operativo, en la configuración del sistema, no en el navegador.
Modo oscuro de CSS mediante una consulta de medios
Puede aplicar estilos oscuros exclusivamente con CSS mediante @media (prefers-color-scheme: dark) { ... }. Dentro de este bloque, sobrescriba los colores, fondos y bordes para adaptarlos a una paleta oscura. Este enfoque no requiere JavaScript y funciona incluso antes de que React se monte.
window.matchMedia en JavaScript
En JavaScript, window.matchMedia('(prefers-color-scheme: dark)') devuelve un objeto MediaQueryList. Puede usarlo para leer mediante programación la preferencia actual del sistema dentro de hooks de React o controladores de eventos. Este es el puente entre las consultas de medios CSS y la lógica de JS.
Lectura del valor inicial
El objeto MediaQueryList tiene una propiedad matches que devuelve un booleano. Si matches es true, el sistema está en modo oscuro; si es false, está en modo claro. Normalmente se lee una vez durante el montaje para inicializar el estado del tema.
Escucha de los cambios del sistema
Los usuarios pueden cambiar el esquema de color de su sistema operativo en cualquier momento. Para responder dinámicamente, llame a mediaQuery.addEventListener('change', handler), donde handler recibe el MediaQueryListEvent actualizado. El objeto de evento también tiene un booleano matches que refleja la nueva preferencia.
Creación del hook usePrefersDarkMode
Un enfoque limpio consiste en crear un hook personalizado mediante useSyncExternalStore. El hook se suscribe a mediaQuery.addEventListener y proporciona una función de snapshot que devuelve mediaQuery.matches. Así, el hook se mantiene sincronizado con la API externa del navegador sin gestionar el estado manualmente.
Cancelación de la suscripción durante la limpieza
Cuando el componente se desmonta, debe eliminar el detector de eventos para evitar fugas de memoria. En la limpieza de un useEffect, llame a mediaQuery.removeEventListener('change', handler). Con useSyncExternalStore, la función de suscripción debe devolver una función para cancelar la suscripción que haga lo mismo.
Preferencia del sistema frente a anulación del usuario
La preferencia del sistema es la que informa el sistema operativo. Sin embargo, los usuarios suelen querer anular el tema de la aplicación de forma independiente; por ejemplo, mantener la aplicación en modo claro mientras el sistema operativo está en modo oscuro. Su arquitectura debe distinguir entre el valor predeterminado del sistema y una anulación explícita del usuario almacenada en localStorage.
Emulación del esquema de color en DevTools
Chrome DevTools permite emular las preferencias de esquema de color sin cambiar la configuración del sistema operativo. Abra DevTools, vaya a la pestaña Rendering y busque el menú desplegable «Emular la función de medios CSS prefers-color-scheme». Esto resulta muy útil para probar rápidamente ambos temas durante el desarrollo.
Respeto de la preferencia del usuario de forma predeterminada
Una buena implementación del modo oscuro lee la preferencia del sistema como punto de partida predeterminado y la aplica de inmediato. Esto demuestra respeto por la configuración de accesibilidad del usuario. Solo después de que el usuario cambie explícitamente el tema en la aplicación debe almacenar y usar una anulación diferente.
Consideraciones de SSR para la preferencia del sistema
En el servidor, window.matchMedia no existe. Si renderiza en el servidor, compruebe typeof window !== 'undefined' antes de llamar a matchMedia. En las aplicaciones con SSR, lea la preferencia del usuario de una cookie o una cabecera HTTP para evitar discrepancias de hidratación.
Comprobación de la API matchMedia
¿Qué propiedad de un objeto MediaQueryList indica si la consulta de medios coincide actualmente?
Resumen de la lección: detección del esquema de color del sistema
La consulta de medios prefers-color-scheme expone la preferencia de color del sistema operativo tanto en CSS como en JavaScript. Use window.matchMedia para leer los cambios y escuchar sus actualizaciones, elimine siempre los detectores de eventos y distinga entre los valores predeterminados del sistema y las anulaciones del usuario. La emulación de Chrome DevTools acelera las pruebas de ambos temas.
Preguntas frecuentes
¿La lección «Detectar el esquema de colores del sistema» es gratis?
Sí — el texto completo de «Detectar el esquema de colores del sistema» 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 React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Detectar el esquema de colores del sistema»?
Leer la preferencia del usuario por el modo oscuro del sistema operativo con prefers-color-scheme y actualizar el estado de React cuando cambie Practicas React 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 React Academy?
No se requiere experiencia previa. React 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 1 de 4.
¿Cuánto tiempo toma la lección «Detectar el esquema de colores del sistema»?
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 React Academy?
Sí. Cada lección de React 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
- Detectar el esquema de colores del sistema
- Variables CSS para cambiar de tema
- React Context para el estado del tema
- Conservar el tema y evitar el destello visual