###### tags: `SCSS`
# SCSS - 字串函式 @each批次新增/ (String Functions)
### Bootstrap [utilities/sizing](https://getbootstrap.com/docs/4.6/utilities/sizing/#relative-to-the-parent) 內建 <kbd>w-25</kbd> <kbd>w-50</kbd> <kbd>w-75</kbd> <kbd>w-100</kbd> 但沒有寫RWD , 要補充這個class , 要去SCSS檔編輯 .
## 一般做法
### 直接在SCSS檔寫,這個問題就是很落落長,有幾個斷點要寫幾個
```
@media (max-width: 576px) {
.w-xs-25 {
width: 25% !important;
}
.w-xs-50 {
width: 50% !important;
}
.w-xs-100 {
width: 100% !important;
}
}
@media (min-width: 576px) {
.w-sm-25 {
width: 25% !important;
}
.w-sm-50 {
width: 50% !important;
}
.w-sm-100 {
width: 100% !important;
}
}
```
## 進階做法 SCSS function
### 1.斷點function
#### 斷點RWD蠻多地方都用的到,最好獨立一個 _breakpoint.scss 檔案 ,匯入引用
```
$media-xs: (max-width:576px);
$media-sm: (min-width:576px);
$media-md: (min-width:768px);
$media-lg: (min-width:992px);
$media-xl: (min-width:1200px);
$media-xxl: (min-width:1400px);
可以寫成
@mixin xs {
@media (max-width: 576px) {
@content
}
}
@mixin sm {
@media (min-width: 576px) {
@content
}
}
@mixin md {
@media (min-width: 768px) {
@content
}
}
@mixin lg {
@media (min-width: 992px) {
@content
}
}
@mixin xl {
@media (min-width: 1200px) {
@content
}
}
@mixin xxl {
@media (min-width: 1400px) {
@content
}
}
```
### 2.@each批次新增
#### 在[Scss 迴圈計算式](https://hackmd.io/0SnRQ0OxT6yHQCMVy1gcvw) 裡面,提到了
```
$end:{number};
@for i from {start} through {end} {...... }
```
不過通常是使用於像mt-1,mt-2,mt-3.....mt-100。但是本次範例w-25,w-50,w-75,w-100如果是用這個做法就會跑出w-1,w-2,w-3......w-99,w-100很不實際。這個時候就需要使用@each批次新增
```
@import "breakpoint";
<!-- 參考前面1.斷點function -->
$size: (25,75,50,100);
@include xs{
@each $width in $size {
.w-xs-#{$width}{
width: $width + '%' !important;
}
}
}
@include sm{
@each $width in $size {
.w-sm-#{$width}{
width: $width + '%' !important;
}
}
}
.
.
.
.
@include xxl{
@each $width in $size {
.w-xxl-#{$width}{
width: $width + '%' !important;
}
}
}
```
使用線上[scss to css](https://jsonformatter.org/scss-to-css)檔案編譯會得到
```
@media (max-width: 576px) {
.w-xs-25 {
width: 25% !important;
}
.w-xs-75 {
width: 75% !important;
}
.w-xs-50 {
width: 50% !important;
}
.w-xs-100 {
width: 100% !important;
}
}
@media (min-width: 576px) {
.w-sm-25 {
width: 25% !important;
}
.w-sm-75 {
width: 75% !important;
}
.w-sm-50 {
width: 50% !important;
}
.w-sm-100 {
width: 100% !important;
}
}
@media (min-width: 1400px) {
.w-xxl-25 {
width: 25% !important;
}
.w-xxl-75 {
width: 75% !important;
}
.w-xxl-50 {
width: 50% !important;
}
.w-xxl-100 {
width: 100% !important;
}
}
```
但實際上使用時( 本文在操作時使用REACT ),編譯出來會是
```
@media (max-width: 576px) {
.w-xs-25 {
width: "25%" !important;
}
.w-xs-75 {
width: "75%" !important;
}
.w-xs-50 {
width: "50%" !important;
}
.w-xs-100 {
width: "100%" !important;
}
}
```
<span style="color:red;font-size:20px">因為<kbd>$width + '%' </kbd>在Javascript是正確用法,但在SCSS裡面不是,正確用法是使用<kbd>String Functions</kbd></span>
### 3.String Functions
```
$size: (25,50,100);
$percenarte: '%';
@include xs{
@each $width in $size {
.w-xs-#{$width}{
width: $width + unquote($percenarte) !important;
}
}
}
.
.
.
@include xxl{
@each $width in $size {
.w-xxl-#{$width}{
width: $width + unquote($percenarte) !important;
}
}
}
```
才會得到我們要的結果,可以無誤運行使用
### 參考資料
[@each](https://sass-lang.com/documentation/at-rules/control/each)
[sass:string](https://sass-lang.com/documentation/modules/string)