---
# System prepended metadata

title: scss 迴圈與內容
tags: [scss]

---

# scss 迴圈與內容

在寫成模組化的mixin之前，可以先寫一個簡單版本的css，再把他變成可以模組化的mixin
![](https://i.imgur.com/FQxdleE.png)
最後要做成像這樣的成果

### 單個禮物盒的基本設定
結構部分，分為禮物盒、水平緞帶、垂直緞帶、盒子上蓋，先用css把效果寫出來，再把需要加入變數的地方提取出來變成模組。
```
.present {
	width: 100px;
	height: 100px;
	background-color: #e03864;
	position: relative;
	box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.5);
	.vribbon, .hribbon {
		background-color: #fff;
		box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.5);
	}
	.vribbon {
		width: 15%;
		height: 100%;
		position: absolute;
		left: 50%;
		top: 0;
		transform: translateX(-50%);
	}
	.hribbon {
		width: 100%;
		height: 15%;
		position: absolute;
		left: 0;
		top: 50%;
		transform: translateY(-50%);
	}
	.cap {
		width: 100%;
		height: 15%;
		background-color: #e03864;
		box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.5);
		position: absolute;
		left: 0;
		top: 0;
	}
}

```


### 將禮物盒作為模組使用mixin加上參數

修改完後會變成下列的模組，把尺寸、禮物盒顏色、緞帶色、旋轉的角度，這樣就可以再呼叫模組時，加入自定義的參數，創造出不同大小、顏色、旋轉角度的禮物盒。
```
    @mixin present($size: 100px,$bodyColor: #e03864,$ribbonColor: #fff,$rotate: 5deg) {
	width: $size;
	height: $size;
	background-color: $bodyColor;
	position: relative;
	box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.5);
	transform: rotate($rotate);
	.vribbon,
	.hribbon {
		background-color: $ribbonColor;
		box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.5);
	}
	.vribbon {
		width: 15%;
		height: 100%;
		position: absolute;
		left: 50%;
		top: 0;
		transform: translateX(-50%);
	}
	.hribbon {
		width: 100%;
		height: 15%;
		position: absolute;
		left: 0;
		top: 50%;
		transform: translateY(-50%);
	}
	.cap {
		width: 100%;
		height: 15%;
		background-color: $bodyColor;
		box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.5);
		position: absolute;
		left: 0;
		top: 0;
	}
}

.present {
	@include present;
}

```
### 在禮物盒mixin加上隨機參數
現在基本的mixin模組已經製作完成，接下來就要看怎麼把這些參數變成隨機的。

1. 首先先產生多個禮物的html結構，提供一個pug emmet語法
```
.present$*20>.cap+.vribbon+.hribbon
```
2. 在這邊`$`代表變數，會產生從1~x的數值，上方的語法則會產生20個禮物盒的html結構
```
.present1
	.cap 
	.vribbon 
	.hribbon 
.present2
	.cap 
	.vribbon 
	.hribbon 
.....
```
3. 在scss的部分，則使用for迴圈從1跑到20，特別注意如果要使變數變成純文字，必須用`#{}`將變數包在裡面
```
@for $i from 1 through 50{
    .present#{$i}{
		@include present;
	}
}
```
4. 最後，要將在迴圈內定義變數，限定變數範圍，**變數有分全域變數或區域變數，若是定義在某個calss內的變數，外面就取不到變數值**，並且利用random來產生隨機數值。   `random(50)`代表會產生一組由0~50的隨機數字

    我們要產生隨機數值得有:尺寸、旋轉角度、禮物盒顏色、緞帶顏色
    
    - 尺寸隨機($size)：random(50) +50   //產生50~100px的尺寸
    - 旋轉角度隨機($rotate)：random(20) -10  //產生-10~10的旋轉角度
    - 禮物盒、緞帶顏色隨機($bodycolor)：必須用到scss陣列與nth製作

    顏色隨機:先定義好每個顏色的變數，再把變數加進scss的陣列(List)內，
    ```
    //利用陣列來記錄幾組常用的顏色
    $colorWhite:#fff;
    $colorPurple:#9d73ba;
    $colorRed:#e03864;
    $colorYellow:#eaa40b;
    $colorGreen:#8cdba4;
    
    //利用陣列來記錄幾組常用的顏色，這邊注意scss的陣列是用()包起來的
    $colors:($colorWhite,$colorPurple,$colorRed,$colorYellow,$colorGreen);
    
    ```
    在使用$colors陣列時，會透過nth(變數, 索引)來取得資料
    ```
    第一個微陣列裡的值，第二個為索引，所以會隨機取得陣列裡的1-5其中一個變數
    $bodyColor: nth($colors,random(5));
    ```
    最後避免禮物盒顏色與緞帶顏色同色，用`@if` 來判斷，如果禮物盒的顏色與緞帶顏色相同，緞帶就重新跑一次random
    ```
    // 利用陣列來記錄幾組常用的顏色
        $colorWhite:#fff;
        $colorPurple:#9d73ba;
        $colorRed:#e03864;
        $colorYellow:#eaa40b;
        $colorGreen:#8cdba4;
        $colors:($colorWhite,$colorPurple,$colorRed,$colorYellow,$colorGreen);
        
   
    @for $i from 1 through 50 {
        //定義區域變數
        $size: random(50) + 50;
        $bodyColor: nth($colors,random(5));
        $ribbonColor: nth($colors,random(5));
        $rotate: random(20) - 10;

        //如果盒子的顏色跟緞帶的顏色一樣，就重新產生緞帶顏色
        @if ($bodyColor == $ribbonColor){
            $ribbonColor: nth($colors,random(5));
        }
        
	
    //使用方式
        .present#{$i}{
            @include present(#{$size}px,$bodyColor,$ribbonColor,#{$rotate}deg);
        }
    }
    ```

    
[codepen範例連結](https://codepen.io/abbyd0208/pen/abBLpXj?editors=1100)

###### tags: `scss`