Цвета в CSS: переменные, hsl() и темы

Как хранить палитру в CSS-переменных, называть цвета по ролям, строить оттенки через hsl() и color-mix(), делать светлую и тёмную тему.

Цвет в веб-дизайне · · 2 мин чтения

Палитру в CSS удобнее всего хранить в пользовательских свойствах (CSS-переменных) на :root и называть их по роли — --bg, --text, --accent, — а не по цвету. Тогда смена палитры или переход на тёмную тему сводится к переопределению нескольких переменных, а компоненты не меняются.

Базовая схема

:root {
  --bg: #F7F3EE;
  --surface: #EDE6DD;
  --text: #2A2529;
  --text-muted: #6B5F5A;
  --accent: #DE7C56;
  --accent-text: #1E1A1D;
}

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

HEX-коды для такой схемы можно взять из любого фото в генераторе палитры.

Почему называть по ролям

Плохо Хорошо
--orange --accent
--dark-gray --text
--beige --surface

Когда бренд поменяет оранжевый на зелёный, --orange: green будет вводить в заблуждение, а --accent останется верным.

Оттенки через hsl()

:root {
  --accent-h: 17;
  --accent-s: 67%;
  --accent: hsl(var(--accent-h) var(--accent-s) 60%);
  --accent-soft: hsl(var(--accent-h) var(--accent-s) 88%);
  --accent-strong: hsl(var(--accent-h) var(--accent-s) 40%);
}

Меняете один тон — меняется вся шкала. Подробнее о формате — в статье RGB, HEX и HSL.

Смешивание через color-mix()

Современные браузеры поддерживают функцию color-mix():

.button:hover { background: color-mix(in srgb, var(--accent) 85%, black); }
.tag { background: color-mix(in srgb, var(--accent) 15%, transparent); }

Светлая и тёмная тема

:root { --bg: #F7F3EE; --text: #2A2529; --accent: #C8553D; }

@media (prefers-color-scheme: dark) {
  :root { --bg: #141113; --text: #F2EDE8; --accent: #FA9B59; }
}

:root[data-theme="dark"] { --bg: #141113; --text: #F2EDE8; --accent: #FA9B59; }

Первый блок — светлая тема по умолчанию, медиазапрос подхватывает системную тёмную тему, а атрибут data-theme позволяет переключать тему вручную. О выборе цветов — в статье цвета для тёмной темы.

Динамическая палитра из JavaScript

Переменные можно менять на лету:

document.documentElement.style.setProperty('--accent', '#40ACC5');

Так работает наш генератор: после анализа фото акцент интерфейса становится главным цветом снимка.

Частые вопросы

Работают ли CSS-переменные во всех браузерах?

Да, все современные браузеры поддерживают custom properties.

Можно ли использовать переменные в Tailwind?

Да: в конфигурации задайте цвета как var(--accent), и утилиты вроде bg-accent будут брать значение из переменной.

Как передать палитру в градиент?

background: linear-gradient(135deg, var(--accent), var(--surface)); — подробнее в статье CSS-градиент из фото.

Проявите палитру своего фото

Бесплатный генератор: 5–8 цветов с HEX, RGB и HSL, CSS-градиент и PNG-карточка за пару секунд.

Получить палитру