映射
映射在 Sass 中保存键和值的对,并且可以轻松地通过对应的键查找值。它们的写法是 (<表达式>: <表达式>, <表达式>: <表达式>)
。冒号 :
前的表达式是键,冒号后的表达式是与该键关联的值。键必须是唯一的,但值可以重复。与列表不同,映射必须用括号括起来。没有对的映射写作 ()
。
💡 Fun fact:
敏锐的读者可能会注意到,空映射 ()
与空列表的写法相同。这是因为它既算作映射,也算作列表。事实上,所有映射都算作列表!每个映射都算作一个列表,其中包含每个键/值对的两元素列表。例如,(1: 2, 3: 4)
算作 (1 2, 3 4)
。
映射允许使用任何 Sass 值作为其键。使用 ==
运算符来确定两个键是否相同。
⚠️ Heads up!
大多数情况下,最好使用引用字符串而不是非引用字符串作为映射键。这是因为某些值(如颜色名称)看起来像非引用字符串,但实际上是其他类型。为了避免以后出现混淆的问题,只需使用引号!
使用映射使用映射 permalink
由于映射不是有效的 CSS 值,它们本身并不做什么。这就是为什么 Sass 提供了许多函数来创建映射和访问它们包含的值。
查找值查找值 permalink
映射的目的是关联键和值,因此自然有一种方法可以获取与键关联的值:map.get($map, $key)
函数!这个函数返回映射中与给定键关联的值。如果映射不包含该键,则返回 null
。
SCSS Syntax
@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
Sass Syntax
@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
对每个对执行操作对每个对执行操作 permalink
这实际上并不使用函数,但仍然是使用映射最常见的方式之一。@each
规则为映射中的每个键/值对评估一块样式。键和值被赋值给变量,以便在块中轻松访问。
SCSS Syntax
$icons: ("eye": "\f112", "start": "\f12e", "stop": "\f12f");
@each $name, $glyph in $icons {
.icon-#{$name}:before {
display: inline-block;
font-family: "Icon Font";
content: $glyph;
}
}
Sass Syntax
$icons: ("eye": "\f112", "start": "\f12e", "stop": "\f12f")
@each $name, $glyph in $icons
.icon-#{$name}:before
display: inline-block
font-family: "Icon Font"
content: $glyph
CSS Output
.icon-eye:before {
display: inline-block;
font-family: "Icon Font";
content: "\f112";
}
.icon-start:before {
display: inline-block;
font-family: "Icon Font";
content: "\f12e";
}
.icon-stop:before {
display: inline-block;
font-family: "Icon Font";
content: "\f12f";
}
添加到映射添加到映射 permalink
向映射添加新对,或替换现有键的值也很有用。map.set($map, $key, $value)
函数可以做到这一点:它返回 $map
的副本,其中 $key
处的值设置为 $value
。
SCSS Syntax
@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)
Sass Syntax
@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)
合并两个现有的映射。
SCSS Syntax
@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)
Sass Syntax
@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)
如果两个映射有相同的键,则返回的映射中使用第二个映射的值。
SCSS Syntax
@use "sass:map";
$weights: ("light": 300, "medium": 500);
@debug map.merge($weights, ("medium": 700));
// ("light": 300, "medium": 700)
Sass Syntax
@use "sass:map";
$weights: ("light": 300, "medium": 500)
@debug map.merge($weights, ("medium": 700))
// ("light": 300, "medium": 700)
请注意,由于 Sass 映射是不可变的,map.set()
和 map.merge()
不会修改原始列表。
不可变性不可变性 permalink
Sass 中的映射是不可变的,这意味着映射值的内容永远不会改变。Sass 的映射函数都返回新映射,而不是修改原始映射。不可变性有助于避免当同一映射在样式表的不同部分共享时可能出现的许多隐蔽的错误。
不过,你仍然可以通过将新映射赋值给同一变量来随时间更新状态。这通常在函数和混入中用于跟踪映射中的配置。
SCSS Syntax
@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)
Sass Syntax
@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)