CSS

CSS-переменные

Кастомные свойства: :root, var(), переопределение, динамические значения.

Средний (Intermediate)

Кратко

CSS-переменные (custom properties) — переиспользуемые значения, определённые через --name и используемые через var(--name). Определяются в :root для глобального доступа. Можно переопределять в контекстах. Делают CSS гибким и легкоизменяемым.


Подробно

Определение CSS-переменных: :root { --primary: #3498db; --spacing: 1rem; --font-body: 'Inter', sans-serif; }

Использование: .button { background: var(--primary); padding: var(--spacing); font-family: var(--font-body); }

Значение по умолчанию: color: var(--text, #333); /* Если --text не определён, использует #333 */

Переопределение: .dark { --primary: #2980b9; --bg: #1a1a2e; } /* Все элементы внутри .dark используют новые значения */

Каскадирование: CSS-переменные наследуются и каскадируются как обычные свойства!

Динамические значения: С помощью JavaScript: element.style.setProperty('--primary', '#e74c3c');

Преимущества:

  • Один источник правды (DRY)
  • Легкая смена темы
  • Переопределение в контексте
  • Динамические значения через JS

Ментальная модель

CSS-переменные — как настройки в игре. --primary: синий — базовый цвет. В .dark: --primary: тёмно-синий — другой скин. Всё остальное (кнопки, ссылки) автоматически меняется!


Примеры

**Самый простой:**

css
:root {
  --color: #333;
  --bg: white;
}

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

.dark {
  --color: #fff;
  --bg: #1a1a2e;
}

Базовые переменные и тема dark.

**Простой:**

css
/* Дизайн-система */
:root {
  /* Цвета */
  --primary: hsl(210, 80%, 50%);
  --primary-hover: hsl(210, 80%, 40%);
  --text: hsl(220, 15%, 20%);
  --text-muted: hsl(220, 10%, 45%);
  --bg: hsl(0, 0%, 98%);
  --border: hsl(220, 15%, 88%);

  /* Отступы */
  --space-xs: 0.25rem;
  --space-sm: 0.5rem;
  --space-md: 1rem;  --space-lg: 1.5rem;
  --space-xl: 2rem;

  /* Тени */
  --shadow-sm: 0 1px 2px rgba(0,0,0,0.05);
  --shadow-md: 0 4px 6px rgba(0,0,0,0.1);
}

.card {
  padding: var(--space-lg);
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: 8px;
  box-shadow: var(--shadow-sm);
}

.btn-primary {
  background: var(--primary);
  padding: var(--space-sm) var(--space-md);
}

.btn-primary:hover {
  background: var(--primary-hover);
}

Дизайн-система с переменными для цветов, отступов и теней.

**Реальный пример:**

css
/* Полная тема */
:root {
  --color-primary: hsl(210, 80%, 50%);
  --color-bg: hsl(0, 0%, 100%);
  --color-text: hsl(220, 15%, 15%);
  --color-surface: hsl(0, 0%, 98%);
  --shadow: 0 1px 3px rgba(0,0,0,0.1);
  --radius: 8px;
  --transition: 0.2s ease;
}

.dark {
  --color-primary: hsl(210, 80%, 60%);
  --color-bg: hsl(220, 20%, 10%);
  --color-text: hsl(0, 0%, 90%);
  --color-surface: hsl(220, 20%, 15%);
  --shadow: 0 1px 3px rgba(0,0,0,0.3);
}

/* Контекстное переопределение */
.card-accent {
  --color-primary: hsl(35, 100%, 55%);
}

.card-accent .btn {
  background: var(--color-primary);
}

/* JS-динамика */
.progress-bar {
  width: calc(var(--progress, 0) * 1%);
  background: var(--color-primary);
  transition: width var(--transition);
}

/* Вычисления */
.spacing-component {
  padding: calc(var(--space-md) * 1.5);
  margin-bottom: var(--space-lg);
}

Полная тема: dark mode, контекстное переопределение, JS-динамика.


Частые ошибки

**Неправильно:** Не использовать CSS-переменные

**Почему:** Хардкод значений = правки в 20 файлах при смене темы. Переменные = один источник правды.

**Правильно:** Определите базовые значения в :root и используйте var() везде.

**Неправильно:** Путать CSS-переменные и Sass-переменные

**Почему:** Sass-переменные ($var) — компилируются в CSS. CSS-переменные (--var) — работают в браузере, динамические.

**Правильно:** CSS-переменные (--name) — runtime. Sass-переменные ($name) — build time.

**Неправильно:** Забывать значение по умолчанию

**Почему:** Если переменная не определена, свойство не применяется.

**Правильно:** color: var(--text, #333); — fallback, если переменная не найдена.


Важно запомнить

  • :root { --name: value; } — определение переменных
  • var(--name) — использование переменных
  • var(--name, fallback) — значение по умолчанию
  • Переменные наследуются и каскадируются
  • Переопределение в контексте (.dark { --primary: ... })

Связь

Назад: Вы знаете псевдо-классы и псевдо-элементы (C17) — переменные делают динамические стили поддерживаемыми.

Вперёд: В следующем уроке (C19) вы изучите стилизацию форм: кнопки, поля ввода и кастомные контролы.

Материалы курса CSS — PROlab Academy.