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; }
由于只有一行,尽量简化了。pf
是前缀 prefix 的意思,c
是迭代项,入参值为 parseInt("@{gridColumns}")
,这样变化就由 variables.less 控制了。看起来不是很直观,加个注释声明了一下。