CSS 预处理器-Sass基础

上一节讲完了Sass安装与编译的入门支持,本节主要讲Sass的基础语法。

1.变量


在Sass中可以定义变量,变量以$开头+变量名,使用冒号(:)来为变量赋值(相当于传统的=号)。字符串不需要引号。

$red: #132132; 
  boby {
   background-color : $red;
  }

可以为变量定义后面添加 !default来设置默认变量。

/* blue覆盖red */
$color: bule;
$color: red !default;
body {
    color: $color;
    border: 1px solid $color;
}

按照常规的覆盖方案,似乎用不着设置默认变量,只需要把被覆盖的变量放在上方,如下所示。

/* blue覆盖red */
$color: red;
$color: bule;
body {
    color: $color;
    border: 1px solid $color;
}

但是如果是为局部变量设置默认变量那就不一样,代码如下所示。

/* blue覆盖red */
$color: bule;
body {
    $color: red !default;
    color: $color;
    border: 1px solid $color;
}

当然这样的技巧还有很多。

还可以把变量嵌入sass任何地方中,从而动态调整属性。格式为#{$变量名}

$side:top; 
div { 
    border-#{$side}-radius:10px;
}

2.嵌套


Sass 的嵌套分为三种:

  • 选择器嵌套
  • 属性嵌套
  • 伪类嵌套

在sass选择器嵌套中,可以在内部使用&字符代替当前选择器,具体效果如下。
scss文件:


nav {
    a {
        color: red;

        header & {
            color:green;
        }
    }
}

css效果:

nav a {
  color:red;
}

header nav a {
  color:green;
}

在sass属性嵌套中,可以把属性前缀名拆开来设置属性,具体效果如下
scss文件:

/* 注意,border后面必须加上冒号。 */
.box {
    border: {
       top: 1px solid red;
       bottom: 1px solid green;
    }
}

css效果:

.box {
  border-top: 1px solid red;
  border-bottom: 1px solid green;
}

伪类嵌套和属性嵌套非常类似,也需要借助&符号一起配合使用
scss文件:

