我正在尝试在SCSS中设置配色方案,在其中可以使用以下HTML:
<div class="swatch" data-bg="green">...</div>
我有一个这样定义的SCSS mixin:
@function color($key: 'black') {
@return map-get($colors, $key);
}
因此,如果我将其传递给background-color: color('green')
,它将查看$colors: ( ... )
映射,查看'green': #009900,
并返回background-color: #009900;
作为CSS。
当我尝试将data-bg
属性值传递到color()
SCSS mixin中时,就会出现问题,如下所示:
.swatch[data-bg] {
background-color: color(attr(data-bg));
}
这不起作用。我会期望将其解析为这样的值:
color(attr(data-bg))
→color('green')
→#009900
但是,SCSS甚至根本不会在CSS中渲染background-color
行。
我有一个Codepen,您可以在这里看到我要去的东西。这是这里的“棕色”色样:https://codepen.io/rbrum/pen/axZLxw
任何帮助将不胜感激。
答案 0 :(得分:0)
对于遇到此问题的其他人,这是我最终解决问题的方式。
我不是依靠data-
属性,而是依靠类名。例如,每当我想要具有特定背景颜色的元素时,我都使用.bg-amber
或.bg-purple
之类的类名。我的颜色定义如下:
$colors: (
'black': #000000,
'white': #FFFFFF,
// ...
'amber': #FFBF00,
'purple': #800080,
// ...
);
为了使访问颜色更容易,我定义了一个可以通过名称调用任何颜色的函数:
@function c($key: 'black') {
@return map-get($colors, $key);
}
然后我定义一个混合器,给定颜色名称,将其应用为背景色。我还可以为其传递CSS属性中使用的前缀。
@mixin bg($color-name, $prefix: '') {
.#{$prefix}#{$color-name} {
background-color: c($color-name);
}
}
如果我想一次性使用它,我会这样使用:
@include bg('amber', 'bg-');
...将生成以下内容:
.bg-amber {
background-color: #FFBF00;
}
最后,我使用@each
循环对所有颜色进行此操作:
@each $color-name, $color-val in $colors {
@include bg($color-name, 'bg-');
}
我还可以定义一个“前景”版本:
@mixin fg($color-name, $prefix: '') {
.#{$prefix}#{$color-name} {
color: c($color-name);
}
}
然后我可以在@each
用法下方的bg()
循环中使用它:
@each $color-name, $color-val in $colors {
@include bg($color-name, 'bg-');
@include fg($color-name, 'txt-');
}
它也可以扩展为边框颜色,框阴影等。