Advertisement
  1. Web Design
  2. HTML/CSS
  3. CSS

Понимание области переменных в Sass

Scroll to top
Read Time: 6 min

() 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 и не стесняйтесь задавать любые вопросы, которые могут возникнуть в комментариях!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.