ToolHub
View All Posts

Тёмный режим в веб-дизайне: лучшие практики и руководство по реализации

Тёмный режим превратился из предпочтения разработчиков в массовое дизайнерское ожидание. Более 80% разработчиков используют тёмный режим в своих IDE, а основные операционные системы теперь включают системные тёмные темы. Пользователи ожидают, что сайты и приложения будут уважать их предпочтения. Это руководство охватывает принципы дизайна, теорию цвета, реализацию на CSS и соображения доступности, необходимые для создания эффективного опыта тёмного режима.

Почему тёмный режим важен

Тёмный режим — это не просто эстетический выбор. Он предоставляет ощутимые преимущества для пользователей. В условиях низкой освещённости тёмный фон снижает нагрузку на глаза, уменьшая количество света, излучаемого экраном. Для OLED и AMOLED дисплеев тёмные пиксели потребляют значительно меньше энергии, чем светлые, продлевая время работы батареи мобильных устройств. Тёмный режим также создаёт визуальную иерархию через контраст, привлекая внимание к контенту и интерактивным элементам.

Однако неправильно реализованный тёмный режим может быть хуже, чем его отсутствие. Высокий контраст между чисто белым текстом и чисто чёрным фоном вызывает эффект ореола, при котором текст кажется размытым или светящимся. Ключ в нахождении правильного баланса между контрастностью и комфортом.

Теория цвета для тёмного режима

Самая распространённая ошибка в дизайне тёмного режима — простое инвертирование светлой схемы. Этот подход не работает, потому что восприятие цвета меняется на тёмном фоне. Цвета, которые выглядят яркими на белом, могут казаться резкими или подавляющими на тёмных поверхностях, а тонкие различия в светлых оттенках становятся невидимыми на тёмном.

Цвет фона

