Тёмная тема и темизация с помощью переменных CSS
Коротко: С переменными CSS для цветов, медиазапросом prefers-color-scheme и переключателем можно построить чистую тёмную тему, уважающую системную настройку и сохраняющую выбор.
Подробнее: Хорошая тёмная тема — больше, чем инверсия цветов: достаточный контраст, приглушённые поверхности, адаптированные тени и изображения. С токенами дизайна (именованными переменными цвета) всё остаётся поддерживаемым.
Подробности
Переменные как токены дизайна
:root {
--bg: #ffffff;
--text: #1a1a1a;
--muted: #5c6370;
--accent: #0b6bcb;
--border: #d9dde3;
color-scheme: light dark;
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--bg: #12141a; --text: #e8eaf0; --muted: #9aa3b2;
--accent: #6ea8ff; --border: #2a2f3a;
}
}
:root[data-theme="dark"] { --bg: #12141a; --text: #e8eaf0; /* … */ }
body { background: var(--bg); color: var(--text); }Используйте семантические имена (--bg, --text, --accent), а не --blue. color-scheme: light dark соответственно окрашивает элементы форм, полосы прокрутки. Новое: функция light-dark() и @property.
Система, переключатель, сохранение
- Следуйте системе через
prefers-color-scheme(по умолчанию). - Переключатель светлая / тёмная / система: задаёт
data-themeна<html>; запоминайте выбор в localStorage (в try/catch). - Избегайте мерцания (FOUC): небольшой встроенный скрипт в
<head>, задающий предпочтение до первой отрисовки. - В Next.js: библиотека вроде next-themes или собственный провайдер; следите за расхождениями гидратации (
suppressHydrationWarningнаhtml). - Добавьте
<meta name="theme-color">для панели браузера.
Дизайн в темноте
- Проверяйте контраст по WCAG (текст ≥ 4,5:1), не чисто чёрный/белый (#000/#fff слепит): лучше
#12141aи#e8eaf0. - Осветляйте акцентные цвета и снижайте насыщенность.
- Возвышение через более светлые поверхности вместо теней.
- Изображения/логотипы: тёмные варианты,
filter/mix-blend-mode, SVG сcurrentColor. - Диаграммы и подсветка кода с собственными палитрами.
- Проверяйте прозрачные PNG на тёмном.
- Ретро-/игровые стили — отдельные темы: та же структура переменных, другие значения.
Тестирование и доступность
В DevTools Rendering → эмуляция prefers-color-scheme; проверяйте на реальных устройствах (OLED, солнечный свет). Кольца фокуса и цвета ошибок должны быть видны в обоих режимах. Учитывайте также forced-colors/высокий контраст (@media (forced-colors: active)) и prefers-contrast. Стиль печати оставляйте светлым. Никогда не используйте цвет как единственный носитель информации (добавляйте узор/текст). Документируйте токены в небольшом руководстве по стилю.
См. также: Доступные сайты