CSS-переменные
Free PreviewВ 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.