Списки

Совместимость (Square Brackets):
Dart Sass
LibSass
since 3.5.0
Ruby Sass
since 3.5.0

Старые реализации LibSass и Ruby Sass не поддерживали списки с квадратными скобками.

Списки содержат последовательность других значений. В Sass элементы в списках могут быть разделены запятыми (Helvetica, Arial, sans-serif), пробелами (10px 15px 0 0) или косой чертой, если это согласуется со списком. В отличие от большинства других языков, списки в Sass не требуют специальных скобок; любые выражения, разделенные пробелами или запятыми, считаются списком. Однако вы можете писать списки в квадратных скобках ([line1 line2]), что полезно при использовании grid-template-columns.

Списки Sass могут содержать один или даже ноль элементов. Одноэлементный список может быть записан как (<expression>,) или [<expression>], а список без элементов может быть записан как () или []. Кроме того, все функции списка будут обрабатывать отдельные значения, которых нет в списках, как если бы они были списками, содержащими это значение, что означает, что вам редко нужно явно создавать одноэлементные списки.

⚠️ Внимание!

Пустые списки без скобок не являются допустимым CSS, поэтому Sass не позволит вам использовать их в значении свойства.

Списки, разделенные косой чертой permalinkСписки, разделенные косой чертой

Списки в Sass могут быть разделены косой чертой для представления таких значений, как сокращение font: 12px/30px для установки font-size и line-height или синтаксиса hsl(80 100% 50% / 0.5) для создания цвета с заданным значением непрозрачности. Однако списки, разделенные косой чертой, в настоящее время не могут быть записаны буквально. Sass исторически использовал символ / для обозначения деления, поэтому существующие таблицы стилей переходят на использование списков, разделенных косой чертой math.div() может быть записано только с использованием list.slash().

Для получения дополнительной информации смотрите Критическое изменение: слэш как разделение.

Использование списков permalinkИспользование списков

Sass предоставляет несколько функций, которые позволяют использовать списки для написания мощных библиотек стилей или сделать таблицу стилей вашего приложения более чистой и удобной в обслуживании.

Индексы permalinkИндексы

Многие из этих функций принимают или возвращают числа, называемые индексами, которые относятся к элементам в списке. Индекс 1 указывает на первый элемент списка. Обратите внимание, что это отличается от многих языков программирования, где индексы начинаются с 0! Sass также упрощает обращение к концу списка. Индекс -1 относится к последнему элементу в списке, -2 относится к предпоследнему и так далее.

Доступ к элементу permalinkДоступ к элементу

Списки бесполезны, если вы не можете извлечь из них значения. Вы можете использовать функцию list.nth($list, $n), чтобы получить элемент по заданному индексу в списке. Первый аргумент - это сам список, а второй - индекс значения, которое вы хотите получить.

SCSS Syntax

@debug list.nth(10px 12px 16px, 2); // 12px
@debug list.nth([line1, line2, line3], -1); // line3

Sass Syntax

@debug list.nth(10px 12px 16px, 2)  // 12px
@debug list.nth([line1, line2, line3], -1)  // line3

Сделайте что-нибудь для каждого элемента permalinkСделайте что-нибудь для каждого элемента

На самом деле здесь не используется функция, но это по-прежнему один из наиболее распространенных способов использования списков. Правило @each оценивает блок стилей для каждого элемента в списке и назначает этот элемент переменной.

SCSS Syntax

$sizes: 40px, 50px, 80px;

@each $size in $sizes {
  .icon-#{$size} {
    font-size: $size;
    height: $size;
    width: $size;
  }
}








Sass Syntax

$sizes: 40px, 50px, 80px

@each $size in $sizes
  .icon-#{$size}
    font-size: $size
    height: $size
    width: $size










CSS Output

.icon-40px {
  font-size: 40px;
  height: 40px;
  width: 40px;
}

.icon-50px {
  font-size: 50px;
  height: 50px;
  width: 50px;
}

.icon-80px {
  font-size: 80px;
  height: 80px;
  width: 80px;
}

Добавить в список permalinkДобавить в список

Также полезно добавлять элементы в список. Функция list.append($list, $val) принимает список и значение и возвращает копию списка со значением, добавленным в конец. Обратите внимание: поскольку списки Sass неизменяемые, они не изменяют исходный список.

SCSS Syntax

