建立色彩配置

如何建立動態且可設定的色彩配置,相關基礎概況

在這篇文章中,我想分享管理多種色彩配置的方法。 。試用示範模式

示範

如果你偏好觀看影片,請參閱這篇文章的 YouTube 版本:

總覽

我們會利用自訂屬性和 calc() 建構無障礙顏色系統, 根據使用者偏好設定調整網頁,同時保有編寫程式碼 也能享有極簡的使用體驗我們從基本品牌顏色開始,並根據該顏色建立變化版本系統:2 種文字顏色、4 種表面顏色和相符的陰影。

本指南一開始會先定義每個色彩配置的所有色彩 正面。直到最後才用來變更頁面。

品牌

品牌顏色通常已確立品牌名稱 十六進位rgb。這項 GUI 挑戰 基本品牌顏色為 #0af。首先,針對此色彩系統,十六進位值 需要轉換成 hsl

* {
  --brand: #0af;
  --brand: hsl(200 100% 50%);
}

為了實現讓品牌顏色變深或變淡 20% 的概念,hsl 顏色值的 3 個管道需要擷取至各自的自訂屬性,如下所示:

* {
  --brand-hue: 200;
  --brand-saturation: 100%;
  --brand-lightness: 50%;
}

CSS 可針對這些顏色屬性執行數學運算,例如使用 calc(var(--brand-lightness) - 20%) 將亮度值降低 20%。這些內容是打造 而且 CSS 可藉由調整 高度飽和度和亮度。

淺色主題

每個顏色變化版本都會標示相符的配色方案,在本例中,每個版本都會加上 -light

淺色主題最終結果預覽

品牌

從品牌顏色開始,經過包裝 --brand-hue--brand-saturation 和 hsl () 函式括號內的 --brand-lightness 自訂屬性, :

* {
  --brand-light: hsl(var(--brand-hue) var(--brand-saturation) var(--brand-lightness));
}

文字顏色

接下來,色彩配置的基本要到文字顏色。在淺色主題中,文字 都應該是非常暗的請注意,下列顏色的亮度都很低,遠低於 50%。

* {
  --text1-light: hsl(var(--brand-hue) var(--brand-saturation) 10%);
  --text2-light: hsl(var(--brand-hue) 30% 30%);
}

--text1-light,因為在亮度 10% 時非常昏暗,因此較大 100% ,這樣品牌顏色仍能過濾出深色海軍。

--text2-light,顏色不如第 1 種顏色,但可以說是 就會變得較不飽和。

表面顏色

表面顏色是指文字位於其上或內部的背景、邊框和其他裝飾性表面。在淺色主題中,這些是淺色主題, 而不是顏色較深的文字顏色如何使用 Hsl 建立淺色色相 我們會用在第三個亮度值中 使用較高的百分比值我們也會降低飽和度,讓淺灰色看起來不會太偏色。

* {
  --surface1-light: hsl(var(--brand-hue) 25% 90%);
  --surface2-light: hsl(var(--brand-hue) 20% 99%);
  --surface3-light: hsl(var(--brand-hue) 20% 92%);
  --surface4-light: hsl(var(--brand-hue) 20% 85%);
}

4 種表面顏色,因為裝飾性顏色往往需要較多的 變化版本,用於互動時刻 (例如 :focus:hover),或是建立 外觀在這些情況下,最好將滑鼠游標停留在 --surface2-light 上,然後轉換為 --surface3-light,這樣一來,滑鼠游標停留在圖示上時,就會提高對比度 (亮度從 99% 提高到 92%,使圖示變暗)。

陰影

色彩配置中的陰影不如預期,而是增添臨場感, 幫助相片從不寫實的黑色陰影中脫穎而出待辦 陰影顏色會使用色調自訂屬性 飽和了,但依然非常暗。基本上就是 還有點藍色的陰影

* {
  --surface-shadow-light: var(--brand-hue) 10% 20%;
  --shadow-strength-light: .02;
}

--surface-shadow-light 未納入 hsl 函式中。這是因為 合併 --shadow-strength 值以產生部分不透明度,並調整 CSS 需求 以便執行計算跳至雷射陰影 一節

所有淺色調

