Scss 學(xué)習(xí)筆記


一、介紹

CSS預(yù)處理器是一個(gè)CSS的增強(qiáng)語法,讓我們可以在 CSS 中使用變量、循環(huán)、嵌套等功能, 可以讓我們的代碼變通性更強(qiáng),可讀性、層級關(guān)系更加明顯
CSS預(yù)處理器種類繁多,目前三種主流的css預(yù)處理器是Sass(Scss)、Less及Stylus

Sass/Scss、Less、Stylus介紹

  • Sass/Scss:
    2007年誕生,最早也是最成熟的CSS預(yù)處理器,擁有ruby社區(qū)的支持和compass這一最強(qiáng)大的css框架。
    目前受LESS影響,已經(jīng)進(jìn)化到了全面兼容CSS的SCSS(SCSS 需要使用分號和花括號而不是換行和縮進(jìn))。

    1.文件擴(kuò)展名不同,Sass 是以“.sass”后綴為擴(kuò)展名,而 SCSS 是以“.scss”后綴為擴(kuò)展名
    2.語法書寫方式不同,Sass 是以嚴(yán)格的縮進(jìn)式語法規(guī)則來書寫,不帶大括號({})和分號(而 SCSS 的語法書寫和我們的 CSS 語法書寫方式非常類似。

  • Less:
    2009年出現(xiàn),受SASS的影響較大,但又使用CSS的語法,相對于Sacc其優(yōu)點(diǎn)是簡單上手和兼容CSS
    其缺點(diǎn)是比起SASS來,他的編程功能不夠,不好用。他反過來也影響了SASS演變到了SCSS的時(shí)代,著名的Twitter Bootstrap就是采用LESS做底層語言的。
  • Stylus:
    2010年產(chǎn)生,來自Node.js社區(qū)。
    主要用來給Node項(xiàng)目進(jìn)行CSS預(yù)處理支持,在此社區(qū)之內(nèi)有一定支持者,在廣泛的意義上人氣還完全不如SASS和LESS

二、環(huán)境搭建


Windows

1.先從官網(wǎng)下載Ruby,安裝過程中請注意勾選Add Ruby executables to your PATH添加到系統(tǒng)  官網(wǎng)
  https://rubyinstaller.org/downloads/
2.ruby -v 如安裝成功會打印版本信息
3.gem update --system //該命令請翻墻一下  升級版本,建議 2.6.x 以上
   gem -v
4.安裝sass  
   gem install sass
   gem install compass
   sass -v

Mac

1.系統(tǒng)自帶Ruby環(huán)境
2.安裝sass  
   gem install sass
   gem install compass
   sass -v

安裝后將sass文件轉(zhuǎn)換成css文件

//單文件轉(zhuǎn)換命令
sass input.scss output.css

//單文件監(jiān)聽命令
sass --watch input.scss:output.css

//如果你有很多的sass文件的目錄,你也可以告訴sass監(jiān)聽整個(gè)目錄:
sass --watch app/sass:public/stylesheets

Vue里的Sass 環(huán)境搭建

1.安裝nodejs,擁有nodejs環(huán)境
2.創(chuàng)建vue項(xiàng)目
3.在項(xiàng)目中安裝sass環(huán)境,需要兩個(gè)依賴 sass-loader, sass-loader依賴于node-sass,
  npm install -D node-sass sass-loader
4.在style標(biāo)簽上加上一個(gè)屬性:lang=”scss” 就可以了
   <style lang="scss">
     .app{
       .....
     }
   </style>

參考:

https://www.sass.hk/install/


三、Sass/Scss學(xué)習(xí)


1、嵌套寫法

Sass 允許將一套 CSS 樣式嵌套進(jìn)另一套樣式中,內(nèi)層的樣式將它外層的選擇器作為父選擇器

#main {
  color: #00ff00;
  width: 97%;

  .redbox {
    background-color: #ff0000;
    color: #000000;
  }
}

// 編譯后, 轉(zhuǎn)為css后的結(jié)果:
#main  {
  color: #00ff00;
  width: 97%; }

#main .redbox {
    background-color: #ff0000;
    color: #000000; }



2、變量

1. 變量的定義及使用

$width: 1600px;
$pen-size: 3em;
.app {
    height: $width;
    font-size: $pen-size;
}

2. 局部變量

#foo {
  $width: 5px;
  width: $width; //編譯時(shí)沒問題
}

#bar {
  width: $width; //編譯時(shí)會報(bào)錯
}



3、數(shù)據(jù)類型

SassScript 支持 7 種主要的數(shù)據(jù)類型:

  • 數(shù)字,1, 2, 13, 10px
  • 字符串,有引號字符串與無引號字符串,"foo", 'bar', baz
  • 布爾型,true, false
  • 顏色,blue, #04a3f9, rgba(255,0,0,0.5)
  • 數(shù)組 (list),用空格或逗號作分隔符,1.5em 1em 0 2em, Helvetica, Arial, sans-serif
  • maps, 相當(dāng)于 JavaScript 的 object,(key1: value1, key2: value2)
  • 空值,null
