Sass、LESS 和 Stylus区别总结

CSS 预处理器技术已经非常的成熟了,而且也涌现出了越来越多的 CSS 的预处理器框架。本文便总结下 Sass、Less CSS、Stylus这三个预处理器的区别和各自的基本语法。

1.什么是 CSS 预处理器

CSS 预处理器是一种语言用来为 CSS 增加一些编程的的特性,无需考虑浏览器的兼容性问题,例如你可以在 CSS 中使用变量、简单的程序逻辑、函数等等在编程语言中的一些基本技巧,可以让CSS 更见简洁,适应性更强,代码更直观等诸多好处。

2.基本语法区别:

在使用 CSS 预处理器之前最重要的是理解语法,幸运的是基本上大多数预处理器的语法跟 CSS 都差不多。

首先 Sass 和 Less 都使用的是标准的 CSS 语法,因此如果可以很方便的将已有的 CSS 代码转为预处理器代码,默认 Sass 使用 .sass 扩展名,而 Less 使用 .less 扩展名。

1 /* style.scss or style.less */
2 h1 {
3   color: #0982C1;
4 }

这是一个再普通不过的,不过 Sass 同时也支持老的语法,就是不包含花括号和分号的方式:

1 /* style.sass */
2 h1
3   color: #0982c1

而 Stylus 支持的语法要更多样性一点,它默认使用 .styl 的文件扩展名,下面是 Stylus 支持的语法:

 1 /* style.styl */
 2 h1 {
 3   color: #0982C1;
 4 }
 5 
 6 /* omit brackets */
 7 h1
 8   color: #0982C1;
 9 
10 /* omit colons and semi-colons */
11 h1
12   color #0982C1

可以在同一个样式单中使用不同的变量,例如下面的写法也不会报错:

1 h1 {
2   color #0982c1
3 }
4 h2
5   font-size: 1.2em

3.变量

1. sass:

Sass让人们受益的一个重要特性就是它为css引入了变量。你可以把反复使用的css属性值 定义成变量,然后通过变量名来引用它们,而无需重复书写这一属性值。

sass变量必须是以$开头的,然后变量和值之间使用冒号(:)隔开,和css属性是一样的,例如:

1 $maincolor : #092873;
2 $siteWidth : 1024px;
3 $borderStyle : dotted;
4 body {
5   color: $maincolor;
6   border: 1px $borderStyle $mainColor;
7   max- $siteWidth;
8 }

2.less css :

在less文件中,当一个值需要反复使用时,可以通过@符号定义变量。已经被赋值的变量以及其他的常量(如像素、颜色等)都可以参与运算。

Less css中变量都是用@开头的,其余与sass都是一样的,例如:

1 @maincolor : #092873;
2 @siteWidth : 1024px;
3 @borderStyle : dotted;
4 body {
5   color: @maincolor;
6   border: 1px @borderStyle @mainColor;
7   max- @siteWidth;
8 }

3.stylus:

stylus对变量是没有任何设定的,可以是以$开头,或者任何的字符,而且与变量之间可以用冒号,空格隔开, 但是在stylus中不能用@开头,例如:

1 maincolor = #092873
2 siteWidth = 1024px
3 borderStyle = dotted
4 body 
5   color maincolor
6   border 1px borderStyle mainColor
7   max-width siteWidth

以上三种写法都如同一下这种css:

1 body {
2   color: #092873;
3   border: 1px dotted #092873;
4   max- 1024px;
5 }

这样做的好处也是显而易见的,在修改多处相同颜色的时候,这时就只需要修改变量值即可。

4.嵌套

如果我们需要在CSS中相同的 parent 引用多个元素,这将是非常乏味的,你需要一遍又一遍地写 parent。例如:

 1 div {
 2   margin: 10px;
 3 }
 4 div nav {
 5   height: 25px;
 6 }
 7 div nav a {
 8   color: #0982C1;
 9 }
10 div nav a:hover {
11   text-decoration: underline;
12 }

