什么是CSS预处理器?
CSS预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为CSS增加了一些编程的特性,将CSS作为目标生成文件,并且解决了传统CSS编写时遇到的难以解决的问题,如:
- 语法不够强大,无法嵌套书写导致复写很多内容
- 没有变量,逻辑上相关的属性需要重复书写,导致难以维护
现阶段主流CSS预处理器 Less、Sass、Stylus 都提供 CSS 缺失的样式层复用机制、减少冗余代码,提高样式代码的可维护性,但其之中也略有不同,下面将通过几个方面来浅谈各预处理器之前的差异及优缺点。
历史
- SASS,2007年诞生,最早也是最成熟的CSS预处理器,拥有ruby社区的支持和compass这一最强大的css框架,目前受LESS影响,已经进化到了全面兼容CSS的SCSS。
- LESS,2009年出现,受SASS的影响较大,但又使用CSS的语法,让大部分开发者和设计师更容易上手,在ruby社区之外支持者远超过SASS,其缺点是比起SASS来,可编程功能不够,不过优点是简单和兼容CSS,反过来也影响了SASS演变到了SCSS的时代,著名的Twitter Bootstrap就是采用LESS做底层语言的。
- Stylus,2010年产生,来自Node.js社区,主要用来给Node项目进行CSS预处理支持,在此社区之内有一定支持者,在广泛的意义上人气还完全不如SASS和LESS。
基本语法方面
Less 的基本语法属于「CSS 风格」,而 Sass、Stylus 相比之下激进一些,利用缩进、空格和换行来减少需要输入的字符。不过区别在于 Sass、Stylus 同时也兼容「CSS 风格」代码。多一种选择在更灵活的同时,在团队开发中也免不了增加更多约定来保持风格统一。而对个人而言,语法风格按自己口味选择即可。
Less & SCSS:
1 | .box { |
Sass:
1 | .box |
Stylus:
1 | .box |
嵌套语法
三者的嵌套语法都是一致的,甚至连引用父级选择器的标记 & 也相同。区别只是 Sass 和 Stylus 可以用没有大括号的方式书写。
& 引用上层选择器
&对伪类的使用 — hover或 focus
&对连接的使用— &_nav
以 Less 为例:
1 | .a { |
生成的 CSS 为:
1 | .a.b { |
变量
变量无疑为 CSS 增加了一种有效的复用方式,减少了原来在 CSS 中无法避免的重复「硬编码」。
Less:
1 | @red: #c00; |
Sass:
1 | $red: #c00; |
Stylus:
1 | red = #c00 |
变量作用域
三种预处理器的变量作用域都是按嵌套的规则集划分,并且在当前规则集下找不到对应变量时会逐级向上查找,注意这个和原生 CSS 的逻辑是完全不同的。
如果我们在代码中重写某个已经定义的变量的值,Less 的处理逻辑和其他两者有非常关键的区别。在 Less 中,这个行为被称为「懒加载(Lazy Loading)」。所有 Less 变量的计算,都是以这个变量最后一次被定义的值为准。(所以还是老老实实的用闭包的思想限定其作用域吧 -_- |||)
@arguments
@arguments包含了所有传递进来的参数。
如果你不想单独处理每一个参数的话就可以像这样写
原来的办法传参
1 | .border_arg(@w:30px,@c:red,@xx:solid){ |
现在的利用arguments
1 | .border_arg(@w:30px,@c:red,@xx:solid){ |
避免编译
有的时候我们需要输出一些不正确的CSS语法或者使用一些LESS不认识的专有语法
要输出这样的值我们可以在字符串前加上一个 ~
例如:
1 | width:~’calc(100% - 30px)’; |
引入外部的文件(一些库或公共的)
.less文件引入@import "base"; 默认后缀名是.less所以不用写
.css文件引入`@import(less) “a.css”;` //注意(less)有空格,貌似我没用出来有待研究
三种预处理器,个人更加倾向于 Stylus,其相较 其他两者 来说,变量更易保持 ‘清洁’,且更加灵活的支持 「CSS 风格」,可选择性的使用何种方式编写样式,更有效的提高代码的可读性、可维护性,也有利于团队合作。
最后更新: 2018年09月09日 17:13