Вёрстка сайта с использованием 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) и единообразие. Свяжитесь с нами — оценим ваш проект и предложим оптимальное решение. Получите консультацию по внедрению — оценим ваш проект бесплатно.







