搜尋

CSS 相對顏色 ( Relative Colors )

過去如果要根據現有顏色進行調整,往往需要依賴 CSS 預處理器 ( SASS、LESS ) 或手動管理大量的自訂顏色,但隨著 CSS 技術的發展,目前已經可以開始透過「CSS 相對顏色」( CSS Relative Colors ),以更簡潔、更動態的方式來處理顏色,這篇教學會介紹如何使用 CSS 的相對顏色。

快速導覽:

CSS 教學 - CSS 相對顏色 ( Relative Colors )

教學影片

搭配教學影片一起閱讀,效果會更好!歡迎大家訂閱 STEAM 教育學習網的 Youtube 頻道

前往:https://www.youtube.com/@steam.oxxostudio

認識 CSS 相對顏色

CSS 相對顏色是 CSS Color Module Level 5 的一項核心功能,可以讓使用者從一個現有的「基礎顏色」中,根據簡單的公式或計算產生「新顏色」,核心語法會使用「CSS 的色彩模型函式」,搭配「from」關鍵字,就能根據顏色通道( 例如 RGB 色彩空間的紅、綠、藍和透明度 ),獨立計算出要產生的顏色的獨立變數,基本寫法如下:

div {
  color: 色彩函式(from 來源色 色彩通道1 色彩通道2 色彩通道3 / 透明度);
}

語法中的 from 關鍵字所取得的來源色,會轉換成顏色函式所使用的色彩通道,並以「獨立變數」的形式呈現,各個變數中間使用「空白」分隔,這些變數可以保持原始數值,也可以透過 CSS 的計算函式進行數學運算,例如 calc(),實現對顏色的「相對」調整,下方是一個簡單的範例,透過 rgb() 函式搭配 from 關鍵字與 calc() 計算函式,將紅色裡的「綠色」增加 150,就能算出最後的結果:橘黃色。

<!-- HTML 程式碼 -->
<h1>oxxo</h1>

<!-- CSS 程式碼 -->
<style>
  h1 {
    font-size: 50px;
    color: rgb(from red r calc(g + 150) b); /* 來源 red 紅色,將 g 通道增加 150 */
  }
</style>

CSS 教學 - CSS 相對顏色 ( Relative Colors ) - CSS 相對顏色基本寫法

使用 CSS 相對顏色的好處

由於 CSS 相對顏色可以針對現有顏色進行動態調整,就不用再過去依賴 CSS 預處理器或 JavaScript,下方列出使用 CSS 相對顏色的主要好處:

  • 簡化程式碼與提升可讀性

    減少定義顏色的數量,只需要修改一組顏色,就可以讓所有的顏色跟著變化,尤其適合應用在需要顏色變化的情境 ( 例如 hover、active 或切換亮色暗色系等 ),大幅提升維護效率。

  • 在原有顏色的基礎進行動態調整

    相對顏色使用現有顏色的通道進行調整,所以可以動態改變透明度、亮度、飽和度、色相,甚至可以做到顏色反轉或讓設計師根據配色指南進行配色,產生最佳的顏色效果。

  • 建立彈性主題與調色系統

    能根據主色動態產生整組變化色,方便使用者建立自適應的色彩設計系統,因應主題或模式改變而自動調整。

CSS 相對顏色範例:調整透明度

下方範例會在 :root 中放置一個顏色變數,接著根據這個顏色變數的數值,透過相對顏色修改顏色的透明度 ( alpha 通道數值 ),就能讓所有的文字產生不同的透明度變化,如果要修改所有文字顏色,只需要調整變數數值,所有相關顏色就會改變且不會影響透明度。

線上展示:https://codepen.io/oxxo/pen/bNdgmvB

<!-- HTML 程式碼 -->
<h2 class="a">rgb(from var(--color) r g b / 80%)</h2>
<h2 class="b">rgb(from var(--color) r g b / 60%)</h2>
<h2 class="c">rgb(from var(--color)r g b / 40%)</h2>
<h2 class="d">rgb(from var(--color) r g b / 20%)</h2>

<!-- CSS 程式碼 -->
<style>
  :root {--color: red;}
  h2 {margin: 0;}
  .a {color: rgb(from var(--color) r g b / 80%);}
  .b {color: rgb(from var(--color) r g b / 60%);}
  .c {color: rgb(from var(--color) r g b / 40%);}
  .d {color: rgb(from var(--color) r g b / 20%);}
</style>

CSS 教學 - CSS 相對顏色 ( Relative Colors ) - CSS 相對顏色範例:調整透明度

CSS 相對顏色範例:調整亮度

