Sass入门总结

Sass简介

Sass是一个CSS预处理器,CSS预处理器是用一种专门的编程语言,进行页面样式设计,然后再编译成正常的CSS文件

Sass在 CSS 语法的基础上增加了变量嵌套混合继承等高级功能。

优点:它能用来简洁的清晰的结构化地描述文件样式,更易于代码的维护

Sass与Scss区别

Sass和Scss其实是同一种东西,我们平时都称之为Sass,两者之间的不同在于:

  1. 文件扩展名 不同,sass是“.sass”后缀为扩展名,而scss是以“.scss”后缀为扩展名;
  2. 语法书写方式不同,sass是以严格的缩进式语法规则来书写,也就是说不带大括号{}和分号,而scss的语法书写和CSS语法书写方式非常类似。

Sass写法:

$body-fontsize: 12px// 定义变量
$bg-color: #000  // 定义变量
body 
    font-size: $body-fontsize 
    background-color: $bg-color

Scss写法:

$body-fontsize: 12px;// 定义变量
$bg-color: #000;  // 定义变量
body { 
    font-size: $body-fontsize; 
    background-color: $bg-color;
}

//编译后的css:

body { 
    font-size: 12px; 
    background-color: #333;
}

Angular中Scss的安装

    npm install node-sass --save-dev //需要手动安装node-sass

    ng new My_New_Project --style=scss //自动生成Scss样式文件

