Определение системной цветовой схемы
Читайте предпочтение пользователя к тёмному режиму OS с помощью prefers-color-scheme и обновляйте состояние React при его изменении
«Определение системной цветовой схемы» — бесплатный урок React Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Медиазапрос prefers-color-scheme
Медиазапрос CSS prefers-color-scheme определяет, настроил ли пользователь свою операционную систему на тёмную или светлую цветовую тему. Он принимает два значения: dark и light. Эта настройка задаётся на уровне OS в системных параметрах, а не в браузере.
Тёмный режим CSS через медиазапрос
Вы можете применять тёмные стили только средствами CSS с помощью @media (prefers-color-scheme: dark) { ... }. Внутри этого блока переопределите цвета, фоны и границы в соответствии с тёмной палитрой. Такой подход не требует JavaScript и работает ещё до монтирования React.
window.matchMedia в JavaScript
В JavaScript вызов window.matchMedia('(prefers-color-scheme: dark)') возвращает объект MediaQueryList. С его помощью можно программно прочитать текущую системную настройку внутри хуков React или обработчиков событий. Это связующее звено между медиазапросами CSS и логикой JS.
Чтение начального значения
У объекта MediaQueryList есть свойство matches, возвращающее логическое значение. Если matches равно true, система использует тёмный режим; если false — светлый. Обычно это значение считывают один раз при монтировании, чтобы инициализировать состояние темы.
Отслеживание изменений системы
Пользователь может в любой момент изменить цветовую схему OS. Чтобы динамически реагировать на это, вызовите mediaQuery.addEventListener('change', handler), где handler получает обновлённый объект MediaQueryListEvent. Объект события также содержит логическое свойство matches, отражающее новую настройку.
Создание хука usePrefersDarkMode
Удобный подход — создать пользовательский хук с помощью useSyncExternalStore. Хук подписывается через mediaQuery.addEventListener и предоставляет функцию снимка, возвращающую mediaQuery.matches. Благодаря этому хук синхронизирован с внешним API браузера без ручного управления состоянием.
Отмена подписки при очистке
При размонтировании компонента необходимо удалить обработчик события, чтобы избежать утечек памяти. В функции очистки useEffect вызовите mediaQuery.removeEventListener('change', handler). При использовании useSyncExternalStore функция подписки должна возвращать функцию отмены подписки, выполняющую то же действие.
Системная настройка и переопределение пользователем
Системная настройка — это значение, которое сообщает OS. Но пользователи часто хотят независимо переопределять тему приложения, например оставлять приложение светлым, когда OS использует тёмный режим. В архитектуре следует различать системное значение по умолчанию и явное переопределение пользователя, сохранённое в localStorage.
Эмуляция цветовой схемы в DevTools
Chrome DevTools позволяет эмулировать настройки цветовой схемы без изменения параметров OS. Откройте DevTools, перейдите на вкладку отрисовки и найдите раскрывающийся список «Эмулировать медиафункцию CSS prefers-color-scheme». Это незаменимо для быстрой проверки обеих тем во время разработки.
Уважение пользовательской настройки по умолчанию
Хорошая реализация тёмного режима считывает системную настройку как начальное значение по умолчанию и применяет её сразу. Это демонстрирует уважение к настройке доступности пользователя. Только после явного переключения темы в приложении следует сохранять и использовать другое переопределение.
Учет системной настройки при SSR
На сервере window.matchMedia не существует. При серверном рендеринге перед вызовом matchMedia проверьте условие typeof window !== 'undefined'. В приложениях с SSR вместо этого считывайте настройку пользователя из cookie или HTTP-заголовка, чтобы избежать несоответствий при гидратации.
Проверка API matchMedia
Какое свойство объекта MediaQueryList сообщает, соответствует ли ему медиазапрос в данный момент?
Итоги урока: определение системной цветовой схемы
Медиазапрос prefers-color-scheme предоставляет настройку цвета OS и в CSS, и в JavaScript. Используйте window.matchMedia для чтения настройки и отслеживания изменений, всегда удаляйте обработчики событий и различайте системные значения по умолчанию и пользовательские переопределения. Эмуляция в Chrome DevTools ускоряет проверку обеих тем.
Часто задаваемые вопросы
Урок «Определение системной цветовой схемы» бесплатный?
Да — полный текст урока «Определение системной цветовой схемы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Определение системной цветовой схемы»?
Читайте предпочтение пользователя к тёмному режиму OS с помощью prefers-color-scheme и обновляйте состояние React при его изменении Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Определение системной цветовой схемы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Определение системной цветовой схемы
- Переменные CSS для переключения темы
- React Context для состояния темы
- Сохранение темы и предотвращение мерцания