Содержание статьи

Тёмная тема снижает нагрузку на глаза в условиях слабого освещения и помогает экономить заряд устройств с OLED-экранами. На сайте она реализуется через отдельный набор цветовых переменных, переключение которых выполняется в браузере без перезагрузки страниц.
Для внедрения режима понадобится создать палитру, определить CSS-переменные, добавить скрипт для переключения и настроить сохранение выбора через localStorage. При этом важно проверить читаемость текста, контрастность интерфейса и корректную работу сторонних элементов, включая иконки и изображения.
В работе пригодится системная настройка prefers-color-scheme, позволяющая автоматически применять тему в зависимости от параметров устройства пользователя. Это уменьшит количество ручных действий и ускорит загрузку нужного варианта оформления.
Подготовка цветовой палитры для тёмной версии
Для тёмной палитры подбирают базовый фон в диапазоне от #0E0E0E до #1C1C1C, чтобы элементы интерфейса не сливались и не давали ярких контрастных пятен. Цвет текста лучше задавать ближе к #E0E0E0, а не чисто белым, чтобы избежать избыточной яркости. Акцентные оттенки выбирают с учётом читаемости на тёмном фоне и различимости при небольшом размере элементов.
Переменные для палитры удобно вынести в :root и продублировать внутри класса .dark. Это упростит дальнейшее обслуживание и позволит менять группу цветов единым блоком. Для проверки контрастности используют инструмент WCAG Contrast Checker, добиваясь соотношения не ниже 4.5:1 для текста и 3:1 для крупных элементов.
Если на сайте есть графика, стоит подготовить альтернативные версии с меньшей яркостью или прозрачностью. Это помогает избежать засветов и делает визуальный ряд ровнее. Иконки формата SVG можно адаптировать через currentColor, подключив их к системным переменным.
Настройка CSS-переменных для управления цветами

Цветовые значения удобно вынести в систему переменных, чтобы менять палитру без правки десятков селекторов. В блоке :root задают переменные для фона, текста, границ и акцентов. Например: —bg: #ffffff; —text: #1a1a1a; —accent: #3a7cff. Эти переменные подключаются ко всем ключевым элементам через var().
Для тёмной версии создают отдельный контейнер, чаще всего класс .dark, в котором переопределяют те же переменные: —bg: #121212; —text: #e2e2e2; —accent: #5b8bff. Такой подход позволяет переключать темы простым добавлением или удалением класса на корневом элементе.
Чтобы диапазон оттенков оставался стабильным на разных экранах, полезно вынести дополнительные переменные для уровней тени, разделителей и поверхностей второго плана. Это помогает избежать случайных расхождений и держать палитру в одном стиле даже при обновлении отдельных компонентов.
Создание переключателя темы на JavaScript
Переключатель темы работает через добавление или удаление класса dark на корневом элементе. Кнопке назначают обработчик, который проверяет текущее состояние документа и меняет класс document.documentElement.classList.toggle(‘dark’). Такой вариант не требует перезагрузки страницы и сразу обновляет палитру.
Для удобства пользователя стоит предусмотреть атрибут aria-pressed, чтобы переключатель корректно воспринимался скринридерами. Значение атрибута обновляется вместе с состоянием темы. Это делает интерфейс понятным и снижает количество ошибок в навигации.
При использовании модульной структуры удобно вынести логику переключения в отдельный файл, например theme-switcher.js. В таком файле размещают функции enableDark() и disableDark(), чтобы вызывать их из разных частей сайта и не дублировать код.
Сохранение выбранной темы через localStorage

Для хранения состояния темы используют ключ, например site-theme. При нажатии на переключатель в localStorage записывается значение dark или light. После загрузки страницы скрипт проверяет наличие ключа и применяет нужный класс к корневому элементу. Это устраняет мигание интерфейса и исключает возврат к стандартной палитре.
Проверку удобно выполнять до рендера основных элементов. В небольших проектах код размещают в шапке документа, чтобы тема подгружалась сразу. В более сложных структурах добавляют предварительный скрипт в отдельный файл и подключают его первым.
| Этап | Действие |
|---|---|
| Запись | localStorage.setItem(‘site-theme’, ‘dark’) |
| Чтение | localStorage.getItem(‘site-theme’) |
| Применение | document.documentElement.classList.add(‘dark’) |
Для повышения стабильности стоит учитывать системную настройку пользователя. Если ключ отсутствует, можно применить результат media-запроса prefers-color-scheme, а затем сохранить выбранный вариант при первом взаимодействии.
Настройка тёмной темы с помощью prefers-color-scheme

Системная настройка позволяет автоматически применять нужную палитру без действий со стороны пользователя. Браузер передаёт значение предпочтений, и сайт может сразу загрузить подходящий вариант оформления. Это сокращает время реакции и избавляет от лишних переключений.
Для подключения используют медиа-запросы, которые переопределяют переменные внутри блока :root. Такой подход работает во всех современных браузерах и не конфликтует с ручным выбором темы.
- @media (prefers-color-scheme: dark) – активирует тёмную палитру.
- @media (prefers-color-scheme: light) – задаёт светлую версию.
- @media (prefers-color-scheme: no-preference) – оставляет стандартные значения.
Чтобы приоритеты были корректными, стоит разделить автоматическое применение и ручной выбор:
- Сначала проверяется localStorage. Если есть сохранённое значение, оно используется.
- Если запись отсутствует, применяется системный вариант через prefers-color-scheme.
- После первого взаимодействия результат фиксируется в localStorage.
Такой порядок исключает конфликт между скриптом и системной настройкой, а интерфейс остаётся прогнозируемым на разных устройствах.
Обработка изображений и иконок для тёмного режима

