# 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`