跳到主要內容
前端開發

用 SCSS 的 Map 建立一份共用色票

整理用 SCSS 的 map 定義一份基礎色票,搭配 @each 批次產生 bg-/text-/border- 開頭的顏色工具類別,再用 map-get 讓區塊樣式(footer、社群圖示)引用同一份色票命名的做法,並附上顏色命名工具的參考連結。

W

顏色散落在樣式表各處直接寫死色碼(#FECC00),改配色時要一個個找出來改,還很容易漏掉。這篇整理當時用 SCSS 的 map 建立一份共用色票的做法。

定義基礎色票

// 共用 color
// example: bg-color | text-color | border-color
$colorGroup: (
  'supernova': #FECC00,
  'fiord': #4C596C,
  'black': #000,
  'alto': #DBDBDB,
  'dustyGray': #999,
  'gray': #7F7F7F,
);

顏色的命名不是憑感覺亂取,而是先把色碼貼到 name that color 這類工具查出對應的顏色名稱,統一用查出來的名稱當 key,之後不管是自己還是接手的人,看到 fiord 都知道對應的是哪個藍灰色,不用每次都去猜色碼。

用 @each 批次產生工具類別

// example: bg-color | text-color | border-color
@each $name, $color in $colorGroup {
  .bg-#{$name} {
    background: $color;
  }
  .text-#{$name} {
    color: $color !important;
  }
  .border-#{$name} {
    border: 1px solid $color;
  }
}

六個顏色,一次產生十八個工具類別(bg-supernovatext-supernovaborder-supernova……),之後要用某個顏色當背景、文字或邊框,直接在 HTML 上疊 class,不用再手寫一次色碼。

區塊各自的顏色需求:另建一份 map,引用同一份色票

不同區塊要用到的顏色不會剛好都落在基礎色票的命名裡,這時候另外建一份「語意化」的 map,用 map-get() 去引用基礎色票裡的顏色:

// footer 選單字體與背景顏色
$footerGroup: (
  'menu-title-color': map-get($colorGroup, 'nobel'),
  'menu-normal-color': map-get($colorGroup, 'doveGray'),
  'menu-hover-color': map-get($colorGroup, 'treePoppy'),
  'bottom-bg-color': map-get($colorGroup, 'shark'),
  'privacy-text-color': map-get($colorGroup, 'doveGray'),
  'border-color': map-get($colorGroup, 'alto'),
  'footer-bg': white,
);

社群圖示這類需要品牌色的區塊,也能混用漸層值:

// socialIcon
$socialGroup: (
  'users': #2ab1f3,
  'fb': #3b5998,
  'twitter': #1DA1F2,
  'ig': linear-gradient(45deg, #f09433 0%, #e6683c 25%, #dc2743 50%, #cc2366 75%, #bc1888 100%),
  'telegram': #0088cc,
  'youtube': #cd201f,
);

調用方式

footer {
  @include z-index(footer);

  .footer-area {
    letter-spacing: 1px;
    background: map-get($footerGroup, 'footer-bg');
    @include relative();

    .footer-box {
      // ...
    }
  }

  .footer-privacy {
    // ...
  }
}

map-get($footerGroup, 'footer-bg') 一路往下追,最終取到的還是 $colorGroup 裡定義的那個色碼——改配色時只要動 $colorGroup 這一份,所有引用到它的地方全部跟著換。

現在還用得到嗎

用一份共用來源管理顏色的思路完全沒過時,這正是現在「設計代幣」(design tokens)概念在做的事。真正被取代的是實作方式:SCSS 的 map 只在編譯時期存在,瀏覽器執行時完全看不到這些變數,深色模式這類需要執行期動態換色的需求,SCSS map 處理不了(只能編譯出兩份完全獨立的 CSS,切換時整份替換)。現在的做法多半改用 CSS 自訂屬性(CSS Custom Properties),整理在《CSS 自訂屬性與設計代幣:取代 SCSS 的顏色 map》。

參考資料

分享這篇