如果用 CSS 预处理器,就可以少写很多单词,而且父子节点关系一目了然,并且sass,Less,stylus都支持下面这样的写法,且都是相同的:

 1 //scss style //----------------------------------- 
 2 nav { 
 3     ul { 
 4        margin: 0; 
 5        padding: 0; 
 6     } 
 7     li { 
 8        display: inline-block; 
 9     } 
10     a { 
11        display: block; 
12        padding: 6px 12px; 
13        text-decoration: none; 
14     } 
15 }
16 //css style //----------------------------------- 
17 nav ul { 
18     margin: 0; 
19     padding: 0; 
20     list-style: none; 
21 } 
22 nav li { 
23     display: inline-block; 
24 } 
25 nav a { 
26     display: block; 
27     padding: 6px 12px; 
28     text-decoration: none; 
29 }

这样做是非常方便的,也很直观。

5.运算符

在 CSS 预处理器中还是可以进行样式的计算如下:

1 body {
2   margin: (14px/2);
3   top: 50px + 100px;
4   right: 80 * 10%;
5 }

在sass,Less与stylus中都是可以这样做的。

6.颜色函数

CSS 预处理器一般都会内置一些颜色处理函数用来对颜色值进行处理,例如加亮、变暗、颜色梯度等。

1.sass的颜色处理函数:

1 lighten($color, 10%); 
2 darken($color, 10%);  
3 saturate($color, 10%);   
4 desaturate($color, 10%);
5 grayscale($color);  
6 complement($color); 
7 invert($color); 
8 mix($color1, $color2, 50%); 

实例如下:

1 $color: #0982C1;
2 h1 {
3   background: $color;
4   border: 3px solid darken($color, 50%);
5 }

2.Less css颜色处理函数:

1 lighten(@color, 10%); 
2 darken(@color, 10%);  
3 saturate(@color, 10%);  
4 desaturate(@color, 10%); 
5 spin(@color, 10); 
6 spin(@color, -10); 
7 mix(@color1, @color2);

3.Stylus颜色处理函数:

1 lighten(color, 10%); 
2 darken(color, 10%);  
3 saturate(color, 10%);  
4 desaturate(color, 10%); 

示例如下;

1 color = #0982C1 
2 h1
3   background color
4   border 3px solid darken(color, 50%)

7.导入 (Import)
很多 CSS 开发者对导入的做法都不太感冒,因为它需要多次的 HTTP 请求。但是在 CSS 预处理器中的导入操作则不同,它只是在语义上包含了不同的文件,但最终结果是一个单一的 CSS 文件,如果你是通过 @ import “file.css”; 导入 CSS 文件,那效果跟普通的 CSS 导入一样。

注意:导入文件中定义的混入、变量等信息也将会被引入到主样式文件中,因此需要避免它们互相冲突。
例如:
1.css:

1 //1.css
2 /* file.{type} */
3 body {
4   background: #000;
5 }

2.XXX:

1 @ import "1.css";
2 @ import "file.{type}";
3 
4 p {
5   background: #092873;
6 }

最终生成的 CSS:

1 @ import "1.css";
2 body {
3   background: #000;
4 }
5 p {
6   background: #092873;
7 }

8.继承

当我们需要为多个元素定义相同样式的时候,我们可以考虑使用继承的做法.

1.sass:
sass可通过@extend来实现代码组合声明,使代码更加优越简洁。

.message {
  border: 1px solid #ccc;
  padding: 10px;
  color: #333;
}
.success {
  @extend .message;
  border-color: green;
}
.error {
  @extend .message;
  border-color: red;
}
.warning {
  @extend .message;
  border-color: yellow;
}

2.Less css:

但是在这方面 Less 表现的稍微弱一些,更像是混入写法:

 1 .message {
 2   border: 1px solid #ccc;
 3   padding: 10px;
 4   color: #333;
 5 }
 6 .success {
 7   .message;
 8   border-color: green;
 9 }
10 .error {
11   .message;
12   border-color: red;
13 }
14 .warning {
15   .message;
16   border-color: yellow;
17 }

