Переменные
Что такое переменные
Переменные SCSS — именованные значения, используемые многократно.
$primary: #c1442e;
$radius: 10px;
$font-base: 'Inter', sans-serif;
.button {
background: $primary;
border-radius: $radius;
font-family: $font-base;
}
Что даёт:
- Меняешь в одном месте — применяется везде.
- Единый стиль.
- Проще поддерживать.
Синтаксис
$name: value;
Правила имён:
- Начинается с
$. - Дефисы и подчёркивания эквивалентны (
$color-primary=$color_primary). - Обычно kebab-case:
$color-primary,$font-size-lg.
Правило: один стиль имён во всём проекте.
Типы значений
$number: 16px;
$color: #c1442e;
$string: 'Inter';
$bool: true;
$null: null;
$list: 1px 2px 3px 4px;
$map: (primary: #c1442e, secondary: #2e86c1);
Что можно:
- Числа, цвета, строки.
- Списки, map (ассоциативные массивы).
- Boolean.
Область видимости
Глобальные — видны везде:
$primary: #c1442e;
Локальные — внутри блока:
.button {
$padding: 12px 24px;
padding: $padding;
}
// $padding недоступна здесь
Правило: глобальные переменные — в _variables.scss. Локальные — только если реально нужны.
!default
Значение по умолчанию — переопределяемое:
$primary: #c1442e !default;
Что даёт: если переменная не задана до этого — берётся значение. Если задана — сохраняется.
Пример:
// config.scss
$primary: #c1442e !default;
// main.scss
$primary: #0066cc; // переопределяем
@use 'config'; // $primary = #0066cc
Правило: !default — для тем, библиотек, настраиваемых модулей.
!global
Изменение глобальной переменной из локальной области:
$counter: 0;
.block {
$counter: 1 !global;
}
// $counter теперь 1
⚠️ Использовать осторожно. Признак плохой архитектуры.
Правило: почти никогда не нужно.
CSS-переменные vs SCSS-переменные
SCSS-переменная:
$primary: #c1442e;
.button {
background: $primary;
}
CSS-переменная:
:root {
--primary: #c1442e;
}
.button {
background: var(--primary);
}
Разница:
- SCSS — компилируется, значения вставлены напрямую в CSS.
- CSS — работают в браузере, можно менять через JS, наследуются.
Когда что:
- SCSS — для конфигов (цвета темы, размеры сетки).
- CSS — для runtime (тёмная тема, динамика).
Комбинирование
$primary: #c1442e;
$radius: 10px;
:root {
--primary: #{$primary};
--radius: #{$radius};
}
.button {
background: var(--primary); // runtime
border-radius: var(--radius);
}
Что даёт: SCSS для сборки, CSS для runtime.
Правило: значения задаются в SCSS, но живут в CSS-переменных.
Типичная структура переменных
_variables.scss:
// Цвета
$color-primary: #c1442e;
$color-primary-hover: #a83926;
$color-secondary: #2e86c1;
$color-success: #10b981;
$color-danger: #ef4444;
$color-warning: #f59e0b;
$color-bg: #fafafa;
$color-surface: #ffffff;
$color-border: #e5e5e5;
$color-text: #1a1a1a;
$color-text-muted: #6b6b6b;
// Типографика
$font-sans: 'Inter', system-ui, sans-serif;
$font-mono: 'JetBrains Mono', ui-monospace, monospace;
$font-size-xs: 12px;
$font-size-sm: 14px;
$font-size-base: 16px;
$font-size-lg: 18px;
$font-size-xl: 24px;
$font-size-2xl: 32px;
$line-height-tight: 1.2;
$line-height-base: 1.6;
// Отступы
$space-1: 4px;
$space-2: 8px;
$space-3: 12px;
$space-4: 16px;
$space-5: 24px;
$space-6: 32px;
$space-8: 48px;
// Скругления
$radius-sm: 4px;
$radius: 10px;
$radius-lg: 16px;
$radius-full: 999px;
// Тени
$shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
$shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
$shadow-lg: 0 12px 40px rgba(0, 0, 0, 0.15);
// Breakpoints
$breakpoint-sm: 480px;
$breakpoint-md: 768px;
$breakpoint-lg: 1024px;
$breakpoint-xl: 1280px;
// z-index
$z-dropdown: 100;
$z-sticky: 200;
$z-modal: 500;
$z-tooltip: 1000;
// Тайминги
$transition-fast: 0.15s;
$transition-base: 0.25s;
$transition-slow: 0.4s;
Использование с @use
Современный способ:
// _variables.scss
$primary: #c1442e;
// main.scss
@use 'variables' as v;
.button {
background: v.$primary;
}
С namespace: v.$primary.
Без namespace:
@use 'variables' as *;
.button {
background: $primary;
}
⚠️ as * — риск конфликтов имён. Лучше с префиксом.
Правило: @use 'variables' as v — чисто и понятно.
Карты (Map)
Группировка связанных значений:
$colors: (
primary: #c1442e,
secondary: #2e86c1,
success: #10b981,
danger: #ef4444,
);
.button--primary {
background: map-get($colors, primary);
}
.button--danger {
background: map-get($colors, danger);
}
Что даёт: связанные значения в одном месте.
Цикл по карте
@each $name, $color in $colors {
.text-#{$name} {
color: $color;
}
}
Что даёт: классы .text-primary, .text-secondary и т.д. автоматически.
Вычисления
$base: 16px;
$scale: 1.25;
$font-lg: $base * $scale; // 20px
$font-xl: $base * $scale * $scale; // 25px
$half: $base / 2; // 8px
Правило: SCSS умеет математику. Использовать для размеров.
Конфликты имён
Проблема:
$size: 16px; // глобально
$size: 32px; // другая часть проекта — перезаписал
Решение:
- Namespace через
@use 'variables' as v. - Префиксы:
$color-primary,$space-4.
Практика
1. Создайте _variables.scss с цветами, типографикой, отступами.
2. Используйте через @use 'variables' as v.
3. Сделайте карту цветов и цикл по ней.
4. Скомпилируйте, проверьте CSS.
5. Попробуйте !default для кастомизации.
Частые ошибки
1. Глобальные переменные в каждом файле:
// В _buttons.scss
$primary: #c1442e; // дублирует
Решение: только в _variables.scss.
2. Не использовать @use:
@import 'variables'; // устарело
Решение: @use 'variables' as v.
3. !global без причины:
Признак плохой архитектуры
Решение: перепроектировать.
4. SCSS-переменные для тёмной темы:
Не работает в runtime
Решение: CSS-переменные.
5. Карта без namespace:
map-get($colors, primary); // какой $colors?
Решение: map-get(v.$colors, primary).
6. Слишком много переменных:
300 переменных, никто не помнит
Решение: сгруппировать по смыслу.
7. Дубли цветов:
$blue1: #0066cc;
$blue2: #0055aa;
$blue3: #004488;
Решение: один primary + функции.
8. Нет комментариев:
Что такое $lg? 1024px или 1280px?
Решение: группировать и комментировать.
Итог
- Синтаксис:
$name: value;. - Kebab-case в именах.
- Глобальные — в
_variables.scss. !default— для настраиваемых значений.- CSS-переменные — для runtime.
- SCSS-переменные — для сборки.
- Map — для связанных значений.
@use 'variables' as v— современный способ.- Комбинировать SCSS + CSS-переменные.
- Не дублировать значения.
Дальше — вложенность (nesting).