---
# System prepended metadata

title: Sass
tags: [Sass]

---

# 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/)