Избегайте использования чистого чёрного (#000000) в качестве фона. Чистый чёрный создаёт чрезмерный контраст с белым текстом, вызывая напряжение глаз. Вместо этого используйте тёмно-серый с лёгким оттенком для добавления глубины и визуального интереса.

Уровень фонаЦветСлучай использования
Базовый#0f172aФон страницы
Поверхность#1e293bКарточки, модальные окна
Приподнятый#334155Состояния наведения, выпадающие меню
Наложениеrgba(0,0,0,0.5)Фон модального окна

Цвет текста

Аналогично, избегайте чисто белого (#ffffff) для основного текста. Используйте оттенки off-white, которые сохраняют читаемость при снижении бликов. Оставьте чистый белый для заголовков и акцентов.

Акцентные цвета

Акцентные цвета часто требуют корректировки для тёмного режима. Насыщенные цвета, которые хорошо работают на белом фоне, могут казаться вибрирующими на тёмных поверхностях. Слегка снизьте насыщенность акцентных цветов и увеличьте их яркость, чтобы сохранить видимость без визуальной усталости.

Реализация на CSS

Наиболее поддерживаемый подход к тёмному режиму — использование CSS-пользовательских свойств (переменных) с медиа-запросом prefers-color-scheme. Это позволяет определить цвета один раз и переключать темы, изменяя значения переменных.

Использование CSS-пользовательских свойств

:root {
  --bg: #f8fafc;
  --bg-card: #ffffff;
  --text: #1e293b;
  --text-muted: #64748b;
  --primary: #3b82f6;
  --border: #e2e8f0;
}

@media (prefers-color-scheme: dark) {
  :root {
    --bg: #0f172a;
    --bg-card: #1e293b;
    --text: #e2e8f0;
    --text-muted: #94a3b8;
    --primary: #60a5fa;
    --border: #334155;
  }
}

body {
  background: var(--bg);
  color: var(--text);
}

Ручное переключение с помощью JavaScript

Хотя prefers-color-scheme обрабатывает системные предпочтения, пользователям также нужно ручное переключение. Сохраняйте предпочтение в localStorage и применяйте его через data-атрибут на корневом элементе.

function toggleTheme() {
  const current = document.documentElement.dataset.theme;
  const next = current === 'dark' ? 'light' : 'dark';
  document.documentElement.dataset.theme = next;
  localStorage.setItem('theme', next);
}

// On page load
const saved = localStorage.getItem('theme');
if (saved) {
  document.documentElement.dataset.theme = saved;
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
  document.documentElement.dataset.theme = 'dark';
}

Затем в CSS используйте селектор атрибута вместе с подходом медиа-запроса:

[data-theme="dark"] {
  --bg: #0f172a;
  --bg-card: #1e293b;
  --text: #e2e8f0;
}

Обработка иерархии и глубины

В светлом режиме тени передают иерархию. В тёмном режиме тени менее заметны на тёмных поверхностях. Вместо этого используйте прогрессивно более светлые цвета фона для обозначения высоты. Каждый слой должен быть немного светлее предыдущего, создавая визуальную иерархию, имитирующую свет, падающий на приподнятые поверхности.

Изображения и медиа в тёмном режиме

Яркие изображения могут казаться резкими на тёмном фоне. Используйте CSS-фильтры для небольшого затемнения изображений в тёмном режиме. Для логотипов и иконок предоставляйте светлые альтернативные версии.

[data-theme="dark"] img {
  filter: brightness(0.9);
}

[data-theme="dark"] .logo-dark {
  display: inline-block;
}

[data-theme="dark"] .logo-light {
  display: none;
}

Соображения доступности

Тёмный режим должен соответствовать тем же стандартам доступности, что и светлый режим. Руководство WCAG 2.1 требует минимального контраста 4.5:1 для обычного текста и 3:1 для крупного текста. Используйте инструмент проверки контрастности для тестирования вашей тёмной темы на соответствие.

Распространённые ошибки тёмного режима

Нужно проверить контрастность дизайна тёмного режима? Попробуйте наш бесплатный инструмент проверки контрастности, чтобы убедиться, что ваши цвета соответствуют стандартам доступности WCAG.

Проверить контрастность сейчас

Часто задаваемые вопросы

Следует ли использовать чистый чёрный для фона тёмного режима?

Нет, чистый чёрный (#000000) создаёт чрезмерный контраст с белым текстом, вызывая напряжение глаз и эффект ореола. Используйте тёмно-серые цвета, такие как #121212, #1e293b или #0f172a. Эти цвета обеспечивают достаточный контраст для читаемости, будучи более мягкими для глаз.

Как определить предпочтение тёмного режима пользователя в CSS?

Используйте медиа-запрос prefers-color-scheme: @media (prefers-color-scheme: dark) { /* стили тёмного режима */ }. Это автоматически применяет тёмные стили, когда пользователь включает тёмный режим в настройках операционной системы.

Какой контраст должен быть у текста в тёмном режиме?

WCAG 2.1 требует минимального контраста 4.5:1 для обычного текста и 3:1 для крупного текста. В тёмном режиме используйте светло-серый текст (#e2e8f0 или #f1f5f9) на тёмном фоне вместо чисто белого, чтобы уменьшить блики при сохранении достаточного контраста.

Должен ли тёмный режим быть опцией по умолчанию?

Следуйте системным предпочтениям пользователя с помощью prefers-color-scheme. Если предпочтение не обнаружено, светлый режим является более безопасным выбором по умолчанию, поскольку он имеет более широкую совместимость и большинство пользователей предпочитают светлый режим при дневном использовании. Всегда предоставляйте кнопку переключения, чтобы пользователи могли вручную переключаться.

Как обрабатывать изображения в тёмном режиме?

Используйте CSS filter: brightness(0.9) в тёмном режиме для небольшого затемнения изображений, чтобы они не казались слишком яркими на тёмном фоне. Для логотипов и иконок предоставляйте светлые версии. Рассмотрите возможность регулировки прозрачности для декоративных изображений.