再也不必到處苦苦搜尋,就能找到燈光顏色的產生方式 並集中在 CSS 中

* {
  --brand-light: hsl(var(--brand-hue) var(--brand-saturation) var(--brand-lightness));
  --text1-light: hsl(var(--brand-hue) var(--brand-saturation) 10%);
  --text2-light: hsl(var(--brand-hue) 30% 30%);
  --surface1-light: hsl(var(--brand-hue) 25% 90%);
  --surface2-light: hsl(var(--brand-hue) 20% 99%);
  --surface3-light: hsl(var(--brand-hue) 20% 92%);
  --surface4-light: hsl(var(--brand-hue) 20% 85%);
  --surface-shadow-light: var(--brand-hue) 10% calc(var(--brand-lightness) / 5);
  --shadow-strength-light: .02;
}
淺色系顏色螢幕截圖
CodePen 上的沙箱

深色主題

大多數品牌一開始都不採用深色主題,是自家主要的 通常是較輕、主題另一方面,使用者通常會在不同情境 (例如夜間) 選擇深色主題。基於這些因素,我會在使用深色主題時留意兩件事:

  1. 使用者通常會在黑暗環境下使用這個主題,因此請在黑暗環境下進行測試。
  2. 顏色應去飽和,以免因過於濃烈而產生螢幕抖動。

深色主題的最終結果預覽畫面

品牌

淺色主題使用 3 個品牌 hsl 色彩管道值,但未更動。 深色主題則無飽和度會減半,亮度也下降 相對 50%

* {
  --brand-dark: hsl(
    var(--brand-hue)
    calc(var(--brand-saturation) / 2)
    calc(var(--brand-lightness) / 1.5)
  );
}

文字顏色

在深色主題中,文字顏色應為淺色。下列顏色的顏色很高 ,請把該值放在靠近白色的地方。

* {
  --text1-dark: hsl(var(--brand-hue) 15% 85%);
  --text2-dark: hsl(var(--brand-hue) 5% 65%);
}

表面顏色

在深色主題中,途徑顏色應為深色。下列顏色有 第一個表面的亮度和飽和度較低,第一個表面為暗度 10%。

* {
  --surface1-dark: hsl(var(--brand-hue) 10% 10%);
  --surface2-dark: hsl(var(--brand-hue) 10% 15%);
  --surface3-dark: hsl(var(--brand-hue) 5%  20%);
  --surface4-dark: hsl(var(--brand-hue) 5% 25%);
}

陰影

在深色主題中,陰影非常難以察覺。這很合理,因為要讓已經相當暗的內容變得更暗,難度相當高。此時 --shadow-strength-dark 這個功能超方便,讓我們能將 以消除陰影。

* {
  --surface-shadow-dark: var(--brand-hue) 50% 3%;
  --shadow-strength-dark: .8;
}

此外,也要看看該陰影的飽和度。你聽得到什麼顏色嗎 希望你能在查看介面時 看見一些重要變更?請嘗試移除 您偏好哪種工具?!

深色模式

* {
  --brand-dark: hsl(var(--brand-hue) calc(var(--brand-saturation) / 2) calc(var(--brand-lightness) / 1.5));
  --text1-dark: hsl(var(--brand-hue) 15% 85%);
  --text2-dark: hsl(var(--brand-hue) 5% 65%);
  --surface1-dark: hsl(var(--brand-hue) 10% 10%);
  --surface2-dark: hsl(var(--brand-hue) 10% 15%);
  --surface3-dark: hsl(var(--brand-hue) 5%  20%);
  --surface4-dark: hsl(var(--brand-hue) 5% 25%);
  --surface-shadow-dark: var(--brand-hue) 50% 3%;
  --shadow-strength-dark: .8;
}
深色顏色螢幕截圖
CodePen 上的沙箱

昏暗主題

這個色彩配置主要用於調配亮度和飽和度。有 必須有足夠的飽和度、顯示色調,但也應該顯示 這個方法幾乎不會傳回對比分數 模型往往會變暗或低對比

預覽昏暗主題的最終結果

品牌

