# Sass 管理CSS之用途。 處理解決的問題 ## Sass原理 scss檔案透過編譯方式轉成css檔案,程式碼都寫在scss裡面 - sass是程式語言,有兩種寫法 1. SCSS 也可以純粹的css 2. Sass 不寫大刮號 =={}== 不寫分號 ==;== ### Sass 與 SCSS的不同之處 - Sass格式 1. 冒號後面一定要有一個空白 程式碼單行結束不需要寫分號 2. 兩個空白或一個tab鍵為一個階層的區別 ```sass= menu li color: red line-height: 2 ``` [Sass格式程式碼示範及編譯結果](https://codepen.io/ztion/pen/ZEqgBej) - SCSS格式 以括號為階層的區別 ```sass= menu{ li{ color: red; line-height: 2; } } ``` [SCSS格式程式碼示範及編譯結果](https://codepen.io/ztion/pen/dygxORP) ### Sass編譯方式 1. 軟體編譯 (例如:prepros) 2. gulp webpack 前端任務/打包工具 (需要了解到JavaScript) 3. 編輯器內建的插件 (VScode延伸套件「Live Sass Compiler」) [Sass編譯環境設定](https://ithelp.ithome.com.tw/articles/10273399#%E5%8F%83%E6%95%B8%E8%A7%A3%E6%9E%90) ### &連結符號 教學 連結與上一層的作用 ```sass= .header { height: 500px; .logo { background: #000; a { color: #000; &:hover { color: pink; } &:active { text-decoration: none; } } } } ``` [&連結符號示範及編譯結果](https://codepen.io/ztion/pen/RweXoZa?editors=1100) ## SCSS - Sass變數(variables)常用語法 範例 ```sass= //SCSS 程式碼 //先宣告變數 $link-color: #ff0000; //後面導入變數 .header a { width: 500px; color: $link-color; } ``` 編譯順序是從上到下的,變數要在檔案前面宣告,在編譯時才找到已宣告的變數 [變數運用示範及編譯結果](https://codepen.io/ztion/pen/QWZeGqa) ### 註解方式 - ==//== 不會編譯到css檔案的註解 - ==/**/== 會編譯到css檔案的註解 ### 變數格式 - 格式 - 數字:10、1px、3em - 字串:'test'、"../image/big/" - 顏色:red、#000000、rgb(255,255,255,0.9) - 布林:true、flase - 空值:null - 支援運算(1em+1em、6px*2) #### 數字運算範例 ```sass= // SCSS格式程式碼 $link-color: #ff0000; $font-m: 16px-3px; $font-l: $font-m * 1.2; .header a { font-size: $font-m; width: 500px; color: $link-color; } .header h1 { font-size: $font-l; } ``` [數字運算示範及編譯結果](https://codepen.io/ztion/pen/eYPqByQ?editors=1100) #### 字串管理範例 文字內容請用單引號或雙引號包起來 ```scss= //SCSS格式程式碼 $link-color: #ff0000; $font-l: 18px; $font-family-base: "Helvetica,Arial,sans-serif"; $font-family-title: "monospace"; body { font-family: $font-family-base; } .header { a { width: 500px; color: $link-color; } h1 { font-size: $font-l; } } .content { a { color: $link-color; } h2 { font-family: $font-family-title; } } ``` [字串示範及編譯結果](https://codepen.io/ztion/pen/RweXoyG?editors=1100) #### 顏色範例 ```scss= // SCSS規格程式碼 $base-color: #008000 .box { width: 100px; height: 100px; margin: 20px; } .box1 { background: $base-color; } .box2 { background: darken($base-color,20%) } .box3 { background: lighten($base-color,30%) } ``` [顏色示範及編譯結果](https://codepen.io/ztion/pen/bGmXgWm?editors=1100) ## 從基礎到進階的變數管理技巧 ```scss= $primary: $blue; //主色系設定 ``` ## @import(匯入) 可將SCSS檔案彙整成一隻CSS檔 [SCSS 最新版本引入檔案方式](/oousfdvzQTOd9erCbb4saw) ### import+變數雙向管理 下底線SCSS檔案名稱(ex:==_variable.scss==) 下底線名命的scss檔案為偽檔案==不能單獨被編譯成css檔案==,需要被其他檔案引入使用。 在主要的SCSS檔案內導入該檔案 ```scss= // _variable.scss程式碼內容 $link-color: #ff0000; $text-color: #5eff00; $font-l: 18px; $font-family-base: "Helvetica,Arial,sans-serif"; $font-family-tile: "monispace"; ``` ```scss= // all.scss程式碼內容 @import "_variable.scss" body{ family-font-base: $font-family-base; color: $link-color; } .header { a { width: 500px; color: $link-color; } h1 { font-size: $font-l; } } .content { a { color: $link-color; } h2 { font-family: $font-family-base; } } .footer { a { color: $link-color; } } ``` ```css= /* 編譯後css程式碼內容 */ body { font-family: "Helvetica,Arial,sans-serif"; color: #5eff00; } .header a { width: 500px; color: #ff0000; } .header h1 { font-size: 18px; } .content a { color: #ff0000; } .content h2 { font-family: "monospace"; } .footer a { color: #ff0000; } ``` all.scss多為引入其他scss檔案的總合檔案 ## @Mixin 能夠定義一個包含一組css屬性和值的區塊,然後在需要的地方引用該區塊,從而避免在多個地方重複輸入相同的css,可以獨立一個==mixin==的scss檔案。 ```scss= /* 設定mixin */ @mixin button-style { padding: 10px 20px; background-color: #007bff; color: #ffffff; border: none; border-radius: 5px; } /* 引用mixin設定,使用@include引入 */ .button { @include button-style; } .another-button { @include button-style; background-color: #ff6347; } ``` ## RWD使用@mixin設定方式 將需設定的@media裝置的設定,統一設定@mixin,使用時,只需 ==@include==, ==@mixin==設定,一定要在@mixin的巢狀中,寫 ==@include==,才可以在引入後,再寫樣式設定。 ```scss= /* 平板設定 */ @mixin table { @media (max-width: 768px){ @content } }; /* 手機設定 */ @mixin mobile { @media (max-width: 375px){ @content } }; /* @content裡面為自己撰寫的CSS樣式 */ ``` ```scss= /* 實際範例 */ @mixin pad { @media (max-width: 768px) { @content } } @mixin iphone5 { @media (max-width: 320px) { @content } } .header { width: 100px; heigth: 100px; @include pad(){ height: auto; } @include iphone5(){ height: 30px; } a { color: #000; @include iphone5(){ display: none; } } } ``` ```scss= /* 實際範例編譯完成的css檔案 */ .header { width: 100px; heigth: 100px; @media (max-width: 768px) { .header { heigth: auto; } } } @media (max-width: 320px) { .header { height: 30px; } } .header a { color: #000; @media (max-width: 320px) .header a { display: none; } } ``` ## 繼承 @extend 可全站共用 將相同scss的樣式設定,共用一份樣式設定在編譯後的css集合在一起呈現。 在撰寫的時候,建議放在scss檔案的上方,避免被覆蓋。 ==百分比(%)開頭專門被繼承的樣式==,如使用 ==點(.)== 開頭則不會繼承樣式 ```scss= // 使用百分比(%)開頭撰寫方式,相同樣式會統一集合在一起呈現 %aButton { display: inline-block; text-direction: none; } a { @extend %aButton; width: 100%; height: 20px; line-height: 20px; } ``` [Codepen](https://codepen.io/ztion/pen/GRwVpxK?editors=1100) ```scss= .button { display: inline-block; text-direction: none; } .button-red { background-color: red; } a { @extend .button; @extend .button-red; width: 100px; heigth: 20px; line-height: 20px; } a { @extend .button-red; width: 100px; heigth: 20px; line-height: 20px; } ``` ## @fuction 計算變數 - 建立函式與返回結果 - 添加並傳入其餘參數 - 添加並傳入可選參數 - 添加並傳入關鍵字參數 ```scss= $baseLineHeight: 10px; @function line($count: 1) { @return $baseLineHeight * $count; } .aa { padding: line(2); } .bb { padding: line(1); } .cc { padding: line(3); } ``` [參考資訊](https://awdr74100.github.io/2020-06-01-scss-function-return/) ## CSS Reset (meyerweb與Normalize的差異) - meyerweb 清空所有瀏覽器的預設樣式 - Normalize 有保留部份的瀏覽器的預設樣式 (bootstrap使用此CSS Reset) ## 整合Reset流程 1. 基本樣式變數 2. reset 3. 自己寫的css 4. 外部引入 [Sass/CSS 模組化設計模式](/DIscniCiTtCSPNJcWC6tNw) ## import設計 1. 變數 2. reset 3. 斷點 grid.scss 4. layout.scss 5. index ## 常見Sass檔案分離規劃 1. 主要Sass檔案(Main Sass Files): - `_variables.scss`:存儲全局變數,如顏色、字體大小、間距等。 - `_mixins.scss`:定義Mixin,用於生成可重複使用的樣式片段。 - `_functions.scss`:定義函式,用於處理複雜的樣式計算和操作。 - `_base.scss`:包含網站或應用的基本樣式,例如重置、一般的HTML元素樣式等。 - `_layout.scss`:定義佈局相關的樣式,如網格系統、容器大小等。 2. 模組Sass檔案(Module Sass Files): - `_header.scss`:==頁面頭部==相關的樣式。 - `_navigation.scss`:==導航菜單==相關的樣式。 - `_sidebar.scss`:==側邊欄==相關的樣式。 - `_button.scss`:==按鈕==樣式。 - `_form.scss`:==表單元素==的樣式。 3. 主題Sass檔案(Thems Sass Files): - `_theme-light.scss`:==淺色主題==的樣式。 - `_theme-dark.scss`:==深色主題==的樣式。 - `_theme-color.scss`:定義==主題相關==的顏色變數。 4. 頁面Sass檔案(Page Sass Files): - `_home.scss`:==首頁==的特定樣式。 - `_about.scss`:==關於頁面==的特定樣式。 - `_contact.scss`:==聯絡頁面==的特定樣式。 5. 專案特定Sass檔案(Project-specific Sass Files): - `_project-specific.scss`:與專案特定元素相關的樣式,例如自定義組件的樣式。 [sass結構化、模組化](https://s103071049.coderbridge.io/2021/07/09/sass-%E7%B5%90%E6%A7%8B%E5%8C%96%E8%88%87%E6%A8%A1%E7%B5%84%E5%8C%96/) [Sass / SCSS 預處理器-OOCSS、SMACSS、BEM模組化方法](https://awdr74100.github.io/2020-06-19-scss-oocss-smacss-bem/) [css設計模式系列-Sass 7-1 pattern篇](https://israynotarray.com/css/20200523/116058774/)