什么是FIT CSS?这是dongdong同志给按照不同浏览器的需要下载不同样式表的实现所下的一个定义。 FIT CSS的目标就是用户只会拿到自己需要的样式,减少数据的加载量。概念来自: http://www.conditional-css.com/index。举个例子进行简单的解释:
.box_shadow {
-webkit-box-shadow: 0px 0px 4px 0px #ffffff; /* Saf3-4, iOS 4.0.2 – 4.2, Android 2.3+ */
-moz-box-shadow: 0px 0px 4px 0px #ffffff; /* FF3.5 – 3.6 */
box-shadow: 0px 0px 4px 0px #ffffff; /* Opera 10.5, IE9, FF4+, Chrome 6+, iOS 5 */
filter: progid:DXImageTransform.Microsoft.Shadow(Strength=3, Direction=135, Color=’#ffffff); /* IE8- */
}
按照以前的实现,我们需要把以上所有样式都写上确保所有浏览器都能比较好的工作,FIT的思路是把把上面的CSS内容分拆到不同的文件,比如客户端如果是使用的IE8,他所拿到的css名称会是style-ie8.css, 内容如下
.box_shadow {
filter: progid:DXImageTransform.Microsoft.Shadow(Strength=3, Direction=135, Color=’#ffffff); /* IE8- */
}
这样代码会轻便许多。如果使用FIT CSS的里面,计会减少下载体积20%-30%。
昨天根据这种思想,尝试了一下LESS中的实现,我们会根据一份LESS文件产生不同后缀的CSS文件,比如:Style.less会产生style.css(此文件会包含所有定义), style-ie7.css, style-ie8.css, style-firefox.css, style-safari.css等。我们写LESS的时候只要在同一行内加上约定格式的注释就可以了。比如说上面的例子,可以改写成:
.box_shadow {
-webkit-box-shadow: 0px 0px 4px 0px #ffffff; //#safari#
-moz-box-shadow: 0px 0px 4px 0px #ffffff; //#firefox#
box-shadow: 0px 0px 4px 0px #ffffff; //标准CSS3属性,此处没有添加判断浏览器的注释,所有浏览器都保留
filter: progid:DXImageTransform.Microsoft.Shadow(Strength=3, Direction=135, Color=’#ffffff); //#ie7# #ie8#
}
我们在改写LESS的编译器后可以的到如下文件:
1. style-safari.css
.box_shadow {
-webkit-box-shadow: 0px 0px 4px 0px #ffffff;
box-shadow: 0px 0px 4px 0px #ffffff;
}
2. style-firefox.css
.box_shadow {
-moz-box-shadow: 0px 0px 4px 0px #ffffff; //#firefox#
box-shadow: 0px 0px 4px 0px #ffffff;
}
3. style-ie7.css
.box_shadow {
box-shadow: 0px 0px 4px 0px #ffffff;
filter: progid:DXImageTransform.Microsoft.Shadow(Strength=3, Direction=135, Color=’#ffffff);
}
4. style-ie8.css
.box_shadow {
box-shadow: 0px 0px 4px 0px #ffffff;
filter: progid:DXImageTransform.Microsoft.Shadow(Strength=3, Direction=135, Color=’#ffffff);
}
5…
通过此编译方法我们不同客户端得到的CSS文件体积会大大减小。
下面说一下如何修改编译器,以Winless为例,编译器的工作原理是读取LESS源文件,通过less.js解析,然后写入到指定文件夹中。我们修改写入过程就可以了。Winless的安装目录有lessc.wsf文件,基于Jscript,非常容易修改,具体修改办法就不赘述了,主要是添加一个对象browsers,按照browsers对象属性值生成以此属性值为结尾的CSS文件,要做到这点,在核心方法convert()中添加一个参数传入浏览器名称就可以了。
var browsers = {
ie7 : ‘ie7′,
ie8 : ‘ie8′,
ie9 : ‘ie9′,
ie10 : ‘ie10′,
chrome : ‘chrome’,
firefox : ‘firefox’,
opera : ‘opera’,
safari : ‘safari’
}
因为对于一款浏览器我们需要删除不需要的那些带注释的浏览器的CSS属性,我们必须添加一个条件,通过正则表达式删除那些行就可以了,由于本人不熟悉正则表达式,费了一番功夫,还好最终搞定了。
if(platform){ //add platform selection
output = output.substr(0, output.length – 4) + ‘-’ + platform + ‘.css’;
var regStr = ”;
for (x in browsers){
if (browsers[x] === platform){
continue;
}
regStr = regStr + ‘#’ + browsers[x] + ‘#|’;
}
regStr = regStr.substr(0, regStr.length – 1);
regStr = ‘/^((?=.*?(‘ + regStr + ‘))(?!.*?(#’ + platform + ‘#))).*$/mg’;
var regex = eval(regStr);
data=data.replace(regex, ”);
}
到此,不同浏览器的不同CSS已经搞定,并且我们只用维护一份LESS文件,何其简单,剩下的就交给后端去处理就OK啦。