更新: Postcss 自定义属性可以做回退,并且比下面的代码更容易
第 1 步:声明 scss 变量
所以首先我们想把一些变量放在 a 中$map
,我将使用颜色变量:
$colors: (
primary: #FFBB00,
secondary: #0969A2
);
第 2 步:自动生成 css 4 var
// ripped CSS4 vars out of color map
:root {
// each item in color map
@each $key, $value in $colors {
--colors-#{$key}: $value;
}
}
在 root 中发生的是:对于颜色映射中的每个键和值,我们打印以下内容:
--colors-#{$key}: $value;
这对应于css变量声明。我相信键周围的奇怪#{}
之处在于值周围没有空格。因此结果是:
--colors-primary: #FFBB00,
--colors-secondary: #0969A2
请注意,前缀 ( --colors-
) 与其上方的 scss 颜色图同名。为什么会在最后一步变得清晰。
第三步:大量地图!
$props: (
background-color: $colors
);
$map-maps: (
background-color: colors
);
在这里,我们添加将$props
css 属性映射到包含值的映射的映射。background-color
将保持颜色,所以正确的地图是$colors
.
map-maps
是道具的副本,而不是地图,我们有所述地图的名称。(这与步骤 2 中的注释有关)。
第4步:让它工作!
@mixin v($prop, $var) {
// get the map from map name
$map: map-get($props, $prop);
// fallback value, grab the variable's value from the map
$var-fall: map-get($map, $var);
// our css4 variable output
$var-output: var(--#{$map}-#{$var});
#{$prop}: $var-fall;
// css4 variable output
#{$prop}: $var-output;
}
body{
@include v(background-color, primary);
}
我将文章中的代码简化了很多,它仍然有效,至少对于这个例子,文章中的代码考虑了更多。
无论如何,这就是发生的事情。
首先,我们调用 mixin:
@include v(background-color, primary);
然后一进门,
$map: map-get($props, $prop); // map-get($props, background-color)
我们有一个名为的变量,我们将映射$map
内部的值分配给该键,该键恰好是映射。这有点像迷宫,但一旦你解决了它就没有那么复杂了。$props
background-color
$colors
然后对于后备:
$var-fall: map-get($map, $var);
这只是获取我们刚刚在键(恰好是主键$colors
)处获得的映射的值(即 )。$var
因此结果是#FFBB00
。
对于 css 变量
$map-name: map-get($map-maps, $prop);
$var-output: var(--#{$map-name}-#{$var});
我们重新创建了我们为在@each
循环中生成 var 所做的事情
整个代码是:
$colors: (
primary: #FFBB00,
secondary: #0969A2
);
// ripped CSS4 vars out of color map
:root {
// each item in color map
@each $name, $color in $colors {
--colors-#{$name}: $color;
}
}
$props: (
background-color: $colors,
color: $colors
);
$map-maps: (
background-color: colors
);
@mixin v($prop, $var) {
// get the map from map name
$map: map-get($props, $prop);
// fallback value, grab the variable's value from the map
$var-fall: map-get($map, $var);
// our css4 variable output
$map-name: map-get($map-maps, $prop);
$var-output: var(--#{$map-name}-#{$var});
#{$prop}: $var-fall;
// css4 variable output
#{$prop}: $var-output;
}
body{
@include v(background-color, primary);
}
现在这是对文章中所做工作的简化。您应该检查一下以使代码更加健壮。