判斷數(shù)據(jù)類型的方式:type-of($value)

1. 數(shù)字(Numbers)

$my-age: 19;
$your-age: 19.5;
$height: 120px; // 單位會和數(shù)字當(dāng)做一個(gè)整體,進(jìn)行算數(shù)運(yùn)算

2. 字符串 (Strings)

$name: 'Tom Bob';
$container: "top bottom";
$what: heart;

3. 布爾型(Booleans)

$a: true;
$b: false;  // 只有自身是false和null才會返回false,其他一切都將返回true

4. 顏色 (Colors)

//有多種表達(dá)方式
$color: #04a3f9;
$color0: green;
$color1: rgb(255, 255, 0);
$color2: rgba(#f3f3f3m 0.3);  //這種寫法css會報(bào)錯,但scss支持 特別的好用的寫法
$color3: lighten($color, 15%);
$color4: darken($color, 15%);

5. 數(shù)組 (Lists)

$list0: 1px 2px 5px 6px;  //普通的數(shù)組 用空格隔開
$list1: 1px 2px, 5px 6px; //二維數(shù)組 用逗號隔開

6. 映射(Maps)

//以圓括號包含內(nèi)容
$map: (      
  $key1: value1, 
  $key2: value2, 
  $key3: value3 
)

7. 空值(Null)

$value: null; 



4、運(yùn)算符

1. 數(shù)字運(yùn)算符 +, -, *, /, %

  • + 號運(yùn)算符
    // 純數(shù)字 
    $add2: 1 + 2px; // 3px
    $add3: 1px + 2; // 3px
    $add4: 1px + 2px;//3px
    
    // 純字符串
    $add5: "a" + "b"; // "ab"
    $add6: "a" + b;     // "ab"
    $add7: a + "b";     // ab
    $add8: a + b;   // ab
    
    // 數(shù)字和字符串 
    $add9: 1 + a; // 1a
    $adda: a + 1; // a1
    $addb: "1" + a; // "1a"
    $addc: 1 + "a"; // "1a"
    $addd: "a" + 1; // "a1"
    $adde: a + "1"; // a1
    $addf: 1 + "1"; // "11"
    
    // 總結(jié):
    a.純數(shù)字:只要有單位,結(jié)果必有單位
    b.純字符串:第一個(gè)字符串有無引號決定結(jié)果是否有引號
    c.數(shù)字和字符串:第一位有引號,結(jié)果必為引號;第一位對應(yīng)數(shù)字非數(shù)字且最后一位帶有引號,則結(jié)果必為引號
    
    
  • - 號運(yùn)算符
    $add1: 1 - 2; // -1
    $add2: 1 - 2px; // -1px
    $add3: 1px - 2; // -1px
    $add4: 1px - 2px;//-1px
    
    $sub1: a - 1;  // a-1
    $sub2: 1 - a;  // 1-a
    $sub3: "a" - 1;// "a"-1
    $sub4: a - "1";// a-"1"
    
  • * 號運(yùn)算符
    $num1: 1 * 2;    // 2
    $mul2: 1 * 2px;  // 2px
    $num3: 1px * 2;  // 2px
    $num4: 2px * 2px;// 編譯不通過 兩個(gè)字段只能一個(gè)后部分是字符
    $num5: 1 * 2abc; // 2abc
    
  • / 號運(yùn)算符
    // 總結(jié):
    a.不會四舍五入,精確到小數(shù)點(diǎn)后5位
    b.每個(gè)字段必須前部分為數(shù)字,且當(dāng)前者只是單純數(shù)字無單位時(shí),后者(除數(shù))后部分不能有字符。   其余結(jié)果就按順序去除空格后拼接起來。(因?yàn)榇藭r(shí)后綴被當(dāng)被單位看待了)
    
  • % 號運(yùn)算符
    // 總結(jié):
    a.值與"%"之間必須要有空格,否則會被看做字符串
    

2. 關(guān)系運(yùn)算符 >, <, >=,<=

3. 相等運(yùn)算符 ==, !=

4. 布爾運(yùn)算符 and or 以及 not

$a: 1>0 and 0>=5; // fasle 注:值與"and"、"or"和"not"之間必須要有空格,否則會被看做字符串

5. 三目運(yùn)算符 if(條件, 結(jié)果1,結(jié)果2)

p {
    color: if(1 + 1 = 2, green, yellow);
}

// 編譯后, 轉(zhuǎn)為css后的結(jié)果:
p{ color: green;}



5、控制指令

1. @if 指令

$age: 19;

p {
    @if $age == 18 {
        color: red;
    } @else if $age == 19 {
        color: blue;
    } @else {
        color: green;
    }
}

