CSS-переменные (они же кастомные свойства) — это не просто модный тренд, а мощный инструмент, который может упростить жизнь любому разработчику. Особенно если вы, как и я, пишете на PHP и часто верстаете шаблоны. В этой статье мы разберемся, как работают кастомные свойства, где их применять и как не наступить на грабли.
Что такое CSS-переменные и зачем они нужны
Представьте, что вы пишете тему для WordPress или админку на Laravel. У вас куча стилей: цвета, отступы, шрифты. И вдруг заказчик просит поменять синий цвет на зеленый. Если вы использовали обычный CSS, придется лезть в каждый файл и менять вручную. А если переменные — вы меняете одно значение, и всё обновляется само.
Кастомные свойства — это сущности, которые хранят значения CSS-свойств. Они объявляются с двумя дефисами (например, --main-color) и вызываются через функцию var(). Работают они во всех современных браузерах, так что бояться не стоит.
Как объявлять и использовать кастомные свойства
Синтаксис простой. Объявляете переменную внутри селектора (чаще всего в :root для глобального доступа):
:root {
--primary-color: #3498db;
--padding-base: 16px;
--font-size-large: 24px;
}А потом используете:
.button {
background-color: var(--primary-color);
padding: var(--padding-base);
font-size: var(--font-size-large);
}Можно задать значение по умолчанию, если переменная не определена:
.button {
background-color: var(--primary-color, #333);
}Это удобно, когда вы подключаете сторонние стили и не уверены, что переменная существует.
Область видимости и наследование
Кастомные свойства наследуются, как и обычные CSS-свойства. Если вы объявили переменную в родительском элементе, она будет доступна всем дочерним элементам, если её не переопределить.
Пример:
.card {
--card-bg: #f0f0f0;
}
.card__title {
background-color: var(--card-bg); /* сработает */
}Но если внутри .card__title вы объявите свою --card-bg, она перекроет родительскую. Это работает как локальные переменные в PHP — приоритет у самого вложенного объявления.
:root, а локальные — в конкретных компонентах. Это упрощает поддержку и читаемость кода.Динамическое изменение через JavaScript
Это одна из самых крутых фишек. Вы можете менять CSS-переменные на лету с помощью JS. Например, для смены темы (темная/светлая) или анимации.
// Меняем цвет фона для всей страницы
document.documentElement.style.setProperty('--primary-color', '#e74c3c');
// Или для конкретного элемента
const card = document.querySelector('.card');
card.style.setProperty('--card-bg', '#ffcc00');В PHP это тоже можно использовать, например, при генерации шаблона:
$color = '#2ecc71'; // Из базы данных
echo "<style>:root { --primary-color: $color; }</style>";Так вы можете динамически подстраивать стили под пользовательские настройки.
Практические примеры из жизни PHP-разработчика
Допустим, у вас есть интернет-магазин на Laravel. Каждый товар имеет свой цвет акцента (например, для категории «Электроника» — синий, для «Одежды» — розовый). С помощью CSS-переменных это реализуется легко:
// В контроллере
$accentColor = $category->accent_color ?? '#333';
return view('product', compact('accentColor'));
// В Blade-шаблоне
<style>
:root {
--accent: {{ $accentColor }};
}
.product-card {
border-color: var(--accent);
}
.product-card__price {
color: var(--accent);
}
</style>Всё чисто, без дублирования стилей. Если завтра понадобится поменять цвет — меняете в базе, и всё обновляется.
Ещё один случай — создание кастомных виджетов. Например, вы пишете плагин для WordPress и хотите, чтобы пользователь мог настроить цвета через админку. Вы сохраняете значения в опциях, а затем выводите их в :root.
Сравнение CSS-переменных и препроцессоров (Sass, Less)
Многие привыкли использовать переменные в Sass или Less. Но у CSS-переменных есть преимущества и недостатки. Сравним в таблице:
| Характеристика | CSS-переменные | Sass/Less переменные |
|---|---|---|
| Область видимости | Наследуются, можно переопределять в любом селекторе | Только в рамках компиляции, глобальные или локальные |
| Изменение в рантайме | Да, через JS | Нет, только на этапе компиляции |
| Поддержка браузерами | Современные (IE не поддерживает) | Не зависит от браузера (компилируется в обычный CSS) |
| Возможность использовать в медиа-запросах | Да (но аккуратно, есть нюансы) | Да, на этапе компиляции |
| Вычисление значений | Только через calc() | Математические операции напрямую |
Вывод: CSS-переменные лучше для динамических тем и виджетов, а препроцессоры — для статичных проектов, где важна производительность на этапе сборки.
Типичные ошибки и как их избежать
- Забыли объявить переменную. Если вы используете
var(--undefined), браузер проигнорирует свойство. Всегда задавайте fallback. - Путаница с областью видимости. Если вы объявили переменную внутри
.card, она не будет доступна в.footer. Используйте:rootдля глобальных. - Попытка использовать в медиа-запросах. Технически можно, но работает нестабильно. Лучше использовать препроцессорные переменные для брейкпоинтов.
- Имена с пробелами или спецсимволами. CSS-переменные чувствительны к регистру и не любят пробелы. Используйте дефисы или camelCase.
Что в итоге
CSS-переменные — это не замена препроцессорам, а дополнение. Они дают гибкость в рантайме, упрощают поддержку тем и интеграцию с бэкендом. Как PHP-разработчик, вы можете выиграть, используя их для динамической генерации стилей. Начните с малого: вынесите основные цвета в :root и попробуйте поменять их через JS. Увидите, как это удобно.
Студия WNDER



