列表

Compatibility (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 时很有用。

在不使用括号编写列表时,你可以使用圆括号在列表中嵌套列表或消除列表分隔符和其他空格或逗号用法之间的歧义。例如,(1, 2), (3, 4) 是一个包含两个列表的列表,每个列表包含两个数字;而 adjust-font-stack((Helvetica, Arial, sans-serif)) 将包含三个字体名称的单个参数传递给 adjust-font-stack 函数。

Sass 列表可以包含一个或甚至零个元素。单元素列表可以写作 (<表达式>,)[<表达式>],零元素列表可以写作 ()[]。此外,所有列表函数都会将不在列表中的单个值视为包含该值的列表,这意味着你很少需要显式创建单元素列表。

⚠️ Heads up!

没有括号的空列表不是有效的 CSS,因此 Sass 不允许你在属性值中使用它。

斜杠分隔的列表斜杠分隔的列表 permalink

Sass 中的列表可以用斜杠分隔,以表示类似 font: 12px/30px 这样的值,用于设置 font-sizeline-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) 函数获取列表中给定索引处的元素。第一个参数是列表本身,第二个参数是要获取的值的索引。

Playground

SCSS Syntax

@use 'sass:list';

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

Sass Syntax

@use 'sass:list'

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

对每个元素执行操作对每个元素执行操作 permalink

这实际上并不使用函数,但仍然是使用列表最常见的方式之一。@each 规则为列表中的每个元素评估一块样式,并将该元素赋值给一个变量。

Playground

SCSS Syntax

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

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








Playground

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 列表是不可变的,它不会修改原始列表。

Playground

SCSS Syntax

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

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) 函数。它接受一个列表和要在该列表中定位的值,并返回该值的索引。

Playground

SCSS Syntax

@use 'sass:list';

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

Sass Syntax

@use 'sass:list'

@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假值,所以你可以将 list.index()@ifif() 一起使用,以检查列表是否包含给定值。

Playground

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}.";
  }

  // ...
}
Playground

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 的列表函数都返回新列表,而不是修改原始列表。不可变性有助于避免当同一列表在样式表的不同部分共享时可能出现的许多隐蔽的错误。

不过,你仍然可以通过将新列表赋值给同一变量来随时间更新状态。这通常在函数和混入中用于将多个值收集到一个列表中。

Playground

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
Playground

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() 函数来访问它们作为映射。

Playground

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,
)
Playground

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;
}