将字符串和变量合并为一个SASS变量

16
我希望将一个变量和一个字符串合并成一个新的变量,就像下面这样:
$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
        }
    }
}

有人知道怎么做吗?

2个回答

27

不,你不能使用动态变量。

根据文档

您还可以使用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;

那很好!超棒的!谢谢! - sneeky
2
你也可以通过 color: nth($product-colors, index($products, $class)) 来使第一个示例更简洁。 - Paul d'Aoust
@bookcasey谢谢你的回答。我使用了你提供的第二个选项。 - Jez D

4

更新: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);
        }
    }
}

我们并没有保存任何代码行,但我们使循环的意图更加清晰。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接