@debug append(10px 12px 16px, 25px); // 10px 12px 16px 25px
@debug append([col1-line1], col1-line2); // [col1-line1, col1-line2]

Sass Syntax

@debug append(10px 12px 16px, 25px)  // 10px 12px 16px 25px
@debug append([col1-line1], col1-line2)  // [col1-line1, col1-line2]

Найти элемент в списке permalinkНайти элемент в списке

Если вам нужно проверить, находится ли элемент в списке или выяснить, по какому индексу он находится, используйте функцию list.index($list, $value). Он принимает список и значение, которое нужно найти в этом списке, и возвращает индекс этого значения.

SCSS Syntax

@debug list.index(1px solid red, 1px); // 1
@debug list.index(1px solid red, solid); // 2
@debug list.index(1px solid red, dashed); // null

Sass Syntax

@debug list.index(1px solid red, 1px)  // 1
@debug list.index(1px solid red, solid)  // 2
@debug list.index(1px solid red, dashed)  // null

Если значение отсутствует в списке, list.index() возвращает null. Поскольку null равен falsey, вы можете использовать list.index() с @if или if(), чтобы проверить, соответствует ли список содержат заданное значение.

SCSS Syntax

@use "sass:list";

$valid-sides: top, bottom, left, right;

@mixin attach($side) {
  @if not list.index($valid-sides, $side) {
    @error "#{$side} is not a valid side. Expected one of #{$valid-sides}.";
  }

  // ...
}

Sass Syntax

@use "sass:list"

$valid-sides: top, bottom, left, right

@mixin attach($side)
  @if not list.index($valid-sides, $side)
    @error "#{$side} is not a valid side. Expected one of #{$valid-sides}."


  // ...

Неизменность permalinkНеизменность

Списки в Sass неизменяемы, что означает, что содержимое значения списка никогда не изменяется. Все функции списков Sass возвращают новые списки, а не изменяют исходные. Неизменяемость помогает избежать множества скрытых ошибок, которые могут закрасться, когда один и тот же список используется в разных частях таблицы стилей.

Однако вы все равно можете обновлять свое состояние с течением времени, назначая новые списки той же переменной. Это часто используется в функциях и миксинах для сбора группы значений в один список.

SCSS Syntax

@use "sass:list";
@use "sass:map";

$prefixes-by-browser: ("firefox": moz, "safari": webkit, "ie": ms);

@function prefixes-for-browsers($browsers) {
  $prefixes: ();
  @each $browser in $browsers {
    $prefixes: list.append($prefixes, map.get($prefixes-by-browser, $browser));
  }
  @return $prefixes;
}

@debug prefixes-for-browsers("firefox" "ie"); // moz ms

Sass Syntax

@use "sass:list"
@use "sass:map"

$prefixes-by-browser: ("firefox": moz, "safari": webkit, "ie": ms)

@function prefixes-for-browsers($browsers)
  $prefixes: ()
  @each $browser in $browsers
    $prefixes: list.append($prefixes, map.get($prefixes-by-browser, $browser))

  @return $prefixes


@debug prefixes-for-browsers("firefox" "ie")  // moz ms

Списки аргументов permalinkСписки аргументов

Когда вы объявляете миксин или функцию, которая принимает произвольные аргументы, вы получаете значение в виде специального списка, известного как список аргументов. Он действует так же, как список, содержащий все аргументы, переданные в миксин или функцию, с одной дополнительной функцией: если пользователь передал аргументы ключевого слова, к ним можно получить доступ как к карте, передав список аргументов в функцию meta.keywords().

SCSS Syntax

@use "sass:meta";

@mixin syntax-colors($args...) {
  @debug meta.keywords($args);
  // (string: #080, comment: #800, variable: #60b)

  @each $name, $color in meta.keywords($args) {
    pre span.stx-#{$name} {
      color: $color;
    }
  }
}

@include syntax-colors(
  $string: #080,
  $comment: #800,
  $variable: #60b,
)

Sass Syntax

@use "sass:meta"

@mixin syntax-colors($args...)
  @debug meta.keywords($args)
  // (string: #080, comment: #800, variable: #60b)

  @each $name, $color in meta.keywords($args)
    pre span.stx-#{$name}
      color: $color




@include syntax-colors($string: #080, $comment: #800, $variable: #60b)




CSS Output

pre span.stx-string {
  color: #080;
}

pre span.stx-comment {
  color: #800;
}

pre span.stx-variable {
  color: #60b;
}