Содержание

Что такое CSS-переменные

CSS custom properties — именованные значения, которые ты объявляешь один раз и используешь везде. Если значение меняется в одном месте — меняется везде. (Если только начинаешь с современным CSS — посмотри также Flexbox vs Grid.)

/* Объявляем переменные в :root — они глобальны */
:root {
  --bg: #ffffff;
  --text: #111111;
  --accent: #0066cc;
}

/* Используем */
body {
  background: var(--bg);
  color: var(--text);
}

Добавляем тёмную тему

Создаём второй набор переменных. Они переопределяют светлые, когда на html стоит атрибут data-theme="dark".

:root {
  --bg: #ffffff;
  --bg-card: #f5f5f5;
  --text: #111111;
  --text-muted: #666666;
  --border: rgba(0,0,0,0.1);
}

[data-theme="dark"] {
  --bg: #0a0a0f;
  --bg-card: #111118;
  --text: #e8e8f0;
  --text-muted: #6b6b80;
  --border: rgba(255,255,255,0.07);
}

Переключение через JavaScript

function toggleTheme() {
  const html = document.documentElement;
  const isDark = html.getAttribute('data-theme') === 'dark';
  html.setAttribute('data-theme', isDark ? 'light' : 'dark');

  // Сохраняем выбор пользователя
  localStorage.setItem('theme', isDark ? 'light' : 'dark');
}

// Восстанавливаем тему при загрузке
const saved = localStorage.getItem('theme');
if (saved) document.documentElement.setAttribute('data-theme', saved);

Автоматически по системным настройкам

Можно вообще не делать кнопку — CSS сам подхватит системную тему (тот же подход media queries, что и в адаптивном дизайне):

@media (prefers-color-scheme: dark) {
  :root {
    --bg: #0a0a0f;
    --text: #e8e8f0;
  }
}

💡 Можно комбинировать: по умолчанию — системная тема, но пользователь может переключить вручную. Проверяй сначала localStorage, потом prefers-color-scheme.

Плавный переход

body {
  transition: background 0.2s, color 0.2s;
}

⚠️ Не вешай transition: all — это замедлит анимации. Только на конкретные свойства: background, color, border-color.

Поделиться: