Lzh on GitHub

maps

Sass 中的映射保存键值对,可以轻松地通过相应的键查找值。它们的写法是 (<expression>: <expression>, <expression>: <expression>)。冒号前面的表达式是键,后面的表达式是与该键关联的值。键必须是唯一的,但值可以重复。与列表不同,映射必须用括号括起来。不包含任何键值对的映射写成 ()。

Sass 中的映射保存键值对,可以轻松地通过相应的键查找值。它们的写法是 (<expression>: <expression>, <expression>: <expression>)。冒号前面的表达式是键,后面的表达式是与该键关联的值。键必须是唯一的,但值可以重复。与列表不同,映射必须用括号括起来。不包含任何键值对的映射写成 ()

敏锐的读者可能会注意到,空映射 () 的写法与空列表相同。这是因为它既可以被视为映射,也可以被视为列表。事实上,所有映射都被视为列表!每个映射都被视为一个列表,其中包含一个由每个键/值对组成的双元素列表。例如,(1: 2, 3: 4) 被视为 (1 2, 3 4)

映射允许任何 Sass 值作为其键。== 运算符用于确定两个键是否相同

大多数时候,最好为映射的键使用带引号的字符串而不是不带引号的字符串。这是因为某些值,例如颜色名称,可能看起来像不带引号的字符串,但实际上是其他类型。为了避免日后出现令人困惑的问题,只需使用引号即可!

使用映射

由于映射不是有效的 CSS 值,它们本身的作用不大。这就是为什么 Sass 提供了许多函数来创建映射并访问它们包含的值。

查找值

映射的核心是关联键和值,因此自然有一种方法可以获取与键关联的值:map.get($map, $key) 函数!此函数返回与给定键关联的映射中的值。如果映射不包含该键,则返回 null

@use "sass:map";
$font-weights: ("regular": 400, "medium": 500, "bold": 700);

@debug map.get($font-weights, "medium"); // 500
@debug map.get($font-weights, "extra-bold"); // null

为每对执行操作

这实际上不使用函数,但它仍然是使用映射的最常见方式之一。@each 规则会为映射中的每个键/值对评估一个样式块。键和值被分配给变量,以便可以在代码块中轻松访问。

$icons: ("eye": "\f112", "start": "\f12e", "stop": "\f12f");

@each $name, $glyph in $icons {
  .icon-#{$name}:before {
    display: inline-block;
    font-family: "Icon Font";
    content: $glyph;
  }
}

添加到映射

将新对添加到映射或替换现有键的值也很有用。map.set($map, $key, $value) 函数就是用来做这件事的:它返回 $map 的一个副本,其中 $key 处的值被设置为 $value

@use "sass:map";

$font-weights: ("regular": 400, "medium": 500, "bold": 700);

@debug map.set($font-weights, "extra-bold", 900);
// ("regular": 400, "medium": 500, "bold": 700, "extra-bold": 900)
@debug map.set($font-weights, "bold", 900);
// ("regular": 400, "medium": 500, "bold": 900)

除了一个接一个地设置值,你还可以使用 map.merge($map1, $map2) 合并两个现有映射。

@use "sass:map";

$light-weights: ("lightest": 100, "light": 300);
$heavy-weights: ("medium": 500, "bold": 700);

@debug map.merge($light-weights, $heavy-weights);
// ("lightest": 100, "light": 300, "medium": 500, "bold": 700)

如果两个映射具有相同的键,则第二个映射的值将用于返回的映射中。

@use "sass:map";

$weights: ("light": 300, "medium": 500);

@debug map.merge($weights, ("medium": 700));
// ("light": 300, "medium": 700)

请注意,因为 Sass 映射是不可变的map.set()map.merge() 不会修改原始列表。

不变性

Sass 中的映射是不可变的,这意味着映射值的内容永远不会改变。Sass 的映射函数都返回新映射,而不是修改原始映射。不变性有助于避免当同一个映射在样式表的不同部分之间共享时可能出现的许多偷偷摸摸的错误。

不过,你仍然可以通过将新映射分配给同一个变量来随时间更新你的状态。这通常在函数和混合宏中使用,以在映射中跟踪配置。

@use "sass:map";

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

@mixin add-browser-prefix($browser, $prefix) {
  $prefixes-by-browser: map.merge($prefixes-by-browser, ($browser: $prefix)) !global;
}

@include add-browser-prefix("opera", o);
@debug $prefixes-by-browser;
// ("firefox": moz, "safari": webkit, "ie": ms, "opera": o)