上面两种写法其最终呈现的css样式都如下:

 1 .message, .success, .error, .warning {
 2   border: 1px solid #cccccc;
 3   padding: 10px;
 4   color: #333;
 5 }
 6 .success {
 7   border-color: green;
 8 }
 9 .error {
10   border-color: red;
11 }
12 .warning {
13   border-color: yellow;
14 }

.message的样式将会被插入到相应的你想要继承的选择器中,但需要注意的是优先级的问题。

9.Mixins(混入)

Mixins 有点像是函数或者是宏,当某段 CSS 经常需要在多个元素中使用时,可以为这些共用的 CSS 定义一个 Mixin,然后只需要在需要引用这些 CSS 地方调用该 Mixin 即可。

1.Sass 的混入语法:

sass中可用mixin定义一些代码片段,且可传参数,方便日后根据需求调用。比如说处理css3浏览器前缀:

 1 @mixin error($borderWidth: 2px) {
 2   border: $borderWidth solid #F00;
 3   color: #F00;
 4 }
 5 .generic-error {
 6   padding: 20px;
 7   margin: 4px;
 8   @ include error(); //这里调用默认 border: 2px solid #F00;
 9 }
10 .login-error {
11   left: 12px;
12   position: absolute;
13   top: 20px;
14   @ include error(5px); //这里调用 border:5px solid #F00;
15 }

2.Less CSS 的混入语法:
less也支持带参数的混合以及有默认参数值的混合,如下面的例子所示:

 1 .error(@borderWidth: 2px) {
 2   border: @borderWidth solid #F00;
 3   color: #F00;
 4 }
 5 .generic-error {
 6   padding: 20px;
 7   margin: 4px;
 8   .error(); //这里调用默认 border: 2px solid #F00;
 9 }
10 .login-error {
11   left: 12px;
12   position: absolute;
13   top: 20px;
14   .error(5px); //这里调用 border:5px solid #F00;
15 }

3.Stylus 的混入语法:

 1 error(borderWidth= 2px) {
 2   border: borderWidth solid #F00;
 3   color: #F00;
 4 }
 5 .generic-error {
 6   padding: 20px;
 7   margin: 4px;
 8   error(); 
 9 }
10 .login-error {
11   left: 12px;
12   position: absolute;
13   top: 20px;
14   error(5px); 
15 }

他们最终呈现的效果都如下:

 1 .generic-error {
 2   padding: 20px;
 3   margin: 4px;
 4   border: 2px solid #f00;
 5   color: #f00;
 6 }
 7 .login-error {
 8   left: 12px;
 9   position: absolute;
10   top: 20px;
11   border: 5px solid #f00;
12   color: #f00;
13 }

10.3D文本

要生成具有 3D 效果的文本可以使用 text-shadows ,唯一的问题就是当要修改颜色的时候就非常的麻烦,而通过 mixin 和颜色函数可以很轻松的实现:

1.sass:

 1 @mixin text3d($color) {
 2   color: $color;
 3   text-shadow: 1px 1px 0px darken($color, 5%),
 4                2px 2px 0px darken($color, 10%),
 5                3px 3px 0px darken($color, 15%),
 6                4px 4px 0px darken($color, 20%),
 7                4px 4px 2px #000;
 8 }
 9 
