Переменные
Переменные Sass просты: вы присваиваете значение имени, начинающемуся с $, а затем можете ссылаться на это имя вместо самого значения. Но, несмотря на свою простоту, они являются одним из самых полезных инструментов, которые Sass предоставляет. Переменные позволяют сократить повторение, выполнять сложные математические операции, настраивать библиотеки и многое другое.
Объявление переменной очень похоже на объявление свойства: оно записывается <variable>: <expression>. В отличие от свойства, которое может быть объявлено только в правиле стиля или в правиле @-правиле, переменные могут быть объявлены где угодно. Чтобы использовать переменную, просто включите её в значение.
$base-color: #c6538c;
$border-dark: rgba($base-color, 0.88);
.alert {
border: 1px solid $border-dark;
}// SASS $base-color: #c6538c $border-dark: rgba($base-color, 0.88) .alert border: 1px solid $border-dark
/* CSS */
.alert {
border: 1px solid rgba(198, 83, 140, 0.88);
}CSS имеет свои собственные переменные, которые совершенно отличаются от переменных Sass. Знайте разницу!
-
Переменные Sass полностью компилируются Sass. Переменные CSS включаются в выходной CSS.
-
Переменные CSS могут иметь разные значения для разных элементов, но переменные Sass имеют только одно значение за раз.
-
Переменные Sass являются императивными, что означает, что если вы используете переменную, а затем меняете её значение, предыдущее использование останется прежним. Переменные CSS являются декларативными, что означает, что если вы измените значение, оно повлияет как на предыдущие, так и на последующие использования.
$variable: value 1;
.rule-1 {
value: $variable;
}
$variable: value 2;
.rule-2 {
value: $variable;
}// SASS $variable: value 1 .rule-1 value: $variable $variable: value 2 .rule-2 value: $variable
/* CSS */
.rule-1 {
value: value 1;
}
.rule-2 {
value: value 2;
}💡 Интересный факт:
Переменные Sass, как и все идентификаторы Sass, рассматривают дефисы и подчеркивания как идентичные. Это означает, что $font-size и $font_size оба ссылаются на одну и ту же переменную. Это историческое наследие из самых ранних дней Sass, когда он только допускал подчеркивания в именах идентификаторов. Когда Sass добавил поддержку дефисов для соответствия синтаксису CSS, оба символа были сделаны эквивалентными для упрощения миграции.
Значения по умолчанию
Обычно, когда вы присваиваете значение переменной, если у этой переменной уже было значение, её старое значение перезаписывается. Но если вы пишете библиотеку Sass, вы можете захотеть позволить своим пользователям настроить переменные вашей библиотеки перед тем, как использовать их для генерации CSS.
Для этого Sass предоставляет флаг !default. Это присваивает значение переменной только если эта переменная не определена или её значение равно null. В противном случае используется существующее значение.
Настройка модулей
- Dart Sass
- с версии 1.23.0
- LibSass
- ✗
- Ruby Sass
- ✗
Только Dart Sass в настоящее время поддерживает @use. Пользователи других реализаций должны использовать правило @import вместо этого.
Переменные, определённые с помощью !default, могут быть настроены при загрузке модуля с помощью правила @use. Библиотеки Sass часто используют !default переменные, чтобы позволить их пользователям настраивать CSS библиотеки.
Чтобы загрузить модуль с настройкой, запишите @use <url> with (<variable>: <value>, <variable>: <value>). Настроенные значения перезапишут значения по умолчанию переменных. Только переменные, написанные на верхнем уровне стилевого файла с флагом !default, могут быть настроены.
// _library.scss
$black: #000 !default;
$border-radius: 0.25rem !default;
$box-shadow: 0 0.5rem 1rem rgba($black, 0.15) !default;
code {
border-radius: $border-radius;
box-shadow: $box-shadow;
}
// style.scss @use 'library' with ( $black: #222, $border-radius: 0.1rem );
// SASS // _library.sass $black: #000 !default $border-radius: 0.25rem !default $box-shadow: 0 0.5rem 1rem rgba($black, 0.15) !default code border-radius: $border-radius box-shadow: $box-shadow
// SASS // style.sass @use 'library' with ($black: #222, $border-radius: 0.1rem)
/* CSS */
code {
border-radius: 0.1rem;
box-shadow: 0 0.5rem 1rem rgba(34, 34, 34, 0.15);
}Встроенные переменные
Переменные, определённые встроенным модулем, не могут быть изменены.
@use "sass:math" as math; // This assignment will fail. math.$pi: 0;
// SASS @use "sass:math" as math // This assignment will fail. math.$pi: 0
Область видимости
Переменные, объявленные на верхнем уровне стилевого файла, являются глобальными. Это означает, что к ним можно получить доступ в любом месте модуля после их объявления. Но это не относится ко всем переменным. Переменные, объявленные в блоках (фигурные скобки в SCSS или отступы в Sass), обычно являются локальными и могут быть доступны только внутри блока, в котором они были объявлены.
$global-variable: global value;
.content {
$local-variable: local value;
global: $global-variable;
local: $local-variable;
}
.sidebar {
global: $global-variable;
// This would fail, because $local-variable isn't in scope:
// local: $local-variable;
}// SASS $global-variable: global value .content $local-variable: local value global: $global-variable local: $local-variable .sidebar global: $global-variable // This would fail, because $local-variable isn't in scope: // local: $local-variable
/* CSS */
.content {
global: global value;
local: local value;
}
.sidebar {
global: global value;
}Затенение
Локальные переменные могут быть объявлены даже с тем же именем, что и глобальная переменная. В этом случае на самом деле существуют две разные переменные с одинаковым именем: одна локальная и одна глобальная. Это помогает гарантировать, что автор, создающий локальную переменную, не изменит случайно значение глобальной переменной, о которой он даже не знает.
$variable: global value;
.content {
$variable: local value;
value: $variable;
}
.sidebar {
value: $variable;
}// SASS $variable: global value .content $variable: local value value: $variable .sidebar value: $variable
/* CSS */
.content {
value: local value;
}
.sidebar {
value: global value;
}Если вам нужно установить значение глобальной переменной из локальной области (например, в миксине), вы можете использовать флаг !global. Объявление переменной с флагом !global всегда будет присваивать значение глобальной области видимости.
$variable: first global value;
.content {
$variable: second global value !global;
value: $variable;
}
.sidebar {
value: $variable;
}// SASS $variable: first global value .content $variable: second global value !global value: $variable .sidebar value: $variable
/* CSS */
.content {
value: second global value;
}
.sidebar {
value: second global value;
}- Dart Sass
- с версии 2.0.0
- LibSass
- ✗
- Ruby Sass
- ✗
Более старые версии Sass допускали использование !global для переменной, которая ещё не существует. Это поведение было устаревшим, чтобы убедиться, что каждый стилевой файл объявляет одинаковые переменные независимо от того, как он выполняется.
Флаг !global может использоваться только для установки значения переменной, которая уже была объявлена на верхнем уровне файла. Он не может использоваться для объявления новой переменной.
Область видимости управления потоком
Переменные, объявленные в правилах управления потоком, имеют особые правила области видимости: они не затеняют переменные на том же уровне, что и правило управления потоком. Вместо этого они просто присваивают значение этим переменным. Это значительно упрощает условное присвоение значения переменной или построение значения в рамках цикла.
$dark-theme: true !default;
$primary-color: #f8bbd0 !default;
$accent-color: #6a1b9a !default;
@if $dark-theme {
$primary-color: darken($primary-color, 60%);
$accent-color: lighten($accent-color, 60%);
}
.button {
background-color: $primary-color;
border: 1px solid $accent-color;
border-radius: 3px;
}// SASS $dark-theme: true !default $primary-color: #f8bbd0 !default $accent-color: #6a1b9a !default @if $dark-theme $primary-color: darken($primary-color, 60%) $accent-color: lighten($accent-color, 60%) .button background-color: $primary-color border: 1px solid $accent-color border-radius: 3px
/* CSS */
.button {
background-color: rgb(116.96, 12.04, 48.16);
border: 1px solid rgb(245.4696132597, 235.4309392265, 251.5690607735);
border-radius: 3px;
}Переменные в области видимости управления потоком могут присваивать значения существующим переменным во внешней области видимости, но новые переменные, объявленные в области видимости управления потоком, не будут доступны во внешней области видимости. Убедитесь, что переменная уже объявлена перед её присвоением, даже если вам нужно объявить её как null.
Расширенные функции переменных
Библиотека ядра Sass предоставляет несколько расширенных функций для работы с переменными. Функция meta.variable-exists() возвращает, существует ли переменная с данным именем в текущей области видимости, а функция meta.global-variable-exists() делает то же самое, но только для глобальной области видимости.
Пользователи иногда хотят использовать интерполяцию для определения имени переменной на основе другой переменной. Sass этого не позволяет, потому что это значительно затрудняет быстрое понимание, где определены переменные. Однако вы можете определить мапу из имен в значения, к которой затем можно получить доступ, используя переменные.
@use "sass:map";
$theme-colors: (
"success": #28a745,
"info": #17a2b8,
"warning": #ffc107,
);
.alert {
// Instead of $theme-color-#{warning}
background-color: map.get($theme-colors, "warning");
}// SASS
@use "sass:map"
$theme-colors: ("success": #28a745, "info": #17a2b8, "warning": #ffc107)
.alert
// Instead of $theme-color-#{warning}
background-color: map.get($theme-colors, "warning")/* CSS */
.alert {
background-color: #ffc107;
}
© 2006–2025 the Sass team, and numerous contributors
Licensed under the MIT License.
https://sass-lang.com/documentation/variables