用Less 的 js方式替代 bootStrap 里 [class*=”span”]
Bootstrap 里的 grid system 里面 (源代码) 有这么一段,
[class*="span"] {
float: left;
margin-left: @gridGutterWidth;
}
用 RECESS 去跑会看到提示:
Universal selectors should be avoided
。这个既可以说是 selector 的问题,也可以说是 RECESS 的问题,但可以在运行的时候加个参数忽略掉。自己去写扩展时也会写到类似的规则,比如需要兼容某浏览器,如果不这样写,就会需要像Bootstrap-IE6 那样写
.span1, .span2, .span3, .span4, .span5, .span6,
.span7, .span8, .span9, .span10, .span11, .span12 {
float: left;
display: inline;
}
但这样太丑陋僵化了,而且经不起变化,当我使用 16 栅格或者其它非 12 栅格时,就非常被动。
如果不使用 [attr*=val],不知道 LESS 是否有现成的东西来简化。我设想会不会有类似于".span" + [1..@{gridColumns}]
的特性支持。嗯,是有点过于美好了。
但是 LESS 支持运行 JavaScript,这里没有太复杂的运算,只是字符串迭代拼接,感觉可行,于是有了下面这个。
// Modify this for custom colors, font-sizes, etc
@import "variables.less";
// equals [class*="span"]
(~`(function(pf,c){var a=[];while(c>0){a.push(pf+c);c--;}return a.join(',');})('.span',parseInt("@{gridColumns}"))`) {
float: left;
margin: 0 @gridGutterWidth 0 0;
}
//Js如下:
(function(pf,c){
var a=[];
while(c>0){
a.push(pf+c);
c--;
}
return a.join(',');
})('.span',parseInt("@{gridColumns}"))
由于只有一行,尽量简化了。pf
是前缀 prefix 的意思,c
是迭代项,入参值为parseInt("@{gridColumns}")
,这样变化就由 variables.less 控制了。看起来不是很直观,加个注释声明了一下。