.clearfix{
&:before,
&:after {
    content:"";
    display: table;
  }

css效果:

.clearfix:before, .clearfix:after {
  content: "";
  display: table;
}

3.计算


在sass中可以使用常规的+(加)、-(减)、*(乘)、/(除)、%(求模)。在运算中,操作符的优先级和常规编程语法一样:
1.括号优先级最高
2.乘法,除法优先于加法,减法

加法必须要单位相同,或者只为其中一边添加单位。减法也同理。

h2 {
    font-size:5px + 2em;  //错误!!!编译报错
    font-size:5px + 2;    //7px
    font-size:5 - 2px;    //3px
}

p {
  color: #010203 + #040506;  // 颜色也可以做加法运算
}

乘法和加减法有所不同,在乘法中其中一个因数是倍数,所以只能有一个因数带单位,如下所示。

body {
    font-size: 30 * 1.1px;  // 33px
    font-size: 30px * 1.1;  // 33px
    font-size: 30px * 1.1px;  // 报错 
}

p {
  color: #010203 * 2;  // 颜色也可以做乘法运算
}

除法与乘法不同,除法符号/,在css某些属性的简写下,是可以直接书写的。
比如:

font: 16px/24px Arial;

由于这样的css属性,所以sass重载了该符号,不能直接当除法使用。

所以在如在以下情况,是不做除法运算的。

nav {
    //不执行除法操作
   margin:16px / 24px;

    //使用变量嵌入,不执行除法操作
    $base-size: 18px;
    $line-height: 10px;
    font-size: #{$base-size} / #{$line-height};
}

在如下情况是做除法运算的,但是和乘法不同,允许被除数和除数都带相同单位。

    //使用括号之后,执行除法操作,结果为2,而不是2px
    font-size: (10px / 5px);
    
    //若除法结果不带单位,可以加上一个带单位的数,结果为5em。
    font-size: (10px / 5px) + 3em;  

    //使用变量,执行除法操作,结果为2,而不是2px
    $base-size: 10px;
    $line-height: 5px;
    font-size: $base-size / $line-height;

    //使用算术操作符,执行除法操作
     font-size: 2px / 4px + 3px;

而且和乘法不一样的是,被除数是必须带单位,除数则根据需要可带单位,或者不带单位(被除数 / 除数 = 商)。具体效果如下所示:

.box {
     margin:(10px / 5);  // 结果为2px,有单位

     margin:(10px / 5px);  // 结果为2,无单位

     margin:(10 / 5);  //结果为2,和上面等价
      
     margin:(10 / 5px);  //报错  
}

4.注释


在sass中有两种注释,一种是编译后注释内容会被忽略,另一种情况是编译后注释内容会保存。

// (编译后被省略)

/* (保留到编译后) */

5.混合宏@mixin


混合宏是一个可以复用的代码块,定义好之后可在其他代码块中调用。类似一个方法。

无参数混合宏
在 Sass 中,使用“@mixin”来声明一个混合宏,调用一个宏命令为@include mixinName。如:

/* 定义宏命令 */
@mixin border-radius{
    -webkit-border-radius: 5px;
    border-radius: 5px;
}
.nav { 
    @include border-radius;  // 调用宏命令
}


border-radius是混合宏的名称。

带参数混合宏
除了声明一个不带参数的混合宏之外,还可以在定义混合宏时带有参数,如:

@mixin box($radius: 5px, $margin: 1px) {
    -webkit-border-radius: $radius;
    border-radius: $radius;
    margin: $margin;
}
.nav{ 
    @include box(10px, 5px);  // 调用宏命令
    @include box($margin: 5px);  // 只为margin传值,radius使用默认值
}

若调用时不传参数,则默认为redius=5px,margin=1px。

多值的混合宏:
有一个特别的参数“”。当混合宏传的参数过多之时,可以使用参数来替代。

@mixin box-shadow($shadow...) {
  -webkit-box-shadow:$shadow;
  box-shadow:$shadow;
}
.nav {
  @include box-shadow(0 2px 2px rgba(0,0,0,.3), 
                      0 3px 3px rgba(0,0,0,.3),
                      0 4px 4px rgba(0,0,0,.3));
}

6.继承


在 Sass 中也可以继承,可以继承类中的样式代码块。在 Sass中通过关键词 “@extend”来继承已存在的类样式块,从而实现代码的继承。如下所示:


.line {
  border: 1px solid #eee;
  font-size: 16px;
}
.h2 {
  background-color: yellow;
  @extend .line;
}
.h3 {
  background-color: red;
  @extend .line;
}

7.占位符


占位符是解决了早期继承中代码冗余的情况(不过现在的sass版本,继承已经没有这个问题了,但调用混合宏会有代码冗余)。什么叫代码冗余?早期继承会产生这样的问题,css无法成解析成组选择器。占位符格式为%name,name必须以字母或下划线开头。以上面代码为例,早期不用占位符来继承解析出来的css如下。

/* -----------.scss文件--------------- */
.line {
  border: 1px solid #eee;
  font-size: 16px;
}
.h2 {
  background-color: yellow;
  @extend .line;
}
.h3 {
  background-color: red;
  @extend .line;
}

/* -----------.css文件--------------- */
.line {
  border: 1px solid #eee;
  font-size: 16px;
}
.h2 {
  background-color: yellow;
  border: 1px solid #eee;
  font-size: 16px;
}
.h3 {
  background-color: red;
  border: 1px solid #eee;
  font-size: 16px;
}

如果使用占位符,代码相对简洁,同时父类不会编译出来,不用考虑到父类编译出来对整个样式的影响。这样就可以通过占位符的相互继承关系,在样式中调用。代码如下所示:

/* -----------.scss文件--------------- */
%line {
  border: 1px solid #eee;
  font-size: 16px;
}
.h2 {
  background-color: yellow;
  @extend %line;
}
.h3 {
  background-color: red;
  @extend %line;
}

/* -----------.css文件--------------- */
.h2, .h3 {
  border: 1px solid #eee;
  font-size: 16px;
}
.h2 {
  background-color: yellow;
}
.h3 {
  background-color: red;
}

在对基类继承、占位继承、混合宏调用的使用的场合要把握好。

结语


以上是sass的基础部分,到这里就结束了,sass的细节问题还需要大家在掌握基础的层次上深入学习。下一节将继续讲解sass的进阶部分。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容

  • 1、SCSS 是 Sass 的新语法格式,从外形上来判断他和 CSS 长得几乎是一模一样,代码都包裹在一对大括号里...
    夜幕小草阅读 1,704评论 2 10
  • 一、Sass的语法格式及编译调试 1. Sass和scss的区别 本质上来说是同一个东西,只是语法上有细微的差异:...
    没汁帅阅读 1,308评论 0 5
  • 声明变量 定义变量的语法: 在有些编程语言中(如,JavaScript)声明变量都是使用关键词“var”开头,但是...
    Junting阅读 1,464评论 0 6
  • 编译 使用 sass --watch监控文件的改变,并对其进行实时编译语法: sass --watch input...
    放风筝的小小马阅读 426评论 0 0
  • 前言 什么是CSS预处理器 定义:CSS预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为CSS增...
    SA_Arthur阅读 3,113评论 0 18