* {
  --brand-dim: hsl(
    var(--brand-hue)
    calc(var(--brand-saturation) / 1.25)
    calc(var(--brand-lightness) / 1.25)
  );
}

文字顏色

* {
  --text1-dim: hsl(var(--brand-hue) 15% 75%);
  --text2-dim: hsl(var(--brand-hue) 10% 61%);
}

表面顏色

* {
  --surface1-dim: hsl(var(--brand-hue) 10% 20%);
  --surface2-dim: hsl(var(--brand-hue) 10% 25%);
  --surface3-dim: hsl(var(--brand-hue) 5%  30%);
  --surface4-dim: hsl(var(--brand-hue) 5% 35%);
}

陰影

* {
  --surface-shadow-dim: var(--brand-hue) 30% 13%;
  --shadow-strength-dim: .2;
}

調暗顏色

* {
  --brand-dim: hsl(var(--brand-hue) calc(var(--brand-saturation) / 1.25) calc(var(--brand-lightness) / 1.25));
  --text1-dim: hsl(var(--brand-hue) 15% 75%);
  --text2-dim: hsl(var(--brand-hue) 10% 61%);
  --surface1-dim: hsl(var(--brand-hue) 10% 20%);
  --surface2-dim: hsl(var(--brand-hue) 10% 25%);
  --surface3-dim: hsl(var(--brand-hue) 5%  30%);
  --surface4-dim: hsl(var(--brand-hue) 5% 35%);
  --surface-shadow-dim: var(--brand-hue) 30% 13%;
  --shadow-strength-dim: .2;
}
調暗顏色的螢幕擷取畫面
CodePen 上的沙箱

無障礙色彩

請注意,深色文字顏色最低的亮度為 65% 深色表面的高亮度為 25%也就是說,兩者之間的亮度呼吸空間為 40%。在淺色主題中,有 55% 的呼吸室 套用淺色主題維持文字和表面顏色之間的亮度差異 將近 40% 到 50% 有助於維持高色彩對比度,同時提升 萬一發現分數不佳,可以調整一點小技巧。

我稱之為「bump bump til ya pass」,也就是將亮度值 bump 到工具顯示我正在通過的程度。

按下 Shift + 向下鍵,降低亮度並提高對比度,直到通過測試為止

本挑戰建立的每個主題都通過對比分數。調暗色彩配置的對比度最低,但仍符合最低需求。為協助團隊其他成員使用優良的對比色,建議您建立類別名稱,將表面顏色搭配無障礙文字顏色搭配。

.surface1 {
  background-color: var(--surface1);
  color: var(--text2);
}

.surface2 {
  background-color: var(--surface2);
  color: var(--text2);
}

.surface3 {
  background-color: var(--surface3);
  color: var(--text1);
}

.surface4 {
  background-color: var(--surface4);
  color: var(--text1);
}
昏暗表面和文字配對的螢幕截圖
使用 VisBug 擷取的昏暗介面和文字配對螢幕截圖

Rad Shadow

主題會使用名為 .rad-shadow 的公用程式類別。已產生這個陰影 這項 Smooth Shadow 工具 。我擷取系統產生的程式碼片段,並加上自己自訂的顏色, 計算透明度這是為了建立陰影,讓我可以在每個色彩配置中調整陰影。

並排的各陰影

為達成這個目標,我為每個需要調整的色彩配置建立 2 個變數, 陰影顏色和陰影強度。顏色適用於飽和度和黑暗度 而肌力可以輕鬆放大陰影 顏色配置的強度。最終結果如下所示。

:root {
  --surface-shadow-light: var(--brand-hue) 10% 20%;
  --shadow-strength-light: .02;
}

.rad-shadow {
  box-shadow:
    0 2.8px 2.2px hsl(var(--surface-shadow) / calc(var(--shadow-strength) + .03)),
    0 6.7px 5.3px hsl(var(--surface-shadow) / calc(var(--shadow-strength) + .01)),
    0 12.5px 10px hsl(var(--surface-shadow) / calc(var(--shadow-strength) + .02)),
    0 22.3px 17.9px hsl(var(--surface-shadow) / calc(var(--shadow-strength) + .02)),
    0 41.8px 33.4px hsl(var(--surface-shadow) / calc(var(--shadow-strength) + .03)),
    0 100px 80px hsl(var(--surface-shadow) / var(--shadow-strength))
  ;
}