Изображения с прозрачным фоном и яркими элементами могут теряться на тёмном фоне. Для сохранения видимости создают альтернативные версии с увеличенной яркостью или применяют полупрозрачные наложения. Формат SVG позволяет менять цвет через currentColor, привязывая его к переменным темы.
Иконки, особенно мелкие, стоит проверять на контрастность с фоном. Если используются растровые PNG или JPG, создают отдельные файлы для светлой и тёмной темы или применяют CSS-фильтры: invert, brightness, contrast. Это обеспечивает корректное отображение без ручного вмешательства для каждого элемента.
Для комплексных интерфейсов полезно вести таблицу соответствий цветов и яркости для изображений и иконок. Такой подход упрощает обновление графики при изменении палитры и позволяет быстро адаптировать новые элементы под обе темы.
Адаптация сторонних элементов интерфейса под тёмные стили
Внешние компоненты, такие как виджеты, формы и карты, часто используют собственные стили, которые не учитывают тёмную тему. Для их корректного отображения применяют переопределение CSS-переменных и дополнительную стилизацию через селекторы внутри класса .dark.
- Фреймворки UI (Bootstrap, Material) – меняют переменные цвета фона и текста через :root и .dark.
- Виджеты чатов и календарей – подключают пользовательские CSS-файлы с фильтрами brightness и invert, если встроенные темы отсутствуют.
- Карты и графики – задают контрастные цвета линий и маркеров, используя API для настройки темы.
Алгоритм адаптации сторонних элементов:
- Идентифицировать элементы, которые не реагируют на основной класс тёмной темы.
- Создать набор CSS-переменных или правил, которые изменяют цвета этих элементов при включении .dark.
- Проверить визуализацию на разных устройствах и экранах, чтобы сохранить читаемость и контраст.
Использование этого подхода позволяет единообразно применять тёмную тему, минимизируя расхождения между стандартными и сторонними компонентами интерфейса.
Тестирование тёмной темы на разных устройствах и экранах

Тёмная тема может выглядеть по-разному на разных устройствах из-за вариаций яркости, контрастности и цветового профиля экранов. Необходимо проверить все ключевые элементы интерфейса, включая текст, кнопки, формы и изображения, чтобы убедиться, что они читаемы и сохраняют визуальную иерархию.
Для систематизации тестирования удобно использовать таблицу с проверкой критичных параметров:
| Устройство | Яркость экрана | Контрастность элементов | Читаемость текста | Отображение изображений |
|---|---|---|---|---|
| Ноутбук, IPS | 50% | Высокая | Чёткий | Корректное |
| Смартфон, AMOLED | 70% | Средняя | Чёткий | Яркость уменьшена |
| Планшет, Retina | 60% | Высокая | Чёткий | Корректное |
Дополнительно проверяют работу переключателя темы, сохранение состояния через localStorage и корректное применение системного prefers-color-scheme. Такой подход помогает выявить недочёты и обеспечить единообразное отображение на всех устройствах.
Вопрос-ответ:
Как правильно выбрать цвета для тёмной темы сайта?
Для тёмной темы выбирают фон в диапазоне от #0E0E0E до #1C1C1C, текст — светло-серый (#E0E0E0) вместо чистого белого, чтобы снизить нагрузку на глаза. Акцентные элементы подбирают с учётом контраста и читаемости, проверяя соотношение с фоном через WCAG Contrast Checker. Такой подход помогает сохранить визуальную иерархию и удобство интерфейса.
Как реализовать переключение между светлой и тёмной темой с помощью JavaScript?
Переключение выполняется через добавление или удаление класса dark на корневом элементе документа. Кнопке назначают обработчик: document.documentElement.classList.toggle(‘dark’). Рекомендуется обновлять атрибут aria-pressed для корректного восприятия скринридерами и выносить функции enableDark() и disableDark() в отдельный файл для повторного использования.
Как сохранить выбранную тему при повторном посещении сайта?
Для этого используют localStorage. При переключении темы сохраняют ключ, например ‘site-theme’, со значением ‘dark’ или ‘light’. При загрузке страницы проверяют наличие ключа и применяют нужный класс к корневому элементу, исключая мигание интерфейса. Если ключ отсутствует, применяют системное значение prefers-color-scheme, а после первого выбора пользователя фиксируют его в localStorage.
Как адаптировать сторонние виджеты и компоненты под тёмную тему?
Сторонние элементы часто имеют собственные стили, которые не реагируют на основной класс тёмной темы. Для адаптации создают переопределения CSS-переменных внутри .dark, используют фильтры CSS для растровых элементов (invert, brightness, contrast) и настраивают цвета API для карт и графиков. Важно проверить контраст текста и элементов на всех устройствах, чтобы сохранить читаемость.
Какие шаги нужны для тестирования тёмной темы на разных устройствах?
Тестирование включает проверку текстов, кнопок, форм и изображений на разных экранах и устройствах. Полезно составить таблицу с параметрами: устройство, яркость, контрастность элементов, читаемость текста, отображение изображений. Дополнительно проверяют работу переключателя, сохранение темы через localStorage и корректное применение prefers-color-scheme, чтобы обеспечить единообразное отображение.
Как правильно интегрировать тёмную тему на сайт, чтобы она работала на всех устройствах и сохранялась после перезагрузки?
Для корректной интеграции тёмной темы создают отдельный набор CSS-переменных для фонов, текста и акцентов. Класс .dark добавляют к корневому элементу для активации тёмной палитры. Переключение выполняется через JavaScript с записью выбранного состояния в localStorage. При загрузке страницы сначала проверяют наличие сохранённого значения, затем применяют системную настройку prefers-color-scheme, если ключ отсутствует. Для сторонних компонентов и изображений создают адаптированные версии или используют CSS-фильтры, чтобы сохранить контраст и читаемость на разных устройствах и экранах.