10 h1 {
11   font-size: 32pt;
12   @ include text3d(#0982c1);
13 }

2.Less CSS:

.text3d(@color) {
  color: @color;
  text-shadow: 1px 1px 0px darken(@color, 5%),
               2px 2px 0px darken(@color, 10%),
               3px 3px 0px darken(@color, 15%),
               4px 4px 0px darken(@color, 20%),
               4px 4px 2px #000;
}

span {
  font-size: 32pt;
  .text3d(#0982c1);
}

3.Stylus:

text3d(color)
  color: color
  text-shadow: 1px 1px 0px darken(color, 5%), 
               2px 2px 0px darken(color, 10%), 
               3px 3px 0px darken(color, 15%), 
               4px 4px 0px darken(color, 20%), 
               4px 4px 2px #000
span
  font-size: 32pt
  text3d(#0982c1)

其生成的css最终的效果如下:

span {
  font-size: 32pt;
  color: #0982c1;
  text-shadow: 1px 1px 0px #097bb7,
               2px 2px 0px #0875ae,
               3px 3px 0px #086fa4,
               4px 4px 0px #07689a,
               4px 4px 2px #000;
}

11.列 (Columns)

使用数值操作和变量可以很方便的实现适应屏幕大小的布局处理。
1.Sass:

 1 $siteWidth: 1024px;
 2 $gutterWidth: 20px;
 3 $sidebarWidth: 300px;
 4 body {
 5   margin: 0 auto;
 6    $siteWidth;
 7 }
 8 .content {
 9   float: left;
10    $siteWidth - ($sidebarWidth+$gutterWidth);
11 }
12 .sidebar {
13   float: left;
14   margin-left: $gutterWidth;
15    $sidebarWidth;
16 }

2.Less CSS:

 1 @siteWidth: 1024px;
 2 @gutterWidth: 20px;
 3 @sidebarWidth: 300px;
 4 
 5 body {
 6   margin: 0 auto;
 7    @siteWidth;
 8 }
 9 .content {
10   float: left;
11    @siteWidth - (@sidebarWidth+@gutterWidth);
12 }
13 .sidebar {
14   float: left;
15   margin-left: @gutterWidth;
16    @sidebarWidth;
17 }

3.Stylus:

 1 siteWidth = 1024px;
 2 gutterWidth = 20px;
 3 sidebarWidth = 300px;
 4 
 5 body {
 6   margin: 0 auto;
 7    siteWidth;
 8 }
 9 .content {
10   float: left;
11    siteWidth - (sidebarWidth+gutterWidth);
12 }
13 .sidebar {
14   float: left;
15   margin-left: gutterWidth;
16    sidebarWidth;
17 }

其最终生成的css效果如下:

body {
  margin: 0 auto;
   1024px;
}
.content {
  float: left;
   704px;
}
.sidebar {
  float: left;
  margin-left: 20px;
   300px;
}

12.高级语法

1.在sass中,还支持条件语句:

@if可一个条件单独使用,也可以和@else结合多条件使用

代码如下:

 1 $lte7: true;
 2 $type: monster;
 3 .ib{
 4     display:inline-block;
 5     @if $lte7 {
 6         *display:inline;
 7         *zoom:1;
 8     }
 9 }
10 p {
11   @if $type == ocean {
12     color: blue;
13   } @else if $type == matador {
14     color: red;
15   } @else if $type == monster {
16     color: green;
17   } @else {
18     color: black;
19   }
20 }

其最终的css代码如下:

1 .ib{
2     display:inline-block;
3     *display:inline;
4     *zoom:1;
5 }
6 p {
7   color: green; 
8 }

2.除却条件语句,sass还支持for循环:

for循环有两种形式,分别为:

1 1.@for $var from <start> through <end>
2 2.@for $var from <start> to <end>。

其中$i表示变量,start表示起始值,end表示结束值,这两个的区别是关键字through表示包括end这个数,而to则不包括end这个数。

1 @for $i from 1 to 10 {
2   .border-#{$i} {
3     border: #{$i}px solid blue;
4   }
5 }

同时也支持while循环:

1 $i: 6;
2 @while $i > 0 {
3   .item-#{$i} {  2em * $i; }
4   $i: $i - 2;
5 }

最后,同时支持each命令,作用与for类似:

1 $animal-list: puma, sea-slug, egret, salamander;
2 @each $animal in $animal-list {
3   .#{$animal}-icon {
4     background-image: url('/images/#{$animal}.png');
5   }
6 }

其css最终效果如下:

.puma-icon {
  background-image: url('/images/puma.png'); 
}
.sea-slug-icon {
  background-image: url('/images/sea-slug.png'); 
}
.egret-icon {
  background-image: url('/images/egret.png'); 
}
.salamander-icon {
  background-image: url('/images/salamander.png'); 
}

以上就是sass,Less css与stylus的最显著的区别。

原文地址:https://www.cnblogs.com/wufu2020/p/13130066.html