Sass

1. 變數宣告與使用

$sizes: (
  small: 34px,
  medium: 38px,
  large: 40px,
);

這裡使用了 SCSS 變數來定義一個 map(映射),儲存不同尺寸的高度值。這讓你可以在一個地方統一管理所有尺寸,之後要修改時只需修改這個 map。

2. Map 操作函數

$default-height: map-get($sizes, medium);

map-get() 是 Sass 的內建函數,用來從 map 中取得特定鍵的值。此處它從 $sizes 中取出 medium 的值 (38px)。

3. 巢狀選擇器

:host {
  ::ng-deep {
    // 樣式內容
  }
}

巢狀選擇器是 SCSS 的核心特性,它讓你可以在一個選擇器內部定義另一個選擇器,創建一個階層關係。這裡 ::ng-deep 是 Angular 的穿透選擇器,用於修改被封裝組件內的樣式。

4. @each 迴圈

@each $size, $height in $sizes {
  &.#{$size} ::ng-deep {
    // 樣式內容
  }
}

@each 是 Sass 的迭代指令,用來遍歷集合中的每個項目。這裡它遍歷 $sizes map,將每個鍵值對分別賦給 $size$height 變數。

5. 字串插值

&.#{$size} ::ng-deep {
  // 樣式內容
}

#{$size} 是 Sass 的字串插值語法,將變數值插入到選擇器或屬性名中。這裡它將 $size 的值(如 "small"、"medium"、"large")插入類別名稱中。

6. 父選擇器引用

&.#{$size} ::ng-deep {
  // 樣式內容
}

& 符號代表父選擇器,這是 Sass 的一個強大特性。在這個例子中,& 代表 :host,所以 &.small 會編譯為 :host.small

7. 條件式樣式 (@if)

@if $size == small {
  // 特定的樣式
}

@if 是 Sass 的條件語句,用來根據條件決定是否執行某些代碼。這裡它檢查 $size 是否等於 "small",如果是,則應用特定的樣式調整。

8. CSS 變數使用

color: var(--Neutral-600);

雖然這不是 SCSS 特有的功能,但這裡使用了 CSS 變數(自定義屬性)來管理色彩,這是一種現代前端開發的良好實踐,使得主題化和樣式覆蓋變得更容易。

9. CSS 計算函數

max-width: calc(100% - 6px);

同樣,這不是 SCSS 特有的,但這裡使用了 calc() 函數進行 CSS 值的動態計算,這對於響應式設計非常有用。

這些 SCSS 特性組合在一起,讓你能夠以一種高度維護、可擴展的方式編寫樣式,特別適合用於處理多種變體(如不同尺寸)的組件樣式。

以下是範例

// 1. 變數宣告 - 定義基本顏色與尺寸
$primary-color: #007bff;
$secondary-color: #6c757d;
$error-color: #dc3545;

// 2. Map 映射 - 儲存多個相關值
$theme-colors: (
  primary: $primary-color,
  secondary: $secondary-color,
  error: $error-color,
  success: #28a745,
  warning: #ffc107
);

// 不同尺寸的按鈕高度
$button-sizes: (
  small: 30px,
  medium: 40px,
  large: 50px
);

// 使用 map-get 從 map 中取得特定值
$default-button-height: map-get($button-sizes, medium);

// 設定CSS變數,可以在整個應用中使用
:root {
  --primary: #{map-get($theme-colors, primary)};
  --secondary: #{map-get($theme-colors, secondary)};
  --error: #{map-get($theme-colors, error)};
}

// 主按鈕元件樣式
.button {
  // 基本樣式
  display: inline-block;
  padding: 0 16px;
  border-radius: 4px;
  font-weight: 500;
  text-align: center;
  cursor: pointer;
  transition: all 0.3s ease;
  height: $default-button-height;
  line-height: $default-button-height;
  background-color: map-get($theme-colors, primary);
  color: white;
  border: none;
  
  // 使用 CSS calc() 函數動態計算寬度
  width: calc(100% - 32px);
  max-width: 300px;
  
  // 巢狀選擇器 - 定義按鈕內的圖標樣式
  .icon {
    margin-right: 8px;
    font-size: 16px;
  }
  
  // 父選擇器參考 & - 定義懸停狀態
  &:hover {
    background-color: darken(map-get($theme-colors, primary), 10%);
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
  }
  
  // 使用 @each 迴圈遍歷所有尺寸,創建不同大小的按鈕
  @each $size, $height in $button-sizes {
    // 字串插值 #{$size} 創建對應的類別名
    &.#{$size} {
      height: $height;
      line-height: $height;
      
      // 使用 @if 條件判斷,為不同尺寸設定專屬樣式
      @if $size == small {
        font-size: 12px;
        padding: 0 12px;
      } @else if $size == large {
        font-size: 18px;
        padding: 0 24px;
      }
    }
  }
  
  // 使用 @each 遍歷主題顏色,創建不同顏色的按鈕
  @each $name, $color in $theme-colors {
    &.#{$name} {
      background-color: $color;
      
      &:hover {
        background-color: darken($color, 10%);
      }
      
      // 對特定的主題色添加特別處理
      @if $name == warning {
        color: #333; // 淺色背景需要深色文字
      }
    }
  }
  
  // 禁用狀態
  &.disabled {
    opacity: 0.5;
    cursor: not-allowed;
    pointer-events: none;
  }
}

// 使用 CSS 變數建立的元件
.card {
  border: 1px solid #ddd;
  border-radius: 8px;
  padding: 16px;
  margin-bottom: 16px;
  
  // 使用 CSS 變數
  &.primary {
    border-color: var(--primary);
  }
  
  &.error {
    border-color: var(--error);
  }
}

這是一個簡潔但完整的示例,展示了所有我們討論過的 SCSS 特殊方法。讓我解釋一下這段代碼的關鍵部分:

主要 SCSS 功能展示

  1. 變數宣告:代碼開始定義了基本顏色和尺寸變數,使它們易於維護和重用。

  2. Map 映射:創建了兩個 map 來組織相關的值 - $theme-colors 用於顏色系統,$button-sizes 用於按鈕尺寸。

  3. Map-get 函數:使用 map-get($button-sizes, medium) 從 map 中取出特定值作為預設高度。

  4. 字串插值:在 :root 中設定 CSS 變數時使用 #{map-get($theme-colors, primary)} 來插入變數值。

  5. 巢狀選擇器.button 內部定義了 .icon 的樣式,這是 SCSS 最基本的嵌套特性。

  6. 父選擇器引用:使用 &:hover 簡潔地定義按鈕懸停狀態。

  7. @each 迴圈:代碼使用兩個 @each 迴圈 - 一個遍歷尺寸,一個遍歷顏色主題,為每種變體生成對應的樣式。

  8. @if 條件判斷:在 @each 迴圈內部使用 @if 來為特殊情況(如小按鈕或警告顏色按鈕)添加專屬樣式。

  9. CSS 變數:定義並使用 CSS 變數(如 var(--primary))來實現全域主題色管理。

  10. Calc() 函數:使用 width: calc(100% - 32px) 動態計算按鈕寬度。

這個例子展示了如何將多種 SCSS 功能結合起來,創建一個靈活、可維護的樣式系統。你可以根據這個基礎擴展更多功能,或者調整現有的樣式變量來快速改變整個系統的外觀。

Last updated