Vue 进阶(幺柒捌):延伸阅读 Sass、Scss、Less 与 Stylus 编程特性
一、混合(Mixins)
Mixins
是CSS预处理器
语言中最强大的特性,简单点来说,Mixins
可以将一部分样式抽出,作为单独定义的模块,被很多选择器重复使用。平时你在写样式时肯定有碰到过,某段CSS
样式经常要用到多个元素中,这样你就需要重复的写多次。在CSS预处理器
语言中,你可以为这些公用的CSS
样式定义一个Mixin
,然后在你CSS
需要使用这些样式的地方直接调用你定义好的Mixin
。这是一个非常有用的特性,Mixins
被当作一个公认的选择器,还可以在Mixins
中定义变量或者默认参数。
1.1 Sass 混合
Sass
样式中声明Mixins
时需要使用“@mixin
”,后面为Mixins
的名,也可以定义参数,同时可以给这个参数设置一个默认值,但参数名是使用“$
”符号开始,而且和参数值之间需要使用冒号(:
)分开。
在选择器调用定义好的Mixins
需要使用“@include
”,其后为你要调用的Mixins
名。不过在Sass
中还支持老的调用方法,就是使用加号“+
”调用Mixins
,在“+
”后跟Mixins
名。
举个简单的例子,比如说在你的Sass
样式中定义了一个名叫“error
”的Mixin
,这个“error
”设置了一个参数“$borderWidth
”,在无特别定义外,这个参数的默认值设置为“2px
”:
1.2 LESS 混合
在LESS
中,混合是指将定义好的“ClassA
”中引入另一个已经定义的“Class
”,就像在当前的“Class
”中增加一个属性一样。
不过LESS
样式中声明Mixins
和Sass
声明方法不一样,更像CSS
定义样式,在LESS
中,可以将Mixins
看成是一个类选择器,当然Mixins
也可以设置参数,并给参数设置默认值。不过设置参数的变量名是使用“@
”开头,同样参数和默认参数值之间需要使用冒号(:
)分隔开。
正如Sass
混合示例,同样在LESS
样式中定义一个名叫“error
”的Mixin
,这个“error
”设置了一个参数“@borderWidth
”,在无特别定义外,这个参数的默认值是“2px
”:
1.3 Stylus 混合
Stylus
中的混合和前两款CSS预处理器
语言的混合略有不同,可以不使用任何符号,就是直接声明Mixins
名,然后在定义参数和默认值之间用等号(=
)来连接。
三个示例都将会转译成相同的CSS
代码:
二、嵌套(Nesting)
CSS
预处理器语言中的嵌套指的是:在一个选择器中嵌套另一个选择器来实现继承,从而减少代码量,并且增加了代码的可读性。比如说,我们在CSS
中多个元素有一个相同的父元素,我们需要一遍一遍的在每个元素前写这个父元素,那么写样式会变得很乏味,除非给特定的元素添加类名“class
”或者ID
。
相反,使用CSS预处理器
语言的嵌套特性,我们可以在父元素的大括号({}
)里写这些元素。同时可以使用“&
”符号来引用父选择器。对于Sass
、LESS
和Stylus
这三款CSS预处理器
语言的嵌套选择器来说,他们都具有相同的语法:
上面的预处理器转译出来的CSS
代码和我们之前开始展示的CSS
代码是相同的,非常的方便吧!
三、继承(Inheritance)
对于熟悉CSS
的同学来说,对于属性的继承并不陌生。平时在写CSS
样式常碰到多个元素应用相同的样式时,我们在 CSS 中通常都是这样写:
这样做非常好,但往往我们需要给单独元素添加另外的样式,这个时候我们就需要把其中选择器单独出来写样式,如此一来我们维护样式就相当的麻烦。为了应对这个问题,CSS预处理器
语言可以从一个选择继承另一个选择器下的所有样式。
3.1 Sass 和 Stylus 的继承
Sass
和Stylus
的继承是把一个选择器的所有样式继承到另一个选择器上。在继承另一个选择器的样式时需要使用“@extend”
开始,后面紧跟被继承的选择器:
上面的代码转译成 CSS:
3.2 LESS 继承
LESS
支持的继承和Sass
与Stylus
不一样,他不是在选择器上继承,而是将Mixins
中的样式嵌套到每个选择器里面。这种方法的缺点就是在每个选择器中会有重复的样式产生。
转译出来的CSS
代码:
正如所看到的,上面的代码“.block
”的样式将会被插入到相应的你要继承的选择器中,但需要注意的是优先级的问题。
四、运算符(Operations)
CSS预处理器
语言还具有运算的特性,其简单的讲,就是对数值型的Value
(如:数字、颜色、变量等)进行加减乘除四则运算。这样的特性在CSS
样式中是想都不敢想的,但在CSS预处理器
语言中对样式做一些运算一点问题都没有了,例如:
上面代码是LESS
的运算示例,声明一下,在取得“@quarter_page
”变量时,我们可以直接除以 4,但是在这里,我们只是想演示一下圆括号组成的“运算顺序”。在复合型运算中,小括号也是很有必要的,例如:
Sass
在数字运算上要比LESS
更专业,他可以直接换算单位了。Sass
可以处理无法识别的度量单位,并将其输出。这个特性很明显是一个对未来的尝试——证明W3C
作出的一些改变。
Stylus
的运算是三款预处理器语言中最强大的一款,他拥有其他程序语言一样的运算功能,简单点的加减乘除,复杂的有关系运算、逻辑运算等。受限于篇幅,感兴趣的同学可以到官网上仔细阅读。
五、颜色函数
颜色函数是CSS预处理器
语言中内置的颜色函数功能,这些功能可以对颜色进行处理,例如颜色的变亮、变暗、饱和度控制、色相控制,渐变颜色等处理十分的方便。
5.1 Sass 颜色函数
这只是Sass
中颜色函数的一个简单列表,更多详细的介绍可以阅读Sass文档
。
颜色函数可以运用到任何一个元素上,只要其有颜色的属性,下面是一个简单的例子:
5.2 LESS 颜色函数
LESS
的完整颜色函数功能,请阅读LESS文档
。
下面是LESS
中如何使用一个颜色函数的简单例子:
5.3 Stylus 颜色函数
有关于Stylus
的颜色函数介绍,请阅读Stylus文档
。
下面是Stylus
颜色函数的一个简单实例:
从上面展示的部分颜色函数可以告诉我们,Sass
、LESS
和Stylus
都具有强大的颜色函数功能,功能特性上都大同小异,只是在使用方法上略有不同。而且他们都具有相同的一个目的,就是方便操作样式中的颜色值。
六、导入(Import)
在CSS
中,并不喜欢用@import
来导入样式,因为这样的做法会增加http
的请求。但是在CSS预处理器
中的导入(@import
)规则和CSS
的有所不同,它只是在语义上导入不同的文件,但最终结果是生成一个CSS
文件。
如果你是通过“@import ‘file.css
’”导入“file.css
”样式文件,那效果跟普通CSS
导入样式文件一样。
注意:导入文件中定义了变量、混合等信息也将会被引入到主样式文件中,因此需要避免他们的相互冲突。
Sass
、LESS
和Stylus
三款CSS预处理器
语言,导入样式的方法都是一样:
被导入文件的样式:
需要导入样式的文件:
转译出来的 CSS 代码:
七、注释(Comment)
CSS预处理器
语言中的注释是比较基础的一部分,这三款预处理器语言除了具有标准的CSS
注释之外,还具有单行注释,只不过单行注释不会被转译出来。
7.1 Sass、LESS 和 Stylus 多行注释
多行注释和CSS
的标准注释,他们可以输出到CSS
样式中,但在Stylus
转译时,只有在“compress
”选项未启用的时候才会被输出来。
7.2 Sass、LESS 和 Stylus 单行注释
单行注释跟JavaScript
语言中的注释一样,使用双斜杠(//
),但单行注释不会输出到CSS
中。
在Stylus
中除了以上两种注释之外,他还有一种注释,叫作多行缓冲注释。这种注释跟多行注释类似,不同之处在于始的时候,这里是”/*!
”。这个相当于告诉Stylus
压缩的时候这段无视直接输出。
上面从九个常用的特性对Sass
、LESS
和Stylus
三款CSS预处理器
语言的使用做了对比,在某些特性上可以说是一模一样,而有一些特性上功能其实一样,只是在部分书写规则上有所不同。当然有些特性是完全不同。在这里主要是从使用方法上做为一个比较,主要目的是让大家经过对比之后,使自己选择哪一款CSS预处理器
语言有所方向和帮助。
八、CSS 预处理器的高级应用
我们知道,Sass
、LESS
和Stylus
都具有变量、混合、嵌套、函数和作用域等特性,但这些特性都是一些普通的特性。其实除了这些特性之外,他们还拥有一些很有趣的特性有助于我们的开发,例如条件语句、循环语句等。接下来,我们同样从使用上来对比一下这三款CSS预处理器
语言在这方面应用又有何不同异同。
8.1 条件语句
说到编程,对于编程基本控制流,大家并不会感到陌生,除了循环就是条件了。条件提供了语言的可控制,否则就是纯粹的静态语言。提供的条件有导入、混合、函数以及更多。在编程语言中常见的条件语句:
if
表达式满足(true
)的时候执行后面语句块,否则,继续后面的else if
或else
。
在这三款CSS3预处理器
语言中都具有这种思想,只不过LESS
中表达的方式略有不同,接下来我们依次看看他们具体如何使用。
8.1.1 Sass 条件语句
Sass
样式中的条件语句和其他编程语言的条件语句非常相似,在样式中可以使用“@if
”来进行判断:
编译出来的 CSS:
在Sass
中条件语句还可以和@else if
、@else
配套使用:
转译出来的CSS
:
8.1.2 Stylus 条件语句
Stylus
条件语句的使用和其他编程语言的条件语句使用基本类似,不同的是他可以在样式省略大括号({}
):
Stylus
同样可以和else if
、else
配套使用:
Stylus
除了这种简单的条件语句应用之外,他还支持后缀条件语句。这就意味着if
和unless
(熟悉 Ruby 程序语言的用户应该都知道 unless 条件,其基本上与 if 相反,本质上是“(!(expr))
”)当作操作符;当右边表达式为真的时候执行左边的操作对象。
例如,我们定义了negative()
来执行一些基本的检查。下面我们使用块式条件:
接下来,我们利用后缀条件让我们的方法简洁:
当然,我们可以更进一步。如这个“n < 0 ? yes : no
”可以用布尔代替:“n < 0
”。后缀条件适合于大多数的单行语句。如“@import,@charset
”混合书写等。当然,下面所示的属性也是可以的:
上面代码转译出来的CSS
:
8.1.3 LESS 条件语句
LESS
的条件语句使用有些另类,他不是我们常见的关键词if
和else if
之类,其实现方式是利用关键词“when
”。
转译出来的CSS
:
利用When
以及<、>、=、<=、>=
是十分简单和方便的。LESS
并没有停留在这里,而且提供了很多类型检查函数来辅助条件表达式,例如:iscolor
、isnumber
、isstring
、iskeyword
、isurl
等等。
转译出来的 CSS
另外,LESS
的条件表达式同样支持AND
和OR
以及NOT
来组合条件表达式,这样可以组织成更为强大的条件表达式。需要特别指出的一点是,OR
在LESS
中并不是or
关键词,而是用,来表示or
的逻辑关系。
转译出来的 CSS
8.2 循环语句
Sass
和Stylus
还支持for
循环语句,而LESS
并没支持for
循环语句,但值得庆幸的是,在LESS
中可以使用When
来模拟出for
循环的特性。
8.2.1 Sass 循环语句
Sass
中使用for
循环语句需要使用@for
,并且配合“from
”和“through
”一起使用,其基本语法:
我们来看一个简单的例子:
转译出来的 CSS 代码:
在Sass
中循环语句除了@for
语句之外,还有@each
语句和@while
语句
@each
循环语法:
来看个简单的实例:
转译出来的 CSS
@while
循环使用和其他编程语言类似:
转译出来的 CSS
8.2.2 Stylus 循环语句
在Stylus
样式中通过for/in
对表达式进行循环,形式如下:
例如:
转译出来 CSS
下面这个例子演示了如何使用<key-name>
:
转译出来的CSS
8.2.3 LESS 循环语句
在LESS
语言中并没有循环语句,可是像其条件语句一样,通过when
来模拟出他的循环功能。
转译出的 CSS
相比之下,Sass
和Stylus
对条件语句和循环语句的处理要比LESS
语言强大。因为他们具有真正的语言处理能力。
综上所述,我们对Sass
、LESS
和Stylus
做一个简单的对比总结:
三者都是开源项目;
Sass
诞生是最早也是最成熟的CSS预处理器
,有Ruby
社区和Compass
支持;Stylus
早期服务器Node JS
项目,在该社区得到一定支持者;LESS
出现于 2009 年,支持者远超于 Ruby 和 Node JS 社区;Sass
和LESS
语法较为严谨、严密,而Stylus
语法相对散漫,所以LESS
学习起来更快一些,因为他更像CSS
的标准;Sass
和LESS
相互影响较大,其中Sass
受LESS
影响,已经进化到了全面兼容CSS
的SCSS
;Sass
和LESS
都有第三方工具提供转译,特别是Sass
和Compass
是绝配;Sass
、LESS
和Stylus
都具有变量、作用域、混合、嵌套、继承、运算符、颜色函数、导入和注释等基本特性,而且以“变量”、“混合”、“嵌套”、“继承”和“颜色函数”称为五大基本特性,各自特性实现功能基本相似,只是使用规则上有所不同;Sass
和Stylus
具有类似于语言处理的能力,比如说条件语句、循环语句等,而 LESS 需要通过When
等关键词模拟这些功能,在这一方面略逊一层;
上面是CSS
预处理器语言中的Sass
、LESS
和Stylus
在某些方面的对比,相对于CSS
来说,上面都是CSS
预处理器语言的优点?那么他有没有缺点呢?
万物都有阴阳两极,有圆就有缺,CSS预处理器
语言也逃避不了这个宿命。个人感觉 CSS 预处理器语言那是程序员的玩具,想通过编程的方式跨界解决 CSS 的问题。可以说 CSS 应该面临的问题一个也少不了,只是增加了一个编译过程而已,简单来说 CSS 预处理器语言较 CSS 玩法变得更高级了,但同时降低了自己对最终代码的控制力。更致命的是提高了门槛,首先是上手门槛,其次是维护门槛,再来是团队整体水平和规范的门槛。这也造成了初学学习成本的昂贵。
九、拓展阅读
版权声明: 本文为 InfoQ 作者【No Silver Bullet】的原创文章。
原文链接:【http://xie.infoq.cn/article/e2c7bb6e808971ad0a314e562】。文章转载请联系作者。
评论