跳至主要内容

快速複習SASS

搬家後未整理

這篇文章從Medium直接搬運過來,未花時間整理與重新驗證,
該文章是Dec. 16, 2019撰寫,由於是技術相關文件,請留意內容是否已經不再適用。

本文為閱讀30天掌握Sass語法筆記(Day 1~Day 7),詳細解說歡迎閱讀原文!

SASS是什麼?

  • Syntactically Awesome Stylesheets
  • CSS 預處理器(Preprocessor)語言
  • 職缺要求裡面很常看到的詞

SASS怎麼寫?

CSS:

.menu {
position: relative;
}
.menu li {
float: left;
}
.menu a {
display: block;
}
.menu span {
color: #fff
}
.menu i {
background: url(dot-icon.png);
}

問題點:

  1. 每次都必須重新打一次.menu後才有辦法繼續寫一個樣式的設定,例如.menu a、.menu li
  2. 日後.menu要改其它名稱就必須逐行去修改。
  3. 如果不小心恍神少了個「;」、「{」、「}」時,壞掉通常都需要花時間除錯。

SASS:

.menu
position: relative
li
float: left
a
display: block
span
color: white
i
background: url(dot-icon.png)

導入前的自我檢查:

  1. 是否有許多後代選擇器難以管理?

變數

CSS:

.header a {
color: #000;
}
.menu a {
color: blue;
}
.footer a {
color: #000;
}
.nav a {
color: blue;
}

問題點:

  1. 連結有設計固定顏色,但修改時需要逐行瀏覽修正

SASS:

$link-color-1: #000
$link-color-2: blue
.header a
color: $link-color-1
.menu a
color: $link-color-2
.footer a
color: $link-color-1
.nav a
color: $link-color-2

導入前的自我檢查:

  1. 是否有固定的設計可以用變數取代?

@import

使用@impor載入其他sass檔,可將程式碼切成各模組區塊,程式碼較少,同時也較能準確聚焦欲修改的區塊 SASS: (before)

// all.sass
.main
width: 500px

.container
height: 100px

問題點:

  1. 如果檔案非常大,要找到要修改的區塊將變得非常困難

SASS: (after)

// _index.sass
.main
width: 500px
// _page.sass
.container
height: 100px
// all.sass
@import index
@import page

在index.sass和page.sass檔名前加上_,則該檔案不會被編譯出來,最後只有all.sass被編譯出來,成功將數個sass整合編譯成為一個css檔案。

導入前的自我檢查:

  1. 是否有單一檔案過大?可否切割出獨立檔案以便修改?

@mixin

可以傳入參數,參數可設定預設值,會在呼叫的地方實際產生編譯出來的結果

SASS:

@mixin bg($bgcolor:#000,$width:200px)
background: $bgcolor
width: $width
.header
+bg
.footer
+bg(#ff0000,300px)

編譯出來的CSS:

.header {
background: black;
width: 200px;
}
.footer {
background: red;
width: 300px;
}

導入前的自我檢查:

  1. 是否有可以抽出來統一管理的相同樣式?

@extend

可以繼承樣式。

CSS:

/* 第200行位置 */
.header h1, .content h1, .footer h1 {
font-size: 20px;
line-height: 1.8;
letter-spacing: 1px;
}

/* 第400行位置 */
.header h1 {
color: black;
}

/* 第1000行位置 */
.content h1 {
color: green;
}

/* 第4000行位置 */
.footer {
color: pink;
}

問題點:合併樣式程式碼的位置在第200行,而我目前所在位置是在4640行,當我又需要合併樣式時,就又必須用滾輪會調卷軸到第200行來合併class樣式,所以當程式碼越變變多時,要集中相同樣式的工作流程相對也會變得更加繁瑣。

SASS:

%all-h1
font-size: 20px
line-height: 1.8
letter-spacing: 1px
.header h1
@extend %all-h1
color: #000
.content h1
@extend %all-h1
color: green
.footer
@extend %all-h1
color: pink

導入前的自我檢查:

  1. 是否有合併樣式以致於難以管理的地方?

@mixin與@extend的使用時機該如何抉擇?

基本上來說,
@mixin是將程式碼帶入到對應的class去,同時可帶入參數。
@extend則是藉由class合併,並吃到共通樣式,但沒辦法帶入參數。

所以如果你的樣式都固定不變的,不會需要用參數帶進去改變樣式的話,
那用@extend程式碼會比較少些。
但如果你的程式碼需要帶入多個變數進行運算時,
那用@mixin則較適合。

從使用CSS轉換到SASS(以node-sass進行手動編譯)

原文是以Compass進行編譯,因為自己平常是用node.js開發,就試著用node-sass吧!

  1. 建構使用CSS的簡單網頁
  2. 安裝node-sass
npm i -g node-sass
  1. 將CSS改寫為SASS
  2. 將SASS檔案編譯成CSS檔案
node-sass index.sass > style.css

主要就是兩個使用的指令,這是超級簡化版本。

以上若有任何錯誤歡迎指正!

參考文章

  1. 30天掌握Sass語法
  2. How to start using SASS for CSS in your Node.js Web App in less than 5 minutes.