我如何从这个 Less 代码中提取重复的选择器?

How do I abstract repetitive selector from this Less code?

我有一些可以重复的 Less 代码块 - 这是一个简单的例子:

.span-@{outer-index}-of-@{max-grid} .row:first-of-type .span-@{outer-index}-of-@{max-grid}

如您所见,第一节和最后一节完全相同。

我一直在尝试找出如何创建 @item 变量并按以下方式使用它,但由于语法问题无法编译代码:

@item:.span-@{outer-index}-of-@{max-grid};

@item .row:first-of-type @item {}

有人帮忙吗?

运气好吗?

@item {
    & .row:first-of-type & {}
}

您尝试的代码存在一些小问题,但总的来说您是在正确的道路上。进行以下更正将解决问题。

  1. 当尝试将变量值连接到一个字符串并将连接的字符串作为输出时,您应该将整个内容放在引号内,如下所示。 注意 当您将整个内容放在引号内时,Less 会打印带有我们不需要的引号的输出值,因为我们会在选择器中使用它。因此,我们应该使用 ~()e() 函数从输出中去除引号。

    @item:~".span-@{outer-index}-of-@{max-grid}";
    
  2. 其次,在选择器插值中使用变量动态形成选择器时,变量应采用 @{variable-name} 形式(在大括号内),因此对于您的情况,它应该是修改成如下: <pre>@{item} .row:first-of-type @{item} { color: blue; }

最后,如果我们进行上面第 2 点中提到的相同更改(由于使用了选择器插值),Eric would/should 之前建议的方法也有效。但是,当整个选择器嵌套在另一个 parent 中时,&(parent 选择器)总是意味着整个 parent 到 top-most 级别,因此它可能无法在所有情况下都按预期工作。

例如,考虑如下嵌套场景:

.foo{
    @{item} {
        & .row:first-of-type & {foo:bar;}
    }
}

编译时,上面的代码会产生以下内容 CSS。在这里我们可以看到 .foo parent 如何出现在开始和结束处。

.foo .span-1-of-3 .row:first-of-type .foo .span-1-of-3 {
  foo: bar;
}