// 編譯后, 轉(zhuǎn)為css后的結(jié)果:
p {
  color: blue;
}

2. @for 指令

@for $i from 1 through 3 { //案例1 through包含end值  值為1,2,3
  .item-#{$i} { width: 2em * $i; }
}

@for $i from 1 to 3 {     //案例2 to不包含end值  值為1,2
  .item-#{$i} { width: 2em * $i; }
}

// 案例1 轉(zhuǎn)為css后的結(jié)果:
.item-1 {
  width: 2em; }
.item-2 {
  width: 4em; }
.item-3 {
  width: 6em; }

3. @each 指令

$list: puma, sea-slug, egret, salamander;

@each $animal in list { 
  .#{$animal}-icon {
    background-image: url('/images/#{$animal}.png');
  }
}

// 編譯后, 轉(zhuǎn)為css后的結(jié)果:
.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'); }

4. @while 指令

$i: 6;
@while $i > 0 {  //while用的很少
  .item-#{$i} { width: 2em * $i; }
  $i: $i - 2;
}

// 編譯后, 轉(zhuǎn)為css后的結(jié)果:
.item-6 {
  width: 12em; }
.item-4 {
  width: 8em; }
.item-2 {
  width: 4em; }



六、混合樣式指令 @mixin

1. 正常使用 @mixin @include

// 例1
@mixin large-text {    //定義混合指令
  font: {
    family: Arial;
    size: 20px;
    weight: bold;
  }
  color: #ff0000;
}

p {
    @include large-text; //引用
}

// 編譯后, 轉(zhuǎn)為css后的結(jié)果:
p {
  font-family: Arial;
  font-size: 20px;
  font-weight: bold;
  color: #ff0000;
}

2. 有參數(shù)的 @mixin

@mixin mp($width) {
    margin: $width;
}

body {
    @include mp($width: 300px);
}

3. 設(shè)置參數(shù)默認(rèn)值

@mixin mp($width: 500px) {
    margin: $width;
}

body {
    @include mp(300px);
}

4. 混合樣式擴(kuò)展

@mixin example {
   color: #ff0000;
}
@include example{ //擴(kuò)展
    background-color: red;
}

p {
    @include example; 
}

// 編譯后, 轉(zhuǎn)為css后的結(jié)果:
p {
    color: #ff0000;
    background-color: red;
}



七、函數(shù)指令 @function

// example:
@function fn-name($params...) {
    @return nth($params, 1);
}
p {
    height: fn-name(1px);
}

// 編譯后, 轉(zhuǎn)為css后的結(jié)果:
p {
  height: 1px;
}



八、其他指令

1. @import 引入其他scss文件

@import "foo.scss"; 
@import "foo";   // 以上兩種方式均可, 注,只能引入scss文件,其他的引入不行,css文件也不行
@import "rounded-corners", "text-shadow"; //同時(shí)引入多個(gè)文件

// 以下方式均不可行
@import "foo.css";
@import "foo" screen;
@import "http://foo.com/bar";
@import url(foo);

2. @extend 繼承屬性

.img {
    color: red;
}
.path{
    @extend .img;
}

// 編譯后, 轉(zhuǎn)為css后的結(jié)果:
.img .path {
  color: red;
}

3. @warn 命令行輸出警告信息

4. @error 命令行輸出錯誤信息



九、其他語法

1. 插值語法

$name: foo;
$attr: border;
p.#{$name} {   //通過 `#{}` 插值語句可以在選擇器、屬性名和屬性值中使用變量
  #{$attr}-color: $name;
}

// 編譯后:
p.foo {
  border-color: foo;
}

2. & 父選擇器

a {
    color: yellow;
    &:hover{
        color: green;
    }
    &:active{
        color: blank;
    }
}

3. !default 設(shè)置默認(rèn)值

$content: "First content";
$content: "Second content?" !default;  //變量是 null 空值時(shí)將視為未被 `!default` 賦值。
$new_content: "First time reference" !default; 

#main {
  content: $content;
  new-content: $new_content;
}

// 編譯后, 轉(zhuǎn)為css后的結(jié)果:
#main {
  content: "First content";
  new-content: "First time reference"; }


四、知識點(diǎn)總結(jié)


  1. 什么是Css預(yù)處理器

  2. Sass/Scss、Less、Stylus的區(qū)別

  3. 嵌套寫法

  4. 變量的定義與使用

  5. 7種常見的數(shù)據(jù)類型
    數(shù)字、字符串、布爾型、顏色、數(shù)組、map、空值

  6. 運(yùn)算符
    布爾運(yùn)算符、三目運(yùn)算符

  7. 4種控制指令

    @if @for @each @while

  8. **@mixin 混合指令的定義與使用 **

  9. 2種其他指令

    @import @extend

  10. 其他語法

    插值語法 、父選擇器


五、學(xué)習(xí)參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容