CSS预处理器:Less和Sass区别

注释

less和sass注释一样

// 单行注释 (不会被编译)
/*
多行注释 (会被编译)
*/

1. 定义变量

less变量定义格式: @变量名:取值;

// 全局变量
@w:  200px;
@h: 200px;
.box{
  @w: 300px;   // 局部变量
  width: @w;
  height: @h;
  color: @c;   // 不会报错,可以先使用后定义
}
@c:red;

sass变量定义格式:$变量名:取值;

// 全局变量
$w: 200px;
$h: 200px;
.box{
  $w: 300px;   // 局部变量
  width: $w;
  height: $h;
  // color: $c;  // 会报错,不能先使用后定义
}
// $c: red;

less定义变量使用的@,sass定义变量使用的$
less变量可以先使用后定义,sass变量不是延迟加载,不可以先使用后定义
less和sass都区分全局变量和局部变量

2. 变量插值(了解即可,基本不会用到)

less变量插值

@w: width;
.box{
  @{w}: 200px;
  height: 200px;
}

sass变量插值

$w: width;
.box{
  #{$w}: 200px;
  height: 200px;
}

less变量插值使用方式:@{变量名},sass变量插值使用方式:#{$变量名}

3. 运算

less和sass运算是一样,可以使用+ - * /运算

.box{
  width: 200px;
  height: 200px;
  position: absolute;
  left: 50%;
  margin-left: (-200px * 0.5);
}

4. 混合

4.1.1 less混合定义:.混合名称{} 或者 .混合名称(){};less混合使用:.混合名称 或者 .混合名称()

// .center{
.center(){
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}
.box{
  width: 200px;
  height: 200px;
  // .center;
  .center();
}

如果混合名称后面没有带(),预处理的时候,会保留混合代码
如果混合名称后面有带(),预处理的时候,不会保留混合代码

4.1.2 sass混合定义:@mixin 混合名称{} 或者 @mixin 混合名称(){};sass混合使用:@include 混合名称 或者 @include 混合名称()

// @mixin center{
@mixin center(){
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}
.box{
  width: 200px;
  height: 200px;
  // @include center;
  @include center();
}

sass中不管混合名称后面有没有带(),预处理的时候,都不会保留混合代码

4.2 less和sass混合都可以带形参/指定默认值形参/给指定形参赋值

less不带默认值形参
.model(@w, @h, @c){
  width: @w;
  height: @h;
  color: @c;
}
.box{
  .model(200px, 200px, red);
}
less带指定默认值形参
.model(@w: 200px, @h: 200px, @c: red){
  width: @w;
  height: @h;
  color: @c;
}
.box{
  .model();  // 不传值,使用默认值
}
less给指定形参赋值
.model(@w: 200px, @h: 200px, @c: red){
  width: @w;
  height: @h;
  color: @c;
}
.box{
  .model(@h: 100px);   // height会使用传递的值
}
sass不带默认值形参
@mixin model($w, $h, $c){
  width: $w;
  height: $h;
  color: $c;
}
.box{
  @include model(200px, 200px, red);
}
sass带指定默认值形参
@mixin model($w: 200px, $h: 200px, $c: red){
  width: $w;
  height: $h;
  color: $c;
}
.box{
  @include model();
}
sass带指定默认值形参
@mixin model($w: 200px, $h: 100px, $c: red){
  width: $w;
  height: $h;
  color: $c;
}
.box{
  @include model($h: 200px);
}

4.3 可变参数

less
// .animation(...){    // ...: 可变参数,可以传递0个或多个参数
// 至少传递 @name 和 @time 值
.animation(@name, @time...){
  transition: @arguments;
}
sass
// .animation($args...){    // $args...: 可变参数,可以传递0个或多个参数
.animation($name, $time, $args...){    // 至少传递 $name 和 $time 两个参数
  transition: $name $time $args;
}

less是通过JS实现的,可以使用@arguments来获取到所有传递进来的参数
sass不是通过JS实现的,需要先定义一个可变参数args...,再通过可变参数args来获取到所有传递进来的参数

5. less 和 sass 导入其他 .less 文件或 .scss 文件

两者都是通过 @import 导入

// less 导入其他 .less 文件
@import "model.less";
// sass 导入其他 .scss 文件
@import "model.scss";

其实原生的 CSS 也支持通过 @import 来导入其他的 CSS 文件,只不过不常用。因为原生 CSS 通过 @import 导入其他的 CSS 文件,只有执行到 @import 时,浏览器才会去下载对应的 .css 文件,这导致请求次数变多,页面加载起来特别慢。
而 less 和 sass 中的 @import 是直接将导入的文件拷贝到当前文件中生成一份 css,所以只会请求一次,页面加载起来速度快。

6. 内置函数

less 和 sass 中都提供了内置函数方便我们使用

sass 可以自定义函数

@function sum($num){
  @return $num + $num;
}

7. 继承

less 继承

.center{
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}
.box:extend(.center){
   width: 200px;
  height: 200px;
}

sass 继承

.center{
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}
.box{
  @extend .center;
  width: 200px;
  height: 200px;
}

混合和继承区别
混合:直接拷贝,有多少个地方使用就拷贝多少份
继承:并集选择器,不会拷贝,只会保留一份

8. 条件判断

less 通过when给混合添加执行限定条件,只有条件满足才会执行混合中代码

// .model(@w, @h) when (@w = 100px){  // 只有宽度等于100px,才会执行
//.model(@w, @h) when (@w = 100px), (@h = 100px){  // 当宽度等于100px,或者高度等于100px,才会执行
.model(@w, @h) when (@w = 100px) and (@h = 100px){  // 当宽度等于100px,并且高度也等于100px,才会执行
  width: @w;
  height: @h;
}
.box{
  // .model(200px, 100px);   // 宽度不等于100px,所以不会执行混合中代码 
  // .model(200px, 100px);   // 高度等于100px, 所以会执行混合中代码,并且宽度的值是传递的200px
  .model(100px, 100px);   // 宽度高度都等于100px,所以会执行混合中代码
}

sass 可以通过 @if(条件语句){} @else if(条件语句){} ... @else(条件语句){} 来判断

9. 循环

sass 支持两种循环:for循环和while循环

for循环
// @for $i from 起始整数 through 结束整数 {}
// @for $i from 起始整数 to 结束整数 {}
// 两者书写一样,区别在于 to 不包尾
ul{
  li{
    @for $i 3 through 6 {  // 第3到第6个li元素背景颜色变为红色
      &:nth-child(#{$i}){
        background-color: red;
      }
    }
  }
}
while循环
ul{
  li{
    $i: 3;
    @while($i <= 6) {
      &:nth-child(#{$i}){
        background-color: red;
      }
      $i: $i + 1;
    }
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,874评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,102评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,676评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,911评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,937评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,935评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,860评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,660评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,113评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,363评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,506评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,238评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,861评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,486评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,674评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,513评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,426评论 2 352