Sass快速入门(以下Sass代码都使用Scss格式)

  1. 使用变量

    sass使用$符号来标识变量

    Sass变量的声明和css属性的声明很像:

         $button-color: #F90;//声明变量
         $button-width: 100px;
         $button-height: 50px;
         .button{
             width: $button-width;//引用变量
             height: $button-height;
             background-color: $button-color;
         }
    
         ///编译后css****
    
         .button{
             width: 100px;
             height: 50px;
             background-color: #F90;
         }
    

    全局变量局部变量

     $color: #000; // 定义全局变量
     .block { 
         color: $color;  // 调用全局变量
     }
     em { 
         $color: #fff;  // 定义局部变量
         a{
             color: $color;  // 调用局部变量
         }
     }
     span {
         color: $color;  // 调用全局变量
     }
    
     //编译后
     .block { 
         color: #000;  
     }
     em a{ 
         color: #fff;  
     }
     span {
         color: #000;  
     }
    
  2. 嵌套

    选择器嵌套

    css中重复写选择器是非常恼人的。如果要写一大串指向页面中同一块的样式时,往往需要 一遍又一遍地写同一个ID:

    css:

     #footer nav li { margin-bottom: 20px }
     #footer nav a { color: #333 }   
     #footer p { background-color: #EEE }
    

    Sass:

     #footer {
         nav {
             li { margin-bottom: 20px }
             a { color: #333 }
         }
         p { background-color: #EEE }
     }
    
      /* 编译后结果 */
     #footer nav li { margin-bottom: 20px  }
     #footer nav a { color: #333 }
     #footer p { background-color: #EEE }
    

    属性嵌套

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

    伪类嵌套

     //父选择器的标识符&
    
     .button{
         &:hover,
         &:active {  //群组选择器的嵌套
             background-color:#000;
         }
     }
     /* css */
    
     .button:hover,.button:active { 
             background-color:#000;
     }
    
  3. 混合器

    通过sass的混合器实现大段样式的重用

    混合器使用@mixin标识符定义,样式表中通过@include来使用这个混合器

     @mixin round-border {
       -moz-border-radius: 5px;
       -webkit-border-radius: 5px;
       border-radius: 5px;
     }
     
     .botton{
         width:100px;
         height:50px;
         background:#EEE;
         @include round-border;
     }
     //sass最终生成
     .botton{
         width:100px;
         height:50px;
         background:#EEE;
         -moz-border-radius: 5px;
         -webkit-border-radius: 5px;
         border-radius: 5px;
     }
    

    混合器传参

    可以通过在@include混合器时给混合器传参,来定制混合器生成的精确样式。

     @mixin link-colors($default, $hover ) {
         color: $default;
         &:hover { color: $hover; }
     } 
    
     a {
      @include link-colors(blue, red);
     }
     
     //Sass最终生成的是:
     
     a { color: blue; }
     a:hover { color: red; }
    

    有时候可能会很难区分每个参数是什么意思,参数之间是一个什么样的顺序
    sass允许通过语法$name: value的形式指定每个参数的值。这种形式的传参,参数顺序就不必再在乎了,只需要保证没有漏掉参数即可。

     a {
     @include link-colors(
       $default: blue,
       $hover: red
       );
     }
    

    特点:可传参

    缺点:如果在样式文件中调用同一个混合器,会产生多个对应的样式代码,造成代码的冗余。

  4. 继承

    选择器继承是说一个选择器可以继承为另一个选择器定义的所有样式。这个通过@extend语法实现,如下:

     //通过选择器继承继承样式
     .error {
         border: 1px solid red;
         background-color: #fdd;
     }
     .box {
         @extend .error; // 修饰的html元素最终的展示效果就好像是class="box error"
         border-width: 3px;
     }
    

    继承了.error的元素,同时也会继承 error 有关的组合选择器样式。

     .error a{  //应用到.box a
         color: red;
         font-weight: 100;
     }
     //编译后
     .error, .box {
       width: 70px;
       height: 70px;
       border: 1px solid red;
       background-color: #fdd; 
     }
     
     .box {
       border-width: 3px; 
     }
     
     .error a, .box a{
       color: red;
       font-weight: 100; 
     }
    
  5. 占位符 %

    占位符也是一个非常强大的功能,和继承也有着密切的关系。

    比如说,我们有多个类都有相同的代码共有,需要继承同一个基类。

    那么像上边继承的写法有产生了代码的冗余,最终会编译出多余的代码。

    用占位符声明的代码,在不被@extend调用的情况下,是不会产生任何代码的

    %marginTOP5 {  
      margin-top: 5px;  
    }  

    %paddingTop5{  
      padding-top: 5px;  
    }  
      
    .btn {  
      @extend %marginTOP5;  
      @extend %paddingTop5;  
    }  
      
    .block {  
      @extend %marginTOP5;  
      
      span {  
        @extend %marginTOP5;  
      }  
    }  

    //编译后  
    .btn, .block {  
      margin-top: 5px;  
    }  
      
    .btn, .block span {  
      padding-top: 5px;  
    }  

出色的完成了代码合并,且基类并没有被编译出来,只作用与调用了它的类中。

  1. 混合器、继承、占位符的比较:

混合器:可以传参数,但是代码冗余,相同样式不会合并选择器。所以适合在我们多次使用相同样式,但是值不同的情况下使用。

继承:不能传参数,代码会自动合并,不会冗余。适合于不需要传参的情况下复用代码,并且基类代码具有作用的情况。

占位符:同上,但是区别是在基类没有作用的情况下使用。不会占用css文件大小。

  1. 插值#{}

    将一个占位符,替换成一个值。简单的栗子如下:

     //给按钮添加边框
     $button-color: #F90;//声明变量
     $button-width: 100px;
     $button-height: 50px;
     $vue: border; 
     @mixin more($wid, $sty, $col){
         #{$vue}: #{$wid} #{$sty} #{$col}; //其实就是结合混合宏传多个参数;
     }
     
     .button{
         width: $button-width;//引用变量
         height: $button-height;
         background-color: $button-color;
         @include more(2px,solid,#000)
     }
     //编译后
     .button{
         width: 100px;
         height: 50px;
         background-color: #F90;
         border: 2px solid #000;
     }
    

    构建选择器:

   //用过bootstrap的都知道,它的button有个预定义样式:

     
    //html
    <button type="button" class="btn btn-success">Success</button>
    <button type="button" class="btn btn-info">Info</button>
    <button type="button" class="btn btn-warning">Warning</button>
    <button type="button" class="btn btn-danger">Danger</button>
    
    //css
    
    @mixin button-style($c, $s, $i, $w, $d, $sc, $ic, $wc, $dc){
        .#{$c}-success{ background-color: $s; border-color:$sc; }
        .#{$c}-info   { background-color: $i; border-color:$ic; }
        .#{$c}-warning{ background-color: $w; border-color:$wc; }
        .#{$c}-danger { background-color: $d; border-color:$dc; }
    }
    
    .btn{
      width: 100px;
      height: 50px;
      color: #fff;
    }
    @include button-style('btn', #5cb85c, #5bc0de, 
    #f0ad4e, #d9534f, #4cae4c, #46b8da, #eea236, #d43f3a); 

    //被编译后
    .btn {
      color: #fff;
    }
    .btn-success {
      background-color: #5cb85c;
      border-color: #4cae4c;
    }
    .btn-info {
      background-color: #5bc0de;
      border-color: #46b8da;
    }
    .btn-warning {
      background-color: #f0ad4e;
      border-color: #eea236;
    }
    .btn-danger {
      background-color: #d9534f;
      border-color: #d43f3a;
    }

注意:混合器中使用插值#{}的限制

除了构建选择器,在混合器里面是不能拼接变量名以及不能拼接混合器名

    //错误示范一
    @mixin updated-open {
        margin-top: 20px;
        background: #F00;
    }
    $val: "open";
    .navigation {
        @include updated-#{$flag}; //不能拼接混合器名,在编译成 CSS 时会报错。
    }
    
    //错误示范二
    $margin-big: 40px;
    $margin-small: 12px;
    
    @mixin set-value($size) {
        margin-top: $margin-#{$size};//不能拼接变量名,在编译成 CSS 时会报错。
    }
    
    .box {
        @include set-value(big);
    }
  1. 静默注释

    sass另外提供了一种不同于css标准注释格式/* ... */的注释语法,即静默注释。

     body {
       color: #333; // 这种注释内容不会出现在生成的css文件中
       padding: 0; /* 这种注释内容会出现在生成的css文件中 */
     }
    
  2. Sass运算

    加法:参数可以单位,但需要单位同一类型,运算符左右不加空格也可编译。

     $sidebar-width: 220px;
     $content-width: 720px;
     $gap-width: 20px;
     .container {
         width: $sidebar-width+$content-width + $gap-width;
         margin: 0 auto;
     }
     //编译后
     .container {
        width: 960px;
        margin: 0 auto; 
     }
    

    减法:参数可以单位,但需要单位同一类型,运算符两边需加上空格

     $full-width: 960px;
     $sidebar-width: 200px;
     
     .content {
       width: $full-width -  $sidebar-width;
     }
     //编译后
     .content {
       width: 760px;
     }
    

    乘法:参数可以单位,但需要单位同一类型,一个单位同时声明两个值时会有问题。

     //错误
     .box {
         width:10px * 2px;  
     }
     //正确
     .box {
         width: 10px * 2;//只需要为一个数值提供单位即可
     }
    

    除法:直接使用“/”符号做为除号时,将不会生效,编译时既得不到我们需要的效果,也不会报错。

     .box {
       width: 100px / 2;  
     }
     //编译后
     .box {
       width: 100px / 2;  
     }
    

    添加小括号即可

     .box {
       width: (100px / 2);  
     }
     //编译后
     .box {
       width: 50px;  
     }
    

    当用变量进行除法运算时,“/”符号也会自动被识别成除法

     $width: 1000px;
     .box {
       width: $width / 10;  
     }
    

    当两个值带有相同的单位值时,除法运算之后会得到一个不带单位的数值

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

推荐阅读更多精彩内容