Понимание области переменных в Sass
() translation by (you can also view the original English article)
В этой статье мы более подробно рассмотрим переменные и область видимости переменных в Sass. Область видимочти переменной описывает контекст, в котором она определена, и, следовательно, где она доступна для использования.
Для начала я расскажу, какие области поддержки поддерживает Sass. Затем я объясню два полезных флага, которые мы можем использовать для настройки значения переменной. Наконец, я кратко изложу доступные функции для проверки существования переменной.
Область переменных Sass
Sass поддерживает два типа переменных: локальные переменные и глобальные переменные.
По умолчанию все переменные, определенные вне любого селектора, считаются глобальными переменными. Это означает, что к ним можно получить доступ из любого места в наших таблицах стилей. Например, вот глобальная переменная:
1 |
$bg-color: green; |
С другой стороны, локальные переменные - это те, которые объявлены внутри селектора. Позже мы рассмотрим, как мы можем настроить это поведение. Но сейчас давайте посмотрим наш первый пример.
Здесь мы определяем mixin, а затем переменную btn-bg-color
внутри нее. Это локальная переменная, поэтому она видима только для кода внутри этого mixin:
1 |
@mixin button-style { |
2 |
$btn-bg-color: lightblue; |
3 |
color: $btn-bg-color; |
4 |
}
|
Далее мы можем вызвать mixin следующим образом:
1 |
button { |
2 |
@include button-style; |
3 |
}
|
Получившийся CSS:
1 |
button { |
2 |
color: lightblue; |
3 |
}
|
Представьте, однако, что мы также хотим использовать эту переменную (а не mixin) в другом селекторе:
1 |
.wrap { |
2 |
background: $btn-bg-color; |
3 |
}
|
Это даст нам следующую ошибку:
1 |
Undefined variable: "$btn-bg-color". |
Этого следовало ожидать, верно? Мы попытались получить доступ к переменной mixin, которая имеет локальный масштаб. Не беспокойтесь, хотя, как уже упоминалось выше, мы исправим эту проблему в следующем разделе.
Вложенные селекторы
Стоит также упомянуть, что если мы объявляем переменную внутри селектора, любой другой вложенный селектор может получить к ней доступ. Вот пример:
1 |
.wrap { |
2 |
$bg-color: red; |
3 |
|
4 |
&:after { |
5 |
background: lighten($bg-color, 10%); |
6 |
}
|
7 |
}
|
8 |
Он компилируется в:
1 |
.wrap:after { |
2 |
background: #ff3333; |
3 |
}
|
Однако рассмотрим пример ниже, где мы определяем функцию, затем используем эту функцию вместе с вложенным селектором:
1 |
@function my-function() { |
2 |
$text-color: black; |
3 |
@return $text-color; |
4 |
}
|
5 |
|
6 |
.wrap { |
7 |
color: my-function(); |
8 |
|
9 |
&:after{
|
10 |
background: $text-color; |
11 |
}
|
12 |
}
|
Если мы попытаемся скомпилировать это, то получим ту же ошибку, о которой говорилось выше. Опять же, это происходит потому, что мы не можем получить доступ к переменной text-color
. Она не определяется непосредственно в родительском селекторе, а внутри функции, которую вызывает наш селектор.
Имена переменных
Глобальные и локальные переменные могут иметь одинаковые имена. Чтобы продемонстрировать это поведение, мы рассмотрим четвертый пример:
1 |
$text-color: tomato; |
2 |
|
3 |
@mixin button-style { |
4 |
$text-color: lime; |
5 |
color: $text-color; |
6 |
}
|
7 |
|
8 |
@mixin link-style { |
9 |
$text-color: black; |
10 |
color: $text-color; |
11 |
}
|
Здесь мы определили три разные переменные (text-color
) с тем же именем. Первая - это глобальная переменная, а две другие - локальные.
Вот некоторые стили, использующие их:
1 |
button { |
2 |
@include button-style; |
3 |
}
|
4 |
|
5 |
a { |
6 |
@include link-style; |
7 |
}
|
8 |
|
9 |
.wrap { |
10 |
background: $text-color; |
11 |
}
|
И сгенерированный CSS:
1 |
button { |
2 |
color: lime; |
3 |
}
|
4 |
|
5 |
a { |
6 |
color: black; |
7 |
}
|
8 |
|
9 |
.wrap { |
10 |
background: tomato; |
11 |
}
|
Это то, что вы ожидали?
Имейте в виду, что мы не увидим эти стили, если не скомпилируем их с текущей версией Sass (3.4). Например, предположим, что мы используем Sass 3.3, наш вывод CSS будет выглядеть так:
1 |
button { |
2 |
color: lime; |
3 |
}
|
4 |
|
5 |
a { |
6 |
color: black; |
7 |
}
|
8 |
|
9 |
.wrap { |
10 |
background: black; |
11 |
}
|
Обратите внимание на разницу в цвете фона селектора .wrap
. Это происходит потому, что в соответствии с более ранними версиями Sass (такими же для LibSass), если мы локально переопределим значение глобальной переменной (например, text-color
), это будет новое (глобальное) значение переменной. Итак, в нашем примере скомпилированные стили зависят от порядка, который мы объявляем переменной и миксами.
Флаг по умолчанию (default
)
Этот флаг позволяет нам установить значение переменной в случае, если оно еще не установлено или его текущее значение равно null
(рассматривается как неназначенное). Чтобы лучше объяснить, как мы можем использовать его в реальном сценарии, давайте предположим, что у нас есть проект со следующей структурой:
1 |
Project-Name/ |
2 |
├── ... |
3 |
├── css/ |
4 |
│ └── app.css |
5 |
└── scss/ |
6 |
├── _config.scss |
7 |
├── _variables.scss |
8 |
├── _mixins.scss |
9 |
└── app.scss |
Файл app.scss
выглядит следующим образом:
1 |
@import "config"; |
2 |
@import "variables"; |
3 |
@import "mixins"; |
4 |
|
5 |
button { |
6 |
@include button-style; |
7 |
}
|
8 |
|
9 |
// more styles |
Посмотрим содержимое частичных файлов.
Во-первых, файл variables.scss
содержит наши переменные:
1 |
$btn-bg-color: lightblue !default; |
2 |
$btn-bg-color-hover: darken($btn-bg-color, 5%); |
3 |
|
4 |
// more variables |
Обратите внимание на флаг default
, назначенный переменной btn-bg-color
.
Во-вторых, файл mixins.scss
включает наши миксы:
1 |
@mixin button-style ($bg-color: $btn-bg-color, $bg-color-hover: $btn-bg-color-hover) { |
2 |
background-color: $bg-color; |
3 |
// more styles |
4 |
|
5 |
&:hover { |
6 |
background-color: $bg-color-hover; |
7 |
// more styles |
8 |
}
|
9 |
}
|
10 |
|
11 |
// more mixins |
Затем сгенерированный файл app.css
будет выглядеть следующим образом:
1 |
button { |
2 |
color: lightblue; |
3 |
}
|
4 |
|
5 |
button:hover { |
6 |
background-color: #99cfe0; |
7 |
}
|
Итак, наши кнопки имеют стили по умолчанию. Но давайте предположим, что мы хотим иметь возможность перезаписать их, применяя наши собственные значения. Чтобы сделать это, мы можем переназначить желаемые (по умолчанию) переменные в частичном файле config.scss
:
1 |
$btn-bg-color: chocolate; |
2 |
|
3 |
// more variables |
Установка значения этой переменной в chocolate
приведет к игнорированию соответствующего значения (lightblue
), получившего флаг default
. Поэтому сгенерированный CSS изменяется, как мы видим ниже:
1 |
button { |
2 |
color: chocolate; |
3 |
}
|
4 |
|
5 |
button:hover { |
6 |
background-color: #bc5e1b; |
7 |
}
|
Примечание: если мы не добавили флаг default
в переменную btn-bg-color
, наш CSS будет, из-за каскадной природы CSS, следующим образом:
1 |
button { |
2 |
color: lightblue; |
3 |
}
|
4 |
|
5 |
// hover styles |
Глобальный флаг (global
)
Этот второй флаг помогает нам изменить область действия локальной переменной.
Помните ошибку, которую мы видели в нашем первом примере? Что ж, это произошло потому, что мы пытались использовать переменную btn-bg-color
в селекторе .wrap
. Давайте изменим наш пример, чтобы включить этот новый флаг. Вот новые стили:
1 |
@mixin button-style { |
2 |
$btn-bg-color: lightblue !global; |
3 |
color: $btn-bg-color; |
4 |
}
|
5 |
|
6 |
button { |
7 |
@include button-style; |
8 |
}
|
9 |
|
10 |
.wrap { |
11 |
background: $btn-bg-color; |
12 |
}
|
Как вы можете видеть ниже, благодаря этому флагу CSS компилируется без ошибок:
1 |
button { |
2 |
color: lightblue; |
3 |
}
|
4 |
|
5 |
.wrap { |
6 |
background: lightblue; |
7 |
}
|
Флаг global
полезен, но имейте в виду, что не всегда целесообразно изменять область видимости переменной.
Проверка наличия переменной
Sass предоставляет две функции самоанализа для проверки существования переменной или нет. Мы можем использовать функции variable-exists
и/или global-variable-exist
, чтобы проверить, существуют ли наши локальные и/или глобальные переменные соответственно.
Например, здесь приведен общий случай использования, когда мы определяем переменную, содержащую абсолютный путь к Шрифту Google. Затем мы выбираем импортировать этот шрифт в наших таблицах стилей, но только если была создана соответствующая переменная.
1 |
$google-font: "http://fonts.googleapis.com/css?family=Alegreya"; |
2 |
|
3 |
@if(global-variable-exists(google-font)) { |
4 |
@import url($google-font); |
5 |
}
|
Результат:
1 |
@import url("http://fonts.googleapis.com/css?family=Alegreya"); |
Вывод
В этой статье я познакомил вас с концепцией области видимости переменных в Sass. В этой статье я познакомил вас с концепцией области видимости переменных в Sass.... Вы можете найти все примеры этой статьи в этом сообщении SassMeister и не стесняйтесь задавать любые вопросы, которые могут возникнуть в комментариях!