未嵌套的解决方案
我只是在这里提供这个作为最终输出代码目的的替代方案。我的回答并没有真正直接解决循环的嵌套问题(因为您的问题是并且您自己的回答找到了该解决方案)。相反,它挑战嵌套是否最好地解决您面临的问题。
假设您拥有一个类结构(my-class-2-6
例如),您可以通过不嵌套它们而是使用 CSS3 属性选择器将输出 CSS 选择器从 64 个减少到仅 16 个(这可能是不可取的,具体取决于您需要支持的目标浏览器)。因此,这个 LESS:
@maxi: 8;
@maxj: 8;
@iSelStart: ~'[class^=my-class-';
@jSelStart: ~'[class$=-';
@ijSelEnd: ~']';
.i-loop (@i) when (@i > 0) {
@{iSelStart}@{i}@{ijSelEnd} {
width: (100% / @i);
}
.i-loop(@i - 1);
}
.j-loop (@j) when (@j > 0) {
@{jSelStart}@{j}@{ijSelEnd} {
height: (100% / @j);
}
.j-loop(@j - 1);
}
//stop loops
.i-loop (0) {}
.j-loop (0) {}
//itialize loops
.j-loop(@maxj);
.i-loop(@maxi);
变成这个 CSS:
[class$=-8] {
height: 12.5%;
}
[class$=-7] {
height: 14.285714285714286%;
}
[class$=-6] {
height: 16.666666666666668%;
}
[class$=-5] {
height: 20%;
}
[class$=-4] {
height: 25%;
}
[class$=-3] {
height: 33.333333333333336%;
}
[class$=-2] {
height: 50%;
}
[class$=-1] {
height: 100%;
}
[class^=my-class-8] {
width: 12.5%;
}
[class^=my-class-7] {
width: 14.285714285714286%;
}
[class^=my-class-6] {
width: 16.666666666666668%;
}
[class^=my-class-5] {
width: 20%;
}
[class^=my-class-4] {
width: 25%;
}
[class^=my-class-3] {
width: 33.333333333333336%;
}
[class^=my-class-2] {
width: 50%;
}
[class^=my-class-1] {
width: 100%;
}
因此, 的示例my-class-2-6
将以给出 a 的类名的开头为目标,并以my-class-2
给出 a的类名width: 50%
的结尾为目标。-6
height: 16.666666666666668%;
对于未来面临类似情况、只担心针对 CSS3 浏览器的用户来说,这只是一个想法。
更新:添加保护以防止错误定位
事后想到,如果你有各种类型的类可能有一个-1
或-2
等的结尾,那么你的结尾 CSS 可能需要一组额外的代码来帮助过滤那个类。因此,j
上面的循环代码需要对选择器字符串进行更改,如下所示:
@{iSelStart}@{ijSelEnd}@{jSelStart}@{j}@{ijSelEnd} { /*properties*/}
然后将输出这种格式的代码:
[class^=my-class-][class$=-1] {
/*properties*/
}
这样,它专门寻找以my-class-
结尾的“类” -1
,并且会忽略选择另一个类,就像another-class-1
上面的原始代码仍然会选择一样。这是否是一个问题将纯粹与一个站点中使用的设计和类命名有关。