更新:Postcss Custom properties可以做回退,且比下面的代码比较容易的方式
第1步:申报SCSS变量
所以首先我们希望把一些变量在$map
,我会去用颜色变量:
$colors: (
primary: #FFBB00,
secondary: #0969A2
);
步骤2:自动化的CSS 4变种代
// ripped CSS4 vars out of color map
:root {
// each item in color map
@each $key, $value in $colors {
--colors-#{$key}: $value;
}
}
在根发生的是:在颜色的每个键和值地图,我们打印followng:
--colors-#{$key}: $value;
,其对应于css变量声明。我相信围绕关键的#{}
这个奇怪的位是没有围绕价值的空间。 因此其结果是:
--colors-primary: #FFBB00,
--colors-secondary: #0969A2
注意,前缀(--colors-
)是相同的名称作为SCSS色彩映射它的上方。为什么在最后一步会变得清晰。
第3步:大量的地图!
$props: (
background-color: $colors
);
$map-maps: (
background-color: colors
);
在这里,我们添加哪些CSS属性映射到包含值的地图的地图$props
。 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);
}
我简化了代码的文章不少,它仍然有效,在这个例子中,至少,在本文中的代码需要更多的考虑。
无论如何,这是发生了什么事。
首先,我们调用带混入:
@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 VAR
$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);
}
现在这是一个简单的在文章中做了什么。你应该检查一下代码是否更健壮。
这个答案在演示中会好很多 –
这个答案在代码和解释的长度上也是不必要的复杂。 –
@ZachSaucier随时发布你自己的 – Ced