Темная тема с использованием CSS
В последние годы тёмная тема стала неотъемлемой частью современного веб-дизайна. Она не только снижает нагрузку на глаза при работе в условиях недостаточного освещения, но и экономит заряд батареи на устройствах с OLED-дисплеями. Реализовать тёмную тему на сайте с помощью CSS довольно просто, но важно сделать это правильно, чтобы пользователи могли легко переключаться между светлой и тёмной версией.
Основные принципы работы с темами
Тёмная и светлая темы представляют собой два набора стилей, которые могут динамически применяться к элементам сайта. В идеале пользователю предоставляется возможность выбора, какую тему использовать, но также можно учитывать системные предпочтения операционной системы.
Есть два основных способа реализации тёмной темы:
- Использование CSS-переменных и переключения стилей через JavaScript.
- Автоматическое применение темы в зависимости от настроек системы через
prefers-color-scheme
.
Оба подхода можно комбинировать, чтобы сделать работу с темами более гибкой.
Использование CSS-переменных для темизации
Один из самых удобных способов внедрения тёмной темы — использование CSS-переменных (custom properties
). Это позволяет легко управлять цветами и другими параметрами стилей.
Для начала создадим корневые переменные в :root
, которые будут использоваться во всём документе:
:root {
--bg-color: #ffffff;
--text-color: #000000;
}
.dark-theme {
--bg-color: #121212;
--text-color: #ffffff;
}
Затем применим эти переменные к элементам страницы:
body {
background-color: var(--bg-color);
color: var(--text-color);
transition: background-color 0.3s, color 0.3s;
}
Теперь достаточно добавить класс .dark-theme
к <html>
или <body>
, чтобы изменить цвета.
Переключение темы с помощью JavaScript
Чтобы дать пользователю возможность переключаться между светлой и тёмной темой, можно использовать JavaScript:
const toggleThemeBtn = document.getElementById('theme-toggle');
toggleThemeBtn.addEventListener('click', () => {
document.documentElement.classList.toggle('dark-theme');
// Сохраняем выбор пользователя в localStorage
if (document.documentElement.classList.contains('dark-theme')) {
localStorage.setItem('theme', 'dark');
} else {
localStorage.setItem('theme', 'light');
}
});
// Проверяем сохранённые настройки при загрузке страницы
if (localStorage.getItem('theme') === 'dark') {
document.documentElement.classList.add('dark-theme');
}
Таким образом, после перезагрузки страницы выбор пользователя сохраняется.
Автоматическое определение системной темы
Если хочется учитывать системные настройки пользователя, можно использовать prefers-color-scheme
. Этот медиа-запрос автоматически применяет нужную тему:
@media (prefers-color-scheme: dark) {
:root {
--bg-color: #121212;
--text-color: #ffffff;
}
}
Этот метод удобен, так как он сразу адаптирует сайт под системные предпочтения. Однако если пользователь хочет самостоятельно выбрать тему, придётся комбинировать этот подход с JavaScript.
Объединение автоматического определения и ручного выбора
Чтобы учесть оба метода, можно сначала проверить, есть ли сохранённый выбор темы в localStorage
. Если нет, применить системные настройки:
const userTheme = localStorage.getItem('theme');
const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
if (userTheme) {
document.documentElement.classList.toggle('dark-theme', userTheme === 'dark');
} else {
document.documentElement.classList.toggle('dark-theme', systemTheme === 'dark');
}
Создание удобного переключателя
Теперь добавим кнопку для смены темы в HTML:
<button id="theme-toggle">Переключить тему</button>
Кнопка позволяет пользователю вручную менять тему, а логика сохранения выбора делает взаимодействие удобным.
Улучшение анимации перехода
Чтобы смена темы выглядела плавно, можно добавить анимацию:
* {
transition: background-color 0.3s, color 0.3s;
}
Это создаст эффект мягкого затемнения или осветления при смене темы.
Пример переключения светлой и тёмной тем
Заключение
Реализация тёмной темы на сайте с помощью CSS и JavaScript — относительно простая, но важная задача. Использование CSS-переменных делает код удобным и масштабируемым, а сочетание prefers-color-scheme
и localStorage
даёт пользователю гибкость в выборе. В результате сайт будет адаптивным и комфортным для работы в любых условиях освещения.