過去要調整顏色亮度,不外乎都需要先運用繪圖軟體觀察色碼,雖然可以使用 hsl()lch() 等相關色彩函式調整亮度,但只要使用了某種色彩函式定義顏色,如果沒有統一色彩格式,就會造成整份文件色彩格式不一且難以管理,下方範例會在 :root 放置一個變數,接著運用相對顏色搭配 hsl() 函式讓所有的文字產生不同的亮度變化,未來如果要修改所有顏色且不影響亮度,只需要調整變數數值,所有相關顏色就會一起調整。

線上展示:https://codepen.io/oxxo/pen/EajZOvY

<!-- HTML 程式碼 -->
<h2 class="a">hsl(from var(--color) h s calc(l - 20))</h2>
<h2 class="b">hsl(from var(--color) h s l)</h2>
<h2 class="c">hsl(from var(--color) h s calc(l + 20))</h2>
<h2 class="d">hsl(from var(--color) h s calc(l + 40))</h2>

<!-- CSS 程式碼 -->
<style>
  :root {--color: chocolate;}
  h2 {margin: 0;}
  .a {color: hsl(from var(--color) h s calc(l - 20));}
  .b {color: hsl(from var(--color) h s l);}
  .c {color: hsl(from var(--color) h s calc(l + 20));}
  .d {color: hsl(from var(--color) h s calc(l + 40));}
</style>

CSS 教學 - CSS 相對顏色 ( Relative Colors ) - CSS 相對顏色範例:調整亮度

CSS 相對顏色範例:調整飽和度

過去要調整顏色飽和度,通常都需要先運用繪圖軟體降低飽和度後觀察色碼,雖然可以使用 hsl()lch() 等相關色彩函式調整亮度,但針對使用色碼或其他色彩函式的顏色就難以著手調整,下方範例會在 :root 放置一個變數,接著運用相對顏色搭配 hsl() 讓所有的文字產生不同的飽和度變化,未來如果要修改所有顏色且不影響飽和度,只需要調整變數數值,所有相關顏色就會一起調整。

線上展示:https://codepen.io/oxxo/pen/raVjQzg

<!-- HTML 程式碼 -->
<h2 class="a">hsl(from var(--color) h calc(s + 50) l)</h2>
<h2 class="b">hsl(from var(--color) h s l)</h2>
<h2 class="c">hsl(from var(--color) h calc(s - 50) l)</h2>
<h2 class="d">hsl(from var(--color) h calc(s - 100) l)</h2>

<!-- CSS 程式碼 -->
<style>
  :root {--color: chocolate;}
  h2 {margin: 0;}
  .a {color: hsl(from var(--color) h calc(s + 50) l);}
  .b {color: hsl(from var(--color) h s l);}
  .c {color: hsl(from var(--color) h calc(s - 50) l);}
  .d {color: hsl(from var(--color) h calc(s - 100) l);}
</style>

CSS 教學 - CSS 相對顏色 ( Relative Colors ) - CSS 相對顏色範例:調整飽和度

CSS 相對顏色範例:相鄰色、對比色、互補色

透過 CSS 相對顏色,可以很輕鬆地做出兩種顏色的「相鄰色、對比色、互補色」,下方列出在 Hue 色相環中這些顏色的偏移範圍:

名稱 色相偏移範圍 說明
相鄰色 ±30 度以內 色系相近,相對和諧。
對比色 ±120 度 色彩對比強,但不突兀。
互補色 ±180 度 色彩對比最強,對眼睛最刺激。

下方範例會在 :root 放置一個變數,接著運用相對顏色搭配 hsl() 就能產生特定顏色的相鄰色、對比色、互補色,未來如果要修改只需要調整變數數值,所有相關顏色就會一起調整。

線上展示:https://codepen.io/oxxo/pen/KwpaJYZ

<!-- HTML 程式碼 -->
<h2>相鄰色</h2>
<div class="a1">hsl(from var(--c) calc(h + 30) s l)</div>
<div class="a2">hsl(from var(--c) h s l)</div>
<div class="a3">hsl(from var(--c) calc(h - 30) s l)</div>

<h2>對比色</h2>
<div class="b1">hsl(from var(--c) calc(h + 120) s l)</div>
<div class="b2">hsl(from var(--c) h s l)</div>
<div class="b3">hsl(from var(--c) calc(h - 120) s l)</div>

<h2>互補色</h2>
<div class="c1">hsl(from var(--c) h s l)</div>
<div class="c2">hsl(from var(--c) calc(h + 180) s l)</div>