如果我進一步運用色彩配置的陰影,我想讓陰影 會調整設計符記常數,因為光度方向應該相同 降幅。

使用色彩配置

預先定義色彩後,該將顏色轉換成 各配置通用屬性。簡單來說,CSS 表示此色彩配置專案中的作者,極少需要存取 特定色彩配置的值。我希望使用者能輕鬆遵循主題。

為達成這個目的,您應只透過通用自訂屬性使用色彩配置,我們稍後會定義這些屬性。如此一來,使用設計變數的使用者就不需要擔心目前設定的是哪種色彩配置,只需使用表面和文字顏色即可。請改用 color: var(--text1) 取代 color: var(--text1-light)。所有調整和樞紐分析 在 CSS 中,顏色的比例較高

在下列程式碼區塊中深入探討淺色主題的連接樣式 即採用淺色主題專屬顏色的一般自訂屬性。如今,所有 var(--brand) 的用途都會使用淺色品牌顏色。

淺色主題 (自動)

:root {
  color-scheme: light;
  --brand: var(--brand-light);
  --text1: var(--text1-light);
  --text2: var(--text2-light);
  --surface1: var(--surface1-light);
  --surface2: var(--surface2-light);
  --surface3: var(--surface3-light);
  --surface4: var(--surface4-light);
  --surface-shadow: var(--surface-shadow-light);
  --shadow-strength: var(--shadow-strength-light);
}

網站現在使用淺色主題。這是非常有趣的成功時刻!我們在其他色彩配置情境中使用預先定義的顏色,讓我們再來幾個這樣的情境。

深色主題 (自動)

@media (prefers-color-scheme: dark) {
  :root {
    color-scheme: dark;

    --brand: var(--brand-dark);
    --text1: var(--text1-dark);
    --text2: var(--text2-dark);
    --surface1: var(--surface1-dark);
    --surface2: var(--surface2-dark);
    --surface3: var(--surface3-dark);
    --surface4: var(--surface4-dark);
    --surface-shadow: var(--surface-shadow-dark);
    --shadow-strength: var(--shadow-strength-dark);
  }
}

淺色主題

[color-scheme="light"] {
  color-scheme: light;

  --brand: var(--brand-light);
  --text1: var(--text1-light);
  --text2: var(--text2-light);
  --surface1: var(--surface1-light);
  --surface2: var(--surface2-light);
  --surface3: var(--surface3-light);
  --surface4: var(--surface4-light);
  --surface-shadow: var(--surface-shadow-light);
  --shadow-strength: var(--shadow-strength-light);
}

深色主題

[color-scheme="dark"] {
  color-scheme: dark;

  --brand: var(--brand-dark);
  --text1: var(--text1-dark);
  --text2: var(--text2-dark);
  --surface1: var(--surface1-dark);
  --surface2: var(--surface2-dark);
  --surface3: var(--surface3-dark);
  --surface4: var(--surface4-dark);
  --surface-shadow: var(--surface-shadow-dark);
  --shadow-strength: var(--shadow-strength-dark);
}

調暗主題

[color-scheme="dim"] {
  color-scheme: dark;

  --brand: var(--brand-dim);
  --text1: var(--text1-dim);
  --text2: var(--text2-dim);
  --surface1: var(--surface1-dim);
  --surface2: var(--surface2-dim);
  --surface3: var(--surface3-dim);
  --surface4: var(--surface4-dim);
  --surface-shadow: var(--surface-shadow-dim);
  --shadow-strength: var(--shadow-strength-dim);
}

此時,作者可以視需要自由使用提供的色彩配置泛型,且不必再擔心主題。

結論

現在你知道該怎麼做了,你會怎麼做?!🙂

讓我們多方嘗試,瞭解在網路上建構應用程式的所有方式。建立 Codepen 或自行發布示範內容,然後透過推文傳送給我,我會將其新增至下方的社群重混內容部分。

來源

社群重混版本 - @chris-kruiningno-preferencemoreless 新增了色相滑桿、狀態顏色和對比模式:示範