本篇記錄前端 SCSS 的一些筆記。
SCSS 和 Sass 的差別在哪裡?
Sass 為 Syntactically Awesome Style Sheets 的簡稱,是一種預處理腳本語言(Pre-processor scripting language),將 SASS File 編譯後可得到一般的 CSS File。
那麼,SCSS 呢?
SCSS aka Sassy CSS(參考#1),是 CSS 的超集合。不論是 .sass 或 .scss 都是 Sass 的格式,要被 Sass 的編譯器轉換過才能使用。而 .sass 是比較舊的格式,並且因為一些問題而較難被閱讀和撰寫,所以相容 CSS 的新格式 .scss 就誕生了。
接下來對 Sass 的使用皆以 SCSS 的語法為主。
SCSS 基礎
參考官方教學(參考#3 - Sass Basic),實際練習可搭配 Sassmeister 來使用(參考#4)
Variable 變數
Sass 的變數就和一般程式語言的一樣,宣告和呼叫時加上錢字號 $ 在前即可。
1 2 3 4 5 6 7
   | $font-stack: Helvetica, sans-serif; $primary-color: #333;
  body {   font: 100% $font-stack;   color: $primary-color; }
   | 
 
編譯後如下
1 2 3 4
   | body {   font: 100% Helvetica, sans-serif;   color: #333; }
  | 
 
Nesting 巢狀結構
HTML 有著巢狀的結構,但一般的 CSS 卻沒有,在 Sass 中則加入了巢狀這個特性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
   | nav {   ul {     margin: 0;     padding: 0;     list-style: none;   }   li {     display: inline-block;   }   a {     display: block;     padding: 6px 12px;     text-decoration: none;   } }
  | 
 
如 nav 底下的 ul, li 及 a 要撰寫 CSS,必須在 ul, li 及 a 之前加上 nav,但在 Sass 中可省去此步驟,直接把這三個元素包起來。編譯成 CSS 後如下
1 2 3 4 5 6 7 8 9 10 11 12 13
   | nav ul {   margin: 0;   padding: 0;   list-style: none; } nav li {   display: inline-block; } nav a {   display: block;   padding: 6px 12px;   text-decoration: none; }
  | 
 
Partials 部分檔案 及 Modules 模組
在 Sass 中可以使用底線開頭的檔案如 _partial.scss,然後用 @use 來使用這樣的部分檔案,引入後就會包成一個 module,使用時用 moduleName.? 來取用 module 裡的 variables, mixins 和 functions。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   |  $font-stack: Helvetica, sans-serif; $primary-color: #333;
  body {   font: 100% $font-stack;   color: $primary-color; }
 
  @use 'base';
  .inverse {   background-color: base.$primary-color;   color: white; }
 
  | 
 
編譯後得到
1 2 3 4 5 6 7 8 9
   | body {   font: 100% Helvetica, sans-serif;   color: #333; }
  .inverse {   background-color: #333;   color: white; }
  | 
 
Mixins 混和
在 Sass 中也可以自定義一些 CSS rules 混和在一起,使用方式就像是一個會回傳一堆 CSS rules 的 function,也可以傳入變數。宣告時用 @mixin 開頭,取用時則用 @include 來使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
   | @mixin theme($theme: DarkGrey) {   background: $theme;   box-shadow: 0 0 1px rgba($theme, 0.25);   color: #fff; }
  .info {   @include theme; } .alert {   @include theme($theme: DarkRed); } .success {   @include theme($theme: DarkGreen); }
  | 
 
編譯後得到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
   | .info {   background: DarkGrey;   box-shadow: 0 0 1px rgba(169, 169, 169, 0.25);   color: #fff; } .alert {   background: DarkRed;   box-shadow: 0 0 1px rgba(139, 0, 0, 0.25);   color: #fff; } .success {   background: DarkGreen;   box-shadow: 0 0 1px rgba(0, 100, 0, 0.25);   color: #fff; }
  | 
 
Extend / Inheritance 延展/繼承
如同物件導向的程式語言,Sass 也可以用 extend 來繼承先寫好的一些屬性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   | %message-shared {   border: 1px solid #ccc;   padding: 10px;   color: #333; }
  .message {   @extend %message-shared; } .success {   @extend %message-shared;   border-color: green; } .error {   @extend %message-shared;   border-color: red; } .warning {   @extend %message-shared;   border-color: yellow; }
  | 
 
編譯後得到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | .warning, .error, .success, .message {   border: 1px solid #ccc;   padding: 10px;   color: #333; } .success {   border-color: green; } .error {   border-color: red; } .warning {   border-color: yellow; }
   | 
 
參考資料
- Stack Overflow - What’s the difference between SCSS and Sass?
 
- Geeks for Geeks - What is the difference between SCSS and SASS ?
 
- Sass Basic
 
- Sassmeister