css系列—sass,scss,less,stylus的比较
发布日期:2021-05-06 19:38:57 浏览次数:27 分类:精选文章

本文共 4086 字,大约阅读时间需要 13 分钟。

这三种的直观比较

可以参考这两篇博文

(CSS 预处理的区别的深度比较 - Stylus/Sass/Less)

(为您详细比较三个 CSS 预处理器(框架):Sass、LESS 和 Stylus)

1.CSS预处理器

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

我们将会从语法、变量、嵌套、混入(Mixin)、继承、导入、函数和操作符等方面分别对这三个框架进行比较介绍。

语法

变量

在 CSS 预处理器中声明变量,并在整个样式单中使用

Sass 的变量必须是 $ 开始,然后变量名和值使用冒号隔开,跟 CSS 的属性一致:

$mainColor: #0982c1;$siteWidth: 1024px;$borderStyle: dotted; body {  color: $mainColor;  border: 1px $borderStyle $mainColor;  max-width: $siteWidth;}

而 Less 的变量名使用 @ 符号开始:

@mainColor: #0982c1;@siteWidth: 1024px;@borderStyle: dotted; body {  color: @mainColor;  border: 1px @borderStyle @mainColor;  max-width: @siteWidth;}

Stylus 对变量名没有任何限定,你可以是 $ 开始,也可以是任意的字符(但不能是@)

mainColor = #0982c1siteWidth = 1024px$borderStyle = dotted body  color mainColor  border 1px $borderStyle mainColor  max-width siteWidth

上面三种编译后就是

body {  color: #0982c1;  border: 1px dotted #0982c1;  max-width: 1024px;}

嵌套

三个 CSS 框架都是允许嵌套语法

section {  margin: 10px;   nav {    height: 25px;     a {      color: #0982C1;       &:hover {        text-decoration: underline;      }    }  }}

最终编译的结果就是

section {  margin: 10px;}section nav {  height: 25px;}section nav a {  color: #0982C1;}section nav a:hover {  text-decoration: underline;}

Mixins (混入)

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

Sass 的混入语法:

/* Sass mixin error with (optional) argument $borderWidth which defaults to 2px if not specified */@mixin error($borderWidth: 2px) {  border: $borderWidth solid #F00;  color: #F00;} .generic-error {  padding: 20px;  margin: 4px;  @ include error(); /* Applies styles from mixin error */}.login-error {  left: 12px;  position: absolute;  top: 20px;  @ include error(5px); /* Applies styles from mixin error with argument $borderWidth equal to 5px*/}

Less 的混入语法:

/* LESS mixin error with (optional) argument @borderWidth which defaults to 2px if not specified */.error(@borderWidth: 2px) {  border: @borderWidth solid #F00;  color: #F00;} .generic-error {  padding: 20px;  margin: 4px;  .error(); /* Applies styles from mixin error */}.login-error {  left: 12px;  position: absolute;  top: 20px;  .error(5px); /* Applies styles from mixin error with argument @borderWidth equal to 5px */}

Stylus 的混入语法:

/* Stylus mixin error with (optional) argument borderWidth which defaults to 2px if not specified */error(borderWidth= 2px) {  border: borderWidth solid #F00;  color: #F00;} .generic-error {  padding: 20px;  margin: 4px;  error(); /* Applies styles from mixin error */}.login-error {  left: 12px;  position: absolute;  top: 20px;  error(5px); /* Applies styles from mixin error with argument borderWidth equal to 5px */}

最终它们都将编译成如下的 CSS 样式:

.generic-error {  padding: 20px;  margin: 4px;  border: 2px solid #f00;  color: #f00;}.login-error {  left: 12px;  position: absolute;  top: 20px;  border: 5px solid #f00;  color: #f00;}

继承

在 Sass 和 Stylus 我们可以这样写:

.block {  margin: 10px 5px;  padding: 2px;} p {  @extend .block; /* Inherit styles from '.block' */  border: 1px solid #EEE;}ul, ol {  @extend .block; /* Inherit styles from '.block' */  color: #333;  text-transform: uppercase;}

在这里首先定义 .block 块,然后让 p 、ul 和 ol 元素继承 .block ,最终生成的 CSS 如下:

.block, p, ul, ol {  margin: 10px 5px;  padding: 2px;}p {  border: 1px solid #EEE;}ul, ol {  color: #333;  text-transform: uppercase;}

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

.block {  margin: 10px 5px;  padding: 2px;} p {  .block; /* Inherit styles from '.block' */  border: 1px solid #EEE;}ul, ol {  .block; /* Inherit styles from '.block' */  color: #333;  text-transform: uppercase;}

生成的 CSS 如下: 

.block {  margin: 10px 5px;  padding: 2px;}p {  margin: 10px 5px;  padding: 2px;  border: 1px solid #EEE;}ul,ol {  margin: 10px 5px;  padding: 2px;  color: #333;  text-transform: uppercase;}

导入 (Import)

很多 CSS 开发者对导入的做法都不太感冒,因为它需要多次的 HTTP 请求。但是在 CSS 预处理器中的导入操作则不同,它只是在语义上包含了不同的文件,但最终结果是一个单一的 CSS 文件,如果你是通过 @ import "file.css"; 导入 CSS 文件,那效果跟普通的 CSS 导入一样。注意:导入文件中定义的混入、变量等信息也将会被引入到主样式文件中,因此需要避免它们互相冲突。

@extend

@at-root

控制指令 (Control Directives)

混合指令 (Mixin Directives)

 

上一篇:JavaScript系列—性能优化之一《网页性能管理详解》
下一篇:JavaScript系列—宏任务和微任务

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年04月16日 19时29分42秒