<!-- CSS 程式碼 -->
<style>
  :root{--c: #f98765;}
  h2{margin: 20px 0 5px;}
  div{padding: 10px 0;}
  .a1{background: hsl(from var(--c) calc(h + 30) s l);}
  .a2{background: hsl(from var(--c) h s l);}
  .a3{background: hsl(from var(--c) calc(h - 30) s l);}

  .b1{background: hsl(from var(--c) calc(h + 120) s l);}
  .b2{background: hsl(from var(--c) h s l);}
  .b3{background: hsl(from var(--c) calc(h - 120) s l);}

  .c1{background: hsl(from var(--c) h s l);}
  .c2{background: hsl(from var(--c) calc(h + 180) s l);}
</style>

CSS 教學 - CSS 相對顏色 ( Relative Colors ) - CSS 相對顏色範例:相鄰色、對比色、互補色

將程式稍作修改,加入一些簡單的 JavaScript 和 HTML 的 input 元素,就能實現選擇顏色時,即時預覽相鄰色、對比色和互補色的效果。

線上展示:https://codepen.io/oxxo/pen/JodEVYE

<!-- HTML 程式碼 -->
<input type="color" value="#ff0000" id="c">
<main style="--c: #f98765;">
  <h2>相鄰色</h2>
  <div class="a1">hsl(from var(--c) calc(h + 30) s l)</div>
  <div class="a2">hsl(from var(--c) h s l)</div>
  <div class="a3">hsl(from var(--c) calc(h - 30) s l)</div>

  <h2>對比色</h2>
  <div class="b1">hsl(from var(--c) calc(h + 120) s l)</div>
  <div class="b2">hsl(from var(--c) h s l)</div>
  <div class="b3">hsl(from var(--c) calc(h - 120) s l)</div>

  <h2>互補色</h2>
  <div class="c1">hsl(from var(--c) calc(h + 180) s l)</div>
  <div class="c2">hsl(from var(--c) h s l)</div>
</main>

<!-- CSS 程式碼 -->
<style>
  h2{
    padding: 20px 0 5px;
    margin: 0;
    clear: both;
  }
  div{
    width: 200px;
    height: 100px;
    margin: 0 5px 0 0;
    float: left;
  }
  .a1{background: hsl(from var(--c) calc(h + 30) s l);}
  .a2{background: hsl(from var(--c) h s l);}
  .a3{background: hsl(from var(--c) calc(h - 30) s l);}

  .b1{background: hsl(from var(--c) calc(h + 120) s l);}
  .b2{background: hsl(from var(--c) h s l);}
  .b3{background: hsl(from var(--c) calc(h - 120) s l);}

  .c1{background: hsl(from var(--c) calc(h + 180) s l);}
  .c2{background: hsl(from var(--c) h s l);}
</style>

<script>
  const input = document.getElementById('c');
  const main = document.querySelector('main');

  input.addEventListener('input', () => {
    main.style.setProperty('--c', input.value); // 讀取數值,即時改變 main 裡面 --c 變數數值
  });
</script>

CSS 教學 - CSS 相對顏色 ( Relative Colors ) - CSS 相對顏色動態效果:相鄰色、對比色、互補色

小結

CSS 相對顏色是 CSS 顏色處理領域的一大進步,它賦予開發者在 CSS 中更強大的顏色掌控能力。不僅簡化了許多常見的顏色調整任務,也為動態主題、響應式設計和無障礙網頁提供更好的原生 CSS 解決方案,預計在未來的網頁開發中將扮演重要的角色。

意見回饋

如果有任何建議或問題,可傳送「意見表單」給我,謝謝~

CSS 教學

基本介紹

認識 CSS 開始使用 CSS CSS 語法規則 CSS 命名原則 CSS 常用樣式屬性

CSS 選擇器

認識 CSS 選擇器 優先順序 ( 權重 ) 樣式繼承與聯集 使用巢狀結構語法 元素選擇器 ID 和 Class 選擇器 屬性選擇器 文件結構選擇器 虛擬類別選擇器 ( 結構 ) 虛擬類別選擇器 ( 類型 ) 虛擬類別選擇器 ( 輸入 ) 虛擬類別選擇器 ( 行為 ) 虛擬類別選擇器 ( 超連結 ) 虛擬類別選擇器 ( 邏輯 ) 虛擬類別選擇器 ( 其他 ) 虛擬元素選擇器 群組與組合選擇器

數值與單位

全域關鍵字與文字數值 長度與角度單位 位置名稱與時間單位 特殊樣式屬性 ( all、appearance)

規則與定義

變數 ( Variables ) 媒體查詢 ( @media ) 容器查詢 ( @container ) 自訂屬性值 ( @property ) 匯入樣式 ( @import ) 分層優先順序 ( @layer ) 選擇器作用域 ( @scope ) 定義字型 ( @font-face ) 計數規則 ( @counter-style ) 列印網頁 ( @page )

函式類型

數學計算 文字與清單計數 形狀與線段 路徑 ( path )

顏色與濾鏡

顏色單位 色彩模型 相對顏色 漸層色 影像濾鏡 ( filter ) 背景濾鏡 ( backdrop-filter ) 混合模式 ( mix-blend-mode )

文字與段落

設定字型 ( font-family ) 使用外部字型 文字尺寸 文字樣式 ( 常用 ) 文字樣式 ( 其他實用 ) 文字樣式 ( 特殊用途 ) 文字換行 文字空白與 Tab 大小 文字行高與縮排 文字水平與垂直對齊 文字書寫方向 文字自動分欄 使用 Color Font ( 彩色字型 ) 使用 Icon Font ( 圖示文字 ) 製作自己的 Icon Font 顯示生成內容與引號

元素容器

容器顯示類型 ( display ) 元素 display 對照表 盒子模型 ( Box Model ) 寬高尺寸 內邊距 ( padding ) 外邊界 ( margin ) 邊框 ( border ) 邊框圓角 ( border-radius ) 影像邊框 ( border-image ) 輪廓 ( outline ) 內容溢出與裁切 ( overflow ) 內容範圍 ( contain ) 可見性與透明度 縮放與調整 ( zoom、resize )

背景與陰影

背景 ( 背景色、背景裁切 ) 背景圖 ( 定位、尺寸 ) 背景圖 ( 固定、重複 ) 背景圖 ( 多重背景、混合 ) 背景縮寫 ( background ) 容器陰影 ( box-shadow )

清單與表格

清單樣式 清單計數器 表格基本樣式 表格邊框樣式 表格內容寬度與對齊

基本排版與定位

元素排版方式 浮動 ( float ) 浮動形狀 ( shape-* ) 定位 ( position ) 邏輯屬性 ( logical properties ) 重置 CSS ( Reset CSS ) 水平置中技巧 垂直置中技巧

Flex 彈性排版

Flexbox 彈性盒子 Flex 對齊方式 Flex 彈性伸縮

Grid 網格排版

Grid 網格容器與格線 Grid 網格空間與命名 Grid 網格流向與間距 Grid 排列網格項目 Grid 項目對齊與順序

轉場與動畫

轉場 ( transition ) 轉場觸發事件 動畫 ( animation ) 自訂動畫路徑 ( offset ) 動畫觸發事件 多重動畫的權重與順序 動畫進度控制 ( timeline )

變形、裁切與遮罩

裁切路徑 ( clip-path ) 影像遮罩 ( mask ) 物件填滿方式與定位 轉換函式 ( transform ) 平移、旋轉與縮放 3D 轉換與透視

視窗與使用者行為

捲軸樣式 ( scrollbar ) 拉霸、滑桿樣式 ( slider ) 滑鼠游標圖示 ( cursor ) 滑鼠事件 ( pointer-events ) 使用者選取 ( user-select ) 捲動行為 ( scroll、overscroll ) 列印換頁 ( break-* )

CSS 預處理器

認識 CSS 預處理器 Less ( 安裝、開始使用 ) Less ( 巢狀結構、選擇器 ) Less ( 變數、import ) Less ( Extend、Mixin ) Less ( 邏輯、迴圈、函式 )

範例效果

CSS 圓餅圖 CSS 跑馬燈 Google 載入動畫 電子時鐘數字 漸層色的轉場與動畫 漸層色製作星空背景 漸層色邊框 漸層色製作圖案背景 不規則形狀動畫 彈跳的正方形動畫 3D 正多面體 超連結底線動畫效果 噁心黏黏球效果 CSS 視差滾動效果 捲軸控制放射形選單 捲軸改變文字背景色 CSS 頁面捲動進度條 CSS 水波效果 圓點載入動畫 ( 陰影動畫 ) 字母翻牌效果 探照燈動畫 立體雙色跑馬燈 樓梯文字動態效果 漸層色文字、雙色文字 流動色彩文字 空心文字、文字水波背景 左右傾斜的背景效果 Icon 圖示形狀變換 故障文字效果 按鈕的多種 hover 效果 點擊展開或收折的選單 點擊愛心圖案放射效果 純 CSS 數字載入進度條 純 CSS 碼表 ( 可計時 )