CSS-переменные (Custom Properties)

Основы фронтенд разработки

CSS-переменные (Custom Properties)

Продолжительность: 15 мин

В CSS принято писать значения напрямую: color: #4a90e2, border-radius: 8px, gap: 24px. Это работает, но стоит захотеть изменить основной цвет — придётся искать по всему файлу и менять его в десятках мест. CSS-переменные решают эту проблему.

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

CSS-переменные (официальное название — CSS Custom Properties) позволяют задать значение один раз, присвоить ему имя и затем использовать это имя везде в стилях. Имена переменных всегда начинаются с двух дефисов --:

:root { --color-primary: #4a90e2; --border-radius: 8px; --gap: 24px; }
css

Псевдокласс :root — это корневой элемент документа (<html>). Переменные, объявленные в нём, доступны на всей странице.

Чтобы использовать переменную, пишем функцию var():

.button { background: var(--color-primary); border-radius: var(--border-radius); padding: 12px var(--gap); } .card { border-radius: var(--border-radius); gap: var(--gap); }
css

Теперь, если нужно изменить скругление — достаточно поправить одну строку в :root.

Запасное значение

var() принимает второй аргумент — запасное значение на случай, если переменная не определена:

.button { background: var(--color-accent, #e2574a); }
css

Если --color-accent нигде не объявлена, будет использовано #e2574a. Это редко нужно в своих проектах, но полезно при создании библиотек компонентов.

Область видимости

Переменные работают по тем же правилам каскада, что и обычные CSS-свойства. Переменная видна элементу и всем его потомкам. Это позволяет переопределять переменные в отдельных блоках:

:root { --color-bg: #ffffff; --color-text: #1a1a1a; } .dark-section { --color-bg: #1a1a1a; --color-text: #ffffff; /* все дочерние элементы .dark-section автоматически получат тёмные цвета через var() */ background: var(--color-bg); color: var(--color-text); }
css

Переменные и медиазапросы

Вот где переменные раскрываются по-настоящему. Вместо того чтобы переписывать десятки правил в медиазапросе, можно изменить всего несколько переменных — и всё, что их использует, обновится автоматически:

:root { --container-width: 1200px; --section-padding: 80px 20px; --font-size-hero: 56px; --grid-columns: 3; } @media (max-width: 1024px) { :root { --grid-columns: 2; --font-size-hero: 40px; --section-padding: 60px 16px; } } @media (max-width: 768px) { :root { --grid-columns: 1; --font-size-hero: 32px; --section-padding: 40px 16px; } }
css

Теперь все блоки, которые используют var(--section-padding) или var(--font-size-hero), автоматически адаптируются — и вам не нужно прописывать медиазапрос отдельно для каждого из них.

Тёмная тема

Самый популярный пример применения переменных — переключение тёмной темы. Задаём все цвета как переменные, и меняем их при добавлении класса на body:

:root { --color-bg: #ffffff; --color-surface: #f5f5f5; --color-text: #1a1a1a; --color-text-secondary: #666666; --color-primary: #4a90e2; } body.dark { --color-bg: #121212; --color-surface: #1e1e1e; --color-text: #f0f0f0; --color-text-secondary: #aaaaaa; --color-primary: #60a5fa; } body { background: var(--color-bg); color: var(--color-text); } .card { background: var(--color-surface); }
css

Клик по кнопке переключения — один classList.toggle('dark') на body — и вся страница меняет тему мгновенно.

Переменные и calc()

Переменные отлично работают с функцией calc(), что позволяет строить гибкие зависимости между значениями:

:root { --spacing-base: 8px; } .card { padding: calc(var(--spacing-base) * 2); /* 16px */ margin-bottom: calc(var(--spacing-base) * 3); /* 24px */ }
css

Переменные и JavaScript

Через JavaScript можно читать и менять CSS-переменные в реальном времени:

const root = document.documentElement; // Читаем переменную const primary = getComputedStyle(root).getPropertyValue('--color-primary'); // Меняем переменную root.style.setProperty('--color-primary', '#e2574a');
js

Это открывает возможности для динамических тем, анимаций на основе положения курсора и многого другого. Подробнее — на doka.guide/css/custom-properties.

Итого

CSS-переменные — один из тех инструментов, которые начинаешь использовать и уже не хочется без них. Основное:

  • объявляются в :root для глобального доступа, на селекторе — для локального;
  • используются через var(--name), можно указать запасное значение;
  • меняются в медиазапросах — и всё, что их использует, адаптируется автоматически;
  • позволяют легко реализовать тёмную тему;
  • доступны из JavaScript.

Это завершающий урок второго модуля. Мы прошли путь от базовых CSS-селекторов до современных инструментов вроде grid, анимаций и переменных. В следующем модуле переходим к изучению JavaScript.

Это платный урок

Выберите тариф, чтобы открыть полный доступ к курсу

Самостоятельный

Учитесь в своём темпе. Всё, что нужно, чтобы освоить основы.

4 9007 900
Скидка 38%
  • Доступ ко всем урокам навсегда
  • Практические задания с автоматической проверкой кода в SourceCraft
  • Два проекта для портфолио
  • Первый модуль — бесплатно, без регистрации
  • Возврат денег в течение 14 дней
Популярный

С поддержкой

Личное код-ревью и прямая связь с автором, чтобы не застрять.

10 90013 900
Скидка 22%
  • Всё из тарифа «Самостоятельный»
  • Личное код-ревью ваших заданий от автора
  • Чат с автором в Telegram или MAX — задавайте любые вопросы
  • Одна персональная видеовстреча 30 минут

Премиум

Максимальное сопровождение: разбор кода вживую и еженедельные созвоны.

25 00029 000
Скидка 14%
  • Всё из тарифа «С поддержкой»
  • Живое код-ревью в реальном времени
  • Персональная видеовстреча 30 минут каждую неделю — 2 месяца (8 встреч)
  • Чат с автором в Telegram или MAX на всё время обучения
Безопасная оплата через ЮKassa · возврат в течение 14 дней

Комментарии

Войдите, чтобы оставить комментарий