###### tags: `Front-End` `CSS預處理器` `SASS` `gulp` `webpack` # [week 13] 前端工具之二 - CSS 預處理器、Babel > 本篇為 [[FE201] 前端中階:那些前端會用到的工具們](https://lidemy.com/p/fe201) 這門課程的學習筆記。如有錯誤歡迎指正。 ## 前言 在使用新工具之前,大致會依照下列步驟: 1. 安裝工具 2. 閱讀官方文件 3. 更改設定檔 --- ## SASS:CSS 預處理器 在進入 CSS 預處理器之前,先談談 CSS 在開發上可能遇到哪些問題: - 全域會互相干擾 - 例如:在 index.html 同時引入 main.css 和 normalize.css 可能會互相干擾,不易進行 debug 與維護 - 沒有變數 - 現在有 CSS Variable - 沒有辦法組合 因此 CSS 預處理器就誕生了,讓我們能夠以寫程式的方式處理樣式,方便進行維護。 ![](https://i.imgur.com/p8sM9vr.png) ### 什麼是 SASS? #### [SASS(Syntactically Awesome Stylesheets)/ SCSS](https://sass-lang.com/install) - 是 CSS 預處理器,能更有結構撰寫程式碼,方便後續維護 - 適合大型專案使用 - SASS 無大括號;SCSS 有,因此後者和 CSS 相容 - CSS 預處理器需另外編譯成 CSS,瀏覽器才能看得懂 > 【註】[SAS(Statistical Analysis System) / SPSS](https://www.sas.com/zh_tw/home.html):統計分析系統,用來進行數據分析的軟體 ### SASS 提供的功能 - 參數與結構化 CSS - Nesting:巢狀語法 - Variables:變數設定 - 模組化 CSS - Import - Extend - Mixin - Functions - 自動化 CSS - Condition - Loop ### 相關語法 - 安裝 Sass `npm install -g sass`:`-g` 表示在全域安裝 - 一次性編譯 `sass main.sass main.css`:將 main.sass 檔編譯成 main.css - watch 模式 `sass --watch main.sass main.css`:每次存檔均會自動進行編譯 - 壓縮功能 `sass --style=compressed mais.sass main.css`:通常是在開發最後才會執行 ## Sass 實作補充 main.css 通常由下列要素組成: 1. utils:整理出常用的 variables(背景顏色等)和 mixins(垂直至中、對齊等樣式功能) 2. Components:整理跨頁元件 3. Layouts:獨立的大元件 4. Pages 5. 其他樣式:themes(dark mode)、vendors(bootstrap css) ### 巢狀與變數 1. 巢狀語法:注意 `&` 前的空格 ```sass= .section width: 100% height: 50% border-bottom: 1px solid #000 padding: 2rem &__title text-align: center &__wrapper display: flex justify-content: center align-items: center ``` 編譯結果: ```css= .section { width: 100%; height: 50%; border-bottom: 1px solid #000; padding: 2rem; } .section__title { text-align: center; } .section__wrapper { display: flex; justify-content: center; align-items: center; } /*# sourceMappingURL=main.css.map */ ``` 2. 變數設定:使用 `$` 來命名 ```sass= $primary: #0047AB $secondary: #4D80E6 $warning: #CD5C5C $text:#CCCCFF $background: #eeeeee .color width: 50px height: 50px margin: 10px background: #000 &-primary background: $primary &-secondary background: $secondary &-warning background: $warning &-text background: $text &-background background: $background ``` 編譯結果: ```css= .color { width: 50px; height: 50px; margin: 10px; background: #000; } .color-primary { background: #0047AB; } .color-secondary { background: #4D80E6; } .color-warning { background: #CD5C5C; } .color-text { background: #CCCCFF; } .color-background { background: #eeeeee; } /*# sourceMappingURL=main.css.map */ ``` ### 模組化 CSS #### `@import`:引入檔案,用來分別進行管理 - 例如:將變數放到 `_variables.sass` 統一管理,然後在 `main.sass` 加上 `@import _variables.sass` 即可引入檔案 #### `export`:繼承,處理共同樣式 - 使用時機:可將所有相同樣式的內容合併,減少重複的行為 - 例如:`<a>` 統一去除底線、制定 template ```sass= %btn padding: 1rem 2rem color: $background font-size: 1rem margin: 1rem transition: .1s .btn &-primary @extend %btn &-secondary @extend %btn &-waring @extend %btn ``` 編譯結果: ```css= .btn-waring, .btn-secondary, .btn-primary { padding: 1rem 2rem; color: #eeeeee; font-size: 1rem; margin: 1rem; transition: 0.1s; } ``` #### `mixin`:打包常用功能,替換局部變數 - 使用時機:用於需重複使用到的屬性,且可帶入變數,以進行微調 - 例如:width、height、flex-center 等 ```sass= @mixin btn padding: 1rem 2rem color: $background font-size: 1rem margin: 1rem transition: .1s .btn &-primary +btn &-secondary +btn &-waring +btn ``` 編譯結果: ```css= .btn-primary { padding: 1rem 2rem; color: #eeeeee; font-size: 1rem; margin: 1rem; transition: 0.1s; } .btn-secondary { padding: 1rem 2rem; color: #eeeeee; font-size: 1rem; margin: 1rem; transition: 0.1s; } .btn-waring { padding: 1rem 2rem; color: #eeeeee; font-size: 1rem; margin: 1rem; transition: 0.1s; } ``` #### `function`:可回傳數值,搭配變數和 mixin 使用 - 與 `@mixin` 的不同之處,在於 `@function` 只會回傳一個值,而 `@mixin` 是回傳一段CSS程式碼 ### Sass 自動化 #### loop 迴圈 - 使用 `@each` 搭配 array - 以逗號表示 `center, start, end` ```sass= $direction-types: center, start, end @each $type in $direction-types .flex-#{$type} display: flex justify-content: $type align-items: center ``` 編譯結果: ```css= .flex-center { display: flex; justify-content: center; align-items: center; } .flex-start { display: flex; justify-content: start; align-items: center; } .flex-end { display: flex; justify-content: end; align-items: center; } ``` - 使用 `@each` 搭配 map - 在括號以 `參數:值` 表示 `(center: center, start: flex-start, end: flex-end)` ```sass= $direction-types: (center: center, start: flex-start, end: flex-end) @each $type, $value in $direction-types .flex-#{$type} display: flex justify-content: $value align-items: center ``` 編譯結果: ```css= .flex-center { display: flex; justify-content: center; align-items: center; } .flex-start { display: flex; justify-content: flex-start; align-items: center; } .flex-end { display: flex; justify-content: flex-end; align-items: center; } ``` - for 迴圈 - 使用時機:用於預先設定,或特效網站需產生密集大小值 ```sass= @for $i from 0 through 5 .h#{5 - $i + 1} font-size: 1 + 0.2rem * $i ``` 編譯結果: ```css= .h6 { font-size: 1rem; } .h5 { font-size: 1.2rem; } .h4 { font-size: 1.4rem; } .h3 { font-size: 1.6rem; } .h2 { font-size: 1.8rem; } .h1 { font-size: 2rem; } ``` #### condition 有關 Flow Control 可參考[官方文件](https://sass-lang.com/documentation/at-rules/control/for)。 參考資料: - [Sass/SCSS 基本語法介紹,搞懂CSS 預處理器](https://tw.alphacamp.co/blog/css-preprocessor-sass-scss) - [常用色彩表](http://www.ebaomonthly.com/window/photo/lesson/colorList.htm) - [SCSS 筆記(2) - extend、mixin、function](https://icguanyu.github.io/scss/scss_2/) ### 重構檔案流程 - 步驟一:將重複的部分用巢狀方式撰寫 - 步驟二:將顏色、字體大小,統一使用變數命名 `_variables.sass` - 步驟三:抽檔案,把重複的區塊放到 `_components.sass` - 步驟四:將分出的區塊以 `@import` 引入,完成後將所有檔案打包 --- ## BABEL:JS 轉譯器 [BABEL](https://babeljs.io/) 是 JavaScript 轉譯器,可將 ES6+ 程式碼轉為等效的 ES5 程式碼。 參考資料:[利用 Babel 支援現代 JavaScript 的特性](https://michaelchen.tech/javascript-programming/babel/)