我想将变量和字符串合并到一个新变量,如下所示:
$product_bodyclass_list: class1 class2 class3 class4;
$product_class1_color: #C00;
$product_class2_color: #00C;
$product_class3_color: #0C0;
$product_class4_color: #000;
@each $bodyclass in $product_bodyclass_list {
.page-#{$bodyclass} {
a {
color: $product_#{$bodyclass}_color; // This is wrong
}
}
}
有人知道怎么做吗?
答案 0 :(得分:23)
不,你不能拥有动态变量。
来自docs:
您还可以使用#{}插值
在选择器和属性名称中使用SassScript变量
您可以使用两个列表和nth()
函数来完成相同的效果。
$products: class1, class2, class3, class4;
$product_colors: #C00, #00C, #0C0, #000;
$i: 1;
@each $class in $products {
.page-#{$class} {
a {
color: nth($product_colors, $i)
}
}
$i: $i + 1;
}
此外,使用@for
指令可能更清晰:
@for $i from 1 through length($products) {
.page-#{nth($products, $i)} {
a {
color: nth($product_colors, $i)
}
}
}
此外,如果您想明确定义变量以便在其他地方使用它们,请创建一个变量列表:
$product_class1_color: #C00;
$product_class2_color: #00C;
$product_class3_color: #0C0;
$product_class4_color: #000;
$product_colors: $product_class1_color, $product_class2_color, $product_class3_color, $product_class4_color;
答案 1 :(得分:3)
更新:Sass maps这个答案已经过时了。
另一种选择是使用一个列表,每个列表包含两个元素,并将其用作散列图。
$products: class1 #C00, class2 #00C, class3 #0C0, class4 #000;
@each $kvp in $products { // kvp stands for 'key-value pair'
.page-#{nth($kvp, 1)} {
a {
color: nth($kvp, 2);
}
}
}
我喜欢使用简单的函数来使代码的含义更清晰。我可能会做更多的事情:
@function kvp-key($kvp) {
@return nth($kvp, 1);
}
@function kvp-value($kvp) {
@if length($kvp) == 2 {
@return nth($kvp, 2);
} @else {
@warn "argument was not a key-value pair";
@return null;
}
}
然后我会重新实现这样的循环:
@each $kvp in $products { // kvp stands for 'key-value pair'
.page-#{kvp-key($kvp)} {
a {
color: kvp-value($kvp);
}
}
}
我们没有保存任何行,但我们已经使循环的意图更清晰了。