前端中階:CSS 預處理器

Hugh's Programming life
5 min readSep 8, 2019

--

CSS preprocessor

CSS 預處理器。就是運用程式化的方式寫 CSS,最後 compile 成真的 CSS。

會產生的原因是 CSS 在撰寫的過程中,同樣也會有很多重復性的 CSS 樣式設定,這時候就可以通過預處理器把寫好的 CSS 設定儲存成變數,然後就只要在需要的位置放上這個變數即可。另外一個好處是這樣以後要改變資料的時候,就只要改變變數即可。這樣就會全部套用了。也就是說可以使用寫程式的方法來寫 CSS 了。

有三套可以用,三套都差不多,語法也都差不多。

  1. Scss/Sass 這一套最為廣泛使用
  2. Less
  3. Stylus

所以學一套就可以通用三套。

安裝方式

通過 npm 使用指令安裝,官網有說明

npm install -g sass

安裝後就可以用指令檢查版本

sass -v 

scss 就要另外安裝了
目前查到是要利用傳統一點的方式安裝,先安裝 ruby 之後再利用 ruby 去安裝即可。

用 ruby 的好處根據官網是說運行會比較快。用 node.js 安裝的話運行速度會比較差。

接下來就介紹幾個特性

變數

在 sass/scss 上是使用 $ 作為變數的符號。先撰寫一個簡單的 SCSS

$brand-color : red;.box {
background: $brand-color;
}
.list {
background: $brand-color;
}

然後使用 command line 的指令就可以轉換scss 檔案路徑 就可以轉換成功。

就發現可以轉換成功。

然後要輸出檔案就是同樣的指令後面加上輸出的路徑

scss 檔案路徑 輸出路徑 
// scss ./huli/index.sass index.css

Nesting 巢狀

這是很直覺的方式。

原本在寫 CSS 的時候,一個元素底下的元素,我們就需要另外指定,或者是使用多個選擇器。像是 div div {} 這樣表示 div 底下的 div。
現在有巢狀之後就不一樣了。可以寫成。

div {
div {
xxx:xxxx
}
}

實際舉例,原本的巢狀寫法經過轉換之後:

如果要巢狀就需要一直重複寫,這在 BEM 的時候,就可寫的更簡單,因為 BEM 命名法通常都還蠻長的。

Parent

這是真正可以解除 BEM 根源問題的方法。通過使用 & 符號來代表接續前面的命名法。

這樣還可以很快地改變命名法的字,所以現在的前端幾乎都會使用這個。

Mixin(就像 function)

可以帶入變數,還可以運算。

所以通過這樣子就可以利用寫程式的方法來寫 CSS。

其他

除此之外還可以引入其他的 CSS 利用 @import xxx.scss 。這類似於 PHP 等於是直接複製貼上那樣子。

PostCSS

CSS preprocessor 是把本來類 CSS 的語法轉換成 CSS,而 PostCSS 則是再把它轉成別方式,舉例來說,只需要寫上需要的 CSS,就會把針對個瀏覽器去新增各種語法。

例如,原本寫

border-radius: $radius;

經過 PostCSS 就會被轉換成下面這樣。

  -webkit-border-radius: $radius;
-moz-border-radius: $radius;
-ms-border-radius: $radius;
border-radius: $radius;

這樣就只需要專注於寫 CSS 就好。

預處理器是讓開發者撰寫一些類似 CSS 語法的指令,再轉為瀏覽器能懂的 CSS;相較之下,後處理器就是讓開發者依然撰寫 CSS,再經過擴充功能(plugin)的後製處理,將特定功能轉成瀏覽器能懂的指令。過去常用的 LESS、SASS、SCSS 是屬於預處理器,而 PostCSS 是屬於後處理器

參考資料

PostCSS 就稱之為後處理器( Postprocessors)

GitHub 官方網站

除此之外,另外一個優點是,他可以針對瀏覽器不支援新版本的 CSS3 的部份,去做轉換。通過 PostCSS 的處理就可以轉換成舊的語法。

CSSnext 官方網站

原生 CSS3 本身就有支援變數功能,只是瀏覽器可能還不支援,所以就可以利用這種方式來轉換。

總結

PostCSS 就是著重在跨瀏覽器的部份。
CSS preprocessor 就是注重在用程式化的方式寫 CSS。

--

--

Hugh's Programming life
Hugh's Programming life

Written by Hugh's Programming life

我是前端兼後端工程師,主要在前端開發,包括 React、Node.js 以及相關的框架和技術。之前曾擔任化工工程師的職位,然而對電腦科技一直抱有濃厚的熱情。後來,我參加了轉職課程並開設這個部落格紀錄我的學習過程。於2020年轉職成功後,我一直持續精進技能、擴展技術範疇跟各種對人生有正面意義的學習,以增加我的工作能力。

No responses yet