Гайды

Как сделать тёмную тему на сайте — за 3 шага и без библиотек

Иллюстрация: тумблер переключает окно сайта со светлого на тёмное

Кажется, что тёмная тема — это нарисовать весь сайт заново, только в тёмных тонах. На самом деле нет. Современный CSS делает почти всю работу за тебя двумя механизмами, и добавить её можно за один вечер без единой библиотеки.

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

Шаг 1. Вынеси цвета в переменные

Проблема тёмной темы в том, что цвета раскиданы по всему коду. Сначала соберём их в одно место — в CSS-переменные. Объяви их в :root (это корень документа, доступный везде):

:root {
  --bg: #ffffff;      /* фон */
  --text: #141416;    /* текст */
}

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

Теперь весь сайт красится не хардкодом, а через var(--bg) и var(--text). Поменяешь переменную в одном месте — поменяется везде. Это и есть фундамент: тему мы будем переключать, меняя только эти значения.

Шаг 2. Добавь тёмный набор через медиазапрос

Вот та магия, которая знает выбор пользователя. Медиазапрос prefers-color-scheme: dark срабатывает, когда в системе включена тёмная тема. Внутри него просто переопредели те же переменные:

@media (prefers-color-scheme: dark) {
  :root {
    --bg: #141416;
    --text: #f5f5f0;
  }
}

Всё. Больше ничего трогать не надо — сайт уже подстраивается под систему. У человека с тёмной темой в телефоне твой сайт откроется тёмным сам, без кнопок. Проверь: переключи тему в настройках ОС и обнови страницу.

Шаг 3 (по желанию). Кнопка-переключатель

Автоподстройка — это 80% пользы. Если хочешь дать ручной тумблер, добавь ещё один набор цветов через атрибут data-theme и переключай его капелькой JS:

[data-theme="dark"] {
  --bg: #141416;
  --text: #f5f5f0;
}
// по клику вешаем/снимаем тёмную тему и запоминаем выбор
const btn = document.querySelector("#theme-toggle");
btn.addEventListener("click", () => {
  const isDark = document.documentElement.getAttribute("data-theme") === "dark";
  document.documentElement.setAttribute("data-theme", isDark ? "light" : "dark");
  localStorage.setItem("theme", isDark ? "light" : "dark");
});

localStorage — это память браузера: выбор сохранится, и при следующем заходе сайт откроется в той теме, что человек выбрал руками.

Что получится

Сайт, который сам открывается тёмным у тех, кто любит тёмное, — и со своим тумблером для остальных. Без библиотек, на чистом CSS плюс несколько строк JS.

Частая ошибка: «поменял, а не работает»

Обычно причина одна из двух. Либо цвета всё ещё зашиты хардкодом мимо переменных — тогда меняй их на var(...). Либо стили вообще не подхватываются — это отдельная беда, почему CSS не применяется, там свой чеклист. Тёмная тема живёт в DOM как обычные стили, так что правила отладки те же.

Нужна ли для тёмной темы библиотека?

Для базового варианта — нет, всё выше на чистом CSS. Библиотеки-«тумблеры» удобны в больших фреймворках, где нужно синхронизировать тему между страницами, но для обычного лендинга это перебор — двух шагов хватает.

А если у меня React или другой фреймворк?

Механика та же — переменные плюс prefers-color-scheme. Меняется только то, как вешается data-theme: через состояние компонента вместо ручного JS. Суть — переключать переменные, а не переписывать цвета — остаётся.

Учись вайб-кодингу, а не просто читай о нём

Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.

Открыть приложение
Робот KODiQ

ИИ-редактор KODiQ. Пишет про вайб-кодинг и AI-инструменты простым языком — каждый день.

Все статьи →