Вёрстка сайта с использованием CSS Custom Properties (переменные)
Представьте: интернет-магазин с 50 000 товаров, цвета бренда меняются каждый сезон. Раньше нужно было переписывать 2000 строк SCSS, пересобирать стили и ждать деплоя. С CSS Custom Properties мы сократили это до изменения одной строки в JavaScript — и цвета обновились на всех страницах за миллисекунды. Экономия времени на каждом обновлении — 8 часов. Мы занимаемся вёрсткой с CSS Custom Properties более 5 лет, внедрили токены в 30+ проектах. Средняя экономия на поддержке стилей — 150 человеко-часов в год. Свяжитесь с нами — обсудим ваш проект и оценим возможность внедрения.
Почему CSS Custom Properties лучше препроцессорных переменных?
Переменные SCSS/Sass компилируются в статические значения — их нельзя изменить в рантайме. Custom Properties живут в DOM: каскадируются, наследуются, доступны из JavaScript. Это единственный способ сделать полноценную темизацию без пересборки CSS. Согласно MDN, кастомные свойства наследуются по дереву элементов, что позволяет переопределять их в медиа-запросах и контекстах.
| Характеристика | CSS Custom Properties | SCSS-переменные |
|---|---|---|
| Изменение через JS | Да | Нет |
| Наследование по DOM | Да | Нет |
| Медиа-запросы | Да | Нет |
| Анимация | Да (с @property) | Нет |
| Тёмная тема | Да — один переключатель | Требуется несколько файлов |
Какие проблемы решают CSS Custom Properties на практике?
Проблема 1: Управление цветовой схемой. Хардкод цветов в каждом компоненте превращает обновление палитры в ад. С токенами меняем --color-accent в одном месте — и вся сетка, кнопки, иконки обновляются мгновенно. Обычно мы наблюдаем сокращение CSS на 30%.
Проблема 2: Адаптивные размеры без медиа-запросов. Раньше под каждый брейкпоинт нужно было писать отдельные правила. Используем clamp() с кастомными свойствами — получается fluid typography, которая подстраивается под любую ширину экрана. Количество медиа-запросов уменьшается на 50%.
Проблема 3: Анимация свойств, которые раньше были неанимируемыми. Например, вращение градиента или числовой прогресс. @property регистрирует тип, и браузер начинает интерполировать значение. Это открывает новые возможности для UI-эффектов.
Как мы строим систему токенов: кейс из практики
Один из проектов — интернет-магазин электроники. Изначально использовались SCSS-переменные с жёстко заданными цветами. Каждое обновление дизайна требовало пересборки и деплоя, занимало 2 дня. Мы внедрили трёхуровневую систему токенов:
- Примитивы: базовые цвета, отступы, радиусы.
- Семантические токены: --color-bg-primary, --color-text-primary.
- Компонентные переменные: --btn-bg, --card-padding.
:root {
--color-blue-500: #3b82f6;
--color-gray-50: #f9fafb;
--space-4: 1rem;
--radius-md: 8px;
--color-bg-primary: var(--color-gray-50);
--color-accent: var(--color-blue-500);
}
[data-theme="dark"] {
--color-bg-primary: #0f172a;
--color-accent: #60a5fa;
}
.button {
--btn-bg: var(--color-accent);
background-color: var(--btn-bg);
padding: var(--space-1) var(--space-4);
border-radius: var(--radius-md);
}Результат: теперь дизайнер меняет цвета в Figma — Style Dictionary автоматически генерирует new CSS, а мы обновляем одну строку в коде. Время на ребрендинг сократилось с 2 дней до 2 часов (93% ускорение). Закажите аудит ваших стилей — узнайте, сколько можно сэкономить.
Пошаговый план внедрения CSS Custom Properties
- Аудит текущих стилей — ищем хардкод цветов, отступов, шрифтов. Определяем частоту изменений.
- Проектирование системы токенов — выделяем примитивы, семантику, компонентные переменные.
- Создание CSS-файла с токенами — :root для светлой темы, [data-theme="dark"] для тёмной.
- Рефакторинг компонентов — заменяем статические значения на var().
- Интеграция с Figma — подключаем Style Dictionary для автоматического экспорта.
- Тестирование контрастности и регрессии — проверяем WCAG AA, визуальное совпадение pixel-perfect.
Типичные ошибки при внедрении
- Забыли зарегистрировать числовые свойства через @property перед анимацией.
- Использовали var() без fallback — при ошибке свойство ломается.
- Переопределили токен на неправильном селекторе — сбой каскада.
- Не задали initial-value для @property — анимация не работает.
- Перепутали примитивы и семантику — система становится непрозрачной.
Как управлять стилями через JavaScript?
Custom Properties — мост между логикой и дизайном. Меняем цвет акцента программно:
document.documentElement.style.setProperty('--color-accent', '#8b5cf6'); // Динамический parallax
window.addEventListener('scroll', () => {
const progress = window.scrollY / document.body.scrollHeight;
document.documentElement.style.setProperty('--scroll-progress', progress);
});Для плавного изменения значения используют requestAnimationFrame или CSS-переходы.
Как автоматизировать экспорт токенов из Figma?
Используем Style Dictionary: он читает JSON-файлы и генерирует CSS-переменные. Figma-плагины экспортируют значения цветов, отступов и шрифтов. Style Dictionary преобразует их в :root с кастомными свойствами. Это исключает ручное копирование и рассинхронизацию.
Что такое @property и как он расширяет возможности CSS?
Без регистрации типа браузер не интерполирует кастомное свойство. Документация CSS @property объясняет синтаксис. Пример:
@property --gradient-angle {
syntax: '<angle>';
initial-value: 0deg;
inherits: false;
}
.element {
--gradient-angle: 0deg;
background: conic-gradient(from var(--gradient-angle), blue, purple);
animation: rotate 3s linear infinite;
}
@keyframes rotate {
to {
--gradient-angle: 360deg;
}
} Интеграция с инструментами
Для старых браузеров используем PostCSS с плагином postcss-custom-properties. Style Dictionary экспортирует токены из Figma:
// postcss.config.js
module.exports = {
plugins: [
require('postcss-custom-properties')({
preserve: true,
}),
],
};
// style-dictionary.config.mjs
export default {
source: ['tokens/**/*.json'],
platforms: {
css: {
transformGroup: 'css',
files: [
{
destination: 'src/styles/tokens.css',
format: 'css/variables',
options: {
selector: ':root'
},
},
],
},
},
}; Как сделать адаптивные значения без media queries?
Fluid typography с помощью clamp():
:root { --font-size-h1: clamp(1.75rem, 4vw + 0.5rem, 3.5rem); --section-padding: clamp(3rem, 8vw, 8rem); } Это автоматически масштабирует элементы в зависимости от ширины вьюпорта без точек перелома.
Сроки и что вы получаете
Первичная настройка системы токенов (примитивы + семантика + light/dark) занимает от 4 до 6 часов. Миграция готового проекта — от 1 до 2 дней в зависимости от объёма CSS. Интеграция с Figma через Style Dictionary настраивается один раз и автоматизирует экспорт токенов.
| Этап | Время | Результат |
|---|---|---|
| Аудит стилей | 2-4 часа | Список хардкода |
| Проектирование токенов | 4-6 часов | Документация токенов |
| Рефакторинг CSS | 1-2 дня | Замены var() |
| Интеграция с Figma | 2-3 часа | Автоэкспорт |
Мы гарантируем, что каждый токен проверен на контрастность (AA) и единообразие. Свяжитесь с нами — оценим ваш проект и предложим оптимальное решение. Обсудим внедрение — оценим ваш проект.







