Как на JS реализовать переключение темной и светлой темы сайта с сохранением выбора пользователя в localStorage?

Переключение между тёмной и светлой темой — распространённая задача во фронтенд-разработке. Ниже описан полный подход к её реализации с использованием чистого JavaScript и localStorage.

## Шаг 1: Подготовка CSS

Создайте две темы через CSS-переменные или классы. Рекомендуется использовать класс на элементе « или «:

css
body {
background-color: #ffffff;
color: #000000;
transition: background-color 0.3s, color 0.3s;
}

body.dark {
background-color: #121212;
color: #f0f0f0;
}

## Шаг 2: HTML-кнопка переключения

html

## Шаг 3: JavaScript-логика

javascript
// Получаем сохранённую тему из localStorage
const savedTheme = localStorage.getItem(‘theme’);

// Применяем тему при загрузке страницы
if (savedTheme === ‘dark’) {
document.body.classList.add(‘dark’);
}

// Обработчик кнопки
const toggleButton = document.getElementById(‘theme-toggle’);

toggleButton.addEventListener(‘click’, () => {
document.body.classList.toggle(‘dark’);

// Сохраняем выбор пользователя
if (document.body.classList.contains(‘dark’)) {
localStorage.setItem(‘theme’, ‘dark’);
} else {
localStorage.setItem(‘theme’, ‘light’);
}
});

## Шаг 4: Учёт системных настроек пользователя

Если пользователь ещё не выбирал тему вручную, можно опираться на системные предпочтения через `prefers-color-scheme`:

javascript
const savedTheme = localStorage.getItem(‘theme’);
const prefersDark = window.matchMedia(‘(prefers-color-scheme: dark)’).matches;

if (savedTheme === ‘dark’ || (!savedTheme && prefersDark)) {
document.body.classList.add(‘dark’);
}

## Важные нюансы

1. **Место вызова скрипта**: чтобы избежать «мигания» при загрузке, подключайте скрипт инициализации темы в « с атрибутом `defer` или вставляйте инлайново до «.
2. **Обновление иконки кнопки**: меняйте текст или иконку кнопки в зависимости от текущей темы для лучшего UX.
3. **Доступность**: добавьте `aria-label` к кнопке, чтобы скринридеры корректно озвучивали её назначение.
4. **CSS-переменные**: для масштабируемых проектов лучше использовать CSS custom properties (`—bg-color`, `—text-color`) вместо прямых значений — это упрощает поддержку нескольких тем.

Такой подход работает во всех современных браузерах и не требует сторонних библиотек.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.