SASS中的迭代

SASS中的迭代

本文將說明如何在SASS中處理迭代。

我們將透過實際程式碼範例,逐步說明如何在SASS中進行迭代。

YouTube Video

SASS中的迭代

SASS中的迭代能幫助避免程式碼重複,並讓你建立靈活且可重複使用的樣式。

在SASS中使用迭代的理由

使用迭代有多項優點,例如:。

  • 能提升程式碼的重用性,便於生成相似樣式的類別。
  • 維護性提高,可讓你更容易一次性修改樣式。
  • 同時也能減少錯誤

例如,你可以一次生成不同顏色按鈕或多種尺寸元件的樣式。

SASS中用於迭代的語法

SASS中主要的迭代語法如下:。

  • 利用@for,你可以針對指定的數字範圍進行迭代。
  • 利用@each,你可以在迭代中遍歷列表或映射(map)。
  • 利用@while,你可以持續循環直到符合特定條件為止。

使用@for的迭代

@for會根據指定的數字範圍進行重複處理。

語法

1/*
2@for $i from <start> to <end> {
3  ...
4}
5
6@for $i from <start> through <end> {
7  ...
8}
9*/
  • 請為<start><end>指定起始及結束值。使用to時,不包含結束值;而through則會包含結束值。

範例

下列程式碼會自動產生邊框寬度每次增加1px的類別。

1@for $i from 1 through 5 {
2  .border-#{$i} {
3    border-width: #{$i}px;
4  }
5}
  • 這段程式碼會自動產生邊框厚度每次遞增1px的類別。這裡使用@for指令來從1到5進行循環。

編譯生成後的CSS

 1.border-1 {
 2  border-width: 1px;
 3}
 4.border-2 {
 5  border-width: 2px;
 6}
 7.border-3 {
 8  border-width: 3px;
 9}
10.border-4 {
11  border-width: 4px;
12}
13.border-5 {
14  border-width: 5px;
15}
  • 會依序生成.border-1.border-5的類別,每個邊框厚度增加1px。

使用@each的迭代

@each可以使用列表或映射進行循環。當你需要高效地生成帶有模式的類別時,它非常實用。

語法

1/*
2@each $item in <list> {
3  ...
4}
5*/

範例1:使用列表

下列程式碼會生成多個文字顏色的類別。

1@each $color in ("red", "blue", "green") {
2  .text-#{$color} {
3    color: #{$color};
4  }
5}
  • 這段程式碼會自動為列表中的每個顏色產生文字顏色類別。這裡利用@each指令來依序處理列表中的每個值。

編譯生成後的CSS

1.text-red {
2  color: red;
3}
4.text-blue {
5  color: blue;
6}
7.text-green {
8  color: green;
9}
  • 當SASS檔案編譯為CSS時,會每個顏色都產生像.text-red.text-blue.text-green等類別。

範例2:使用映射(map)

使用映射可以處理鍵值對(key-value pairs)。下列範例中,按鈕的背景顏色是以映射來定義的。

 1$colors: (
 2  primary: #3498db,
 3  success: #2ecc71,
 4  danger: #e74c3c
 5);
 6
 7@each $name, $hex in $colors {
 8  .bg-#{$name} {
 9    background-color: #{$hex};
10  }
11}

編譯生成後的CSS

1.bg-primary {
2  background-color: #3498db;
3}
4.bg-success {
5  background-color: #2ecc71;
6}
7.bg-danger {
8  background-color: #e74c3c;
9}
  • 當SASS檔案編譯為CSS時,每個映射鍵都會產生例如.bg-primary.bg-success.bg-danger等類別。

使用@while的迭代

@while會在條件成立時持續進行循環。

語法

1/*
2@while <condition> {
3  ...
4}
5*/

範例

例如,你想要逐步增加字體大小時,可以這樣撰寫:。

1$i: 1;
2
3@while $i <= 5 {
4  .font-#{$i} {
5    font-size: #{$i}rem;
6  }
7  $i: $i + 1;
8}
  • 你可以用@while指令來逐步增加字體大小時進行重複操作。透過變數$i,可以自動產生從1到5的類別。

編譯生成後的CSS

 1.font-1 {
 2  font-size: 1rem;
 3}
 4.font-2 {
 5  font-size: 2rem;
 6}
 7.font-3 {
 8  font-size: 3rem;
 9}
10.font-4 {
11  font-size: 4rem;
12}
13.font-5 {
14  font-size: 5rem;
15}
  • 當SASS檔案編譯為CSS時,類別的字體大小會自動從1rem到5rem逐一生成。

進階範例:結合迭代與巢狀(nesting)

將迭代與SASS的巢狀功能結合,可產生更進階的樣式。

範例

如下例所示,同時定義了按鈕的背景顏色與滑鼠懸停時的顏色。

 1@use "sass:color";
 2
 3$colors: (
 4  primary: #3498db,
 5  success: #2ecc71,
 6  danger: #e74c3c
 7);
 8
 9@each $name, $hex in $colors {
10  .btn-#{$name} {
11    background-color: $hex;
12    color: white;
13
14    &:hover {
15      background-color: color.scale($hex, $lightness: -10%);
16    }
17  }
18}
  • 通過結合迭代與SASS巢狀(nesting),你可以一次性生成按鈕的背景顏色和滑鼠懸停(hover)顏色。對於地圖中的每一種顏色,會創建一個 .btn- 類,並且使用巢狀(nesting)定義 :hover 樣式。

編譯生成後的CSS

 1.btn-primary {
 2  background-color: #3498db;
 3  color: white;
 4}
 5.btn-primary:hover {
 6  background-color: #2980b9;
 7}
 8.btn-success {
 9  background-color: #2ecc71;
10  color: white;
11}
12.btn-success:hover {
13  background-color: #27ae60;
14}
15.btn-danger {
16  background-color: #e74c3c;
17  color: white;
18}
19.btn-danger:hover {
20  background-color: #c0392b;
21}
  • 當你將 SASS 檔案轉換為 CSS 時,每個按鈕的背景色和懸停色會自動生成,並且使用巢狀結構統一定義 :hover 樣式。

使用迭代時須注意的重點

為了撰寫更高效與易讀的程式碼,請注意以下幾點。

  1. 避免過度深層的巢狀 過度巢狀會降低可讀性,請盡量只保持必要的深度。

  2. 考慮效能影響 若透過迭代產生過多類別,CSS會變得不必要地龐大。

  3. 使用適當的變數名稱 像是$i$item這類變數,建議以有意義的名稱命名,使程式碼更易理解。

總結

善用SASS中的迭代機制,可以讓樣式設計更有效率且易於維護。特別是根據情境選擇使用@for@each@while,可以生成具備動態性與彈性的CSS。

您可以在我們的 YouTube 頻道上使用 Visual Studio Code 來跟隨上述文章一起學習。 請也查看我們的 YouTube 頻道。

YouTube Video