【问题标题】:Sass: Multiple class selector from a variableSass:来自变量的多个类选择器
【发布时间】:2012-01-31 16:58:24
【问题描述】:

我想用这样的类创建一个变量

$multi: foo, bar, baz

我想像这样创建一个组合选择器:

.foo, .bar, .baz {}

我使用的是缩进语法(不知道这是否重要)。我希望从变量生成组合选择器的原因:我需要根据那里定义的类的数量进行计算。请不要提出(使用扩展!)之类的建议,因为这将要求我再上一堂课。我需要能够接近或完全接近常规组合选择器输出。

【问题讨论】:

  • 如果你指定了你需要做的“计算”会更有帮助。请解释为什么您需要“接近或完全接近常规组合选择器输出”
  • 这些类用于精灵......所以我有一个精灵,它有一个图像的 foo、bar 和 baz 部分。我有一个循环,将第一类设置为特定背景,然后最后一个循环从第一个停止的地方继续,基本上按顺序处理精灵,而无需手动管理它。现在我必须定义变量设置,然后手动指定组合选择器,因为 Sass 不允许我做我想做的事情。

标签: css haml sass


【解决方案1】:

我遇到了与 OP 相同的问题,这是我找到的第一个搜索结果,所以现在我已经弄清楚了,我会发布我的解决方案,即使问题已经存在 1.5 年了。

这是我发现的:为了将变量用作选择器,您可以使用 SASS interpolation,它与逗号分隔的字符串完美配合。但是,如果您希望保存选择器的变量为 list(以便您可以在其上使用列表函数,例如 length($multi)),则插值将生成格式错误的选择器。

因此,简单的解决方案是首先将变量定义为列表,然后当您需要将其用作选择器时,将该列表转换为逗号分隔的字符串:

$multi: ".foo", ".bar", ".baz"
$multi-selector: ""
@each $selector in $multi
    @if $multi-selector != ""
        $multi-selector: $multi-selector + ", "
    $multi-selector: $multi-selector + $selector

#{$multi-selector}
    //CSS properties go here

您可能希望将列表到逗号分隔字符串的功能抽象为一个函数(注意:SASS 的 join 函数不这样做;它将两个列表连接成一个新列表)。这是一种可能的实现方式:

@function unite($list, $glue: ", ")
    @if length($list) == 1
        @return $list

    $string: ""
    @each $item in $list
        @if $string != ""
            $string: $string + $glue
        $string: $string + $item
    @return $string

此时原代码可以这么简洁:

$multi: ".foo", ".bar", ".baz"

#{unite($multi)}
    //CSS properties go here

【讨论】:

  • 很抱歉编辑您的答案,我认为我的更改会复制您的答案。所以请否认这些变化,因为我已经删掉了你答案的第一部分,这真的很有帮助。
【解决方案2】:

(上一个答案的代码)很酷的功能!有用的。我只是想添加一些 SCSS 语法,让人们有机会使用它:

@function unite($list, $glue: ", ") {
     @if length($list) == 1 {
             @return $list;
     } @else {
        $string: "";
        @each $item in $list {
             @if $string != "" { $string: $string + $glue; }
                 $string: $string + $item;
     }

     @return $string;
     }
}

此时原代码可以这么简洁:

$multi: ".foo", ".bar", ".baz"

#{unite($multi)}
    //CSS properties go here

【讨论】:

    【解决方案3】:

    Compass offers a built-in sprite mixin that does just this. 如果你不想使用所有 Compass,你可以look into their source 看看他们是怎么做的。

    【讨论】:

    • 我发现 sass 不允许任何人轻松地做任何事情,除非它是死的简单的基础知识。
    猜你喜欢
    • 2013-09-04
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 2018-12-07
    • 2015-07-15
    • 2013-08-09
    • 1970-01-01
    相关资源
    最近更新 更多