oklch()

Baseline 2023
新推出

自 ⁨2023 年 5 月⁩起,此功能可在最新的裝置和瀏覽器版本上使用。此功能可能無法在舊版裝置或瀏覽器上使用。

oklch() 函式式表示法用於在 Oklab 顏色空間中表示指定顏色。oklch()oklab() 的圓柱形式,使用相同的 L 軸,但帶有極座標形式的色度(C)和色相(h)座標。

語法

css
/* Absolute values */
oklch(40.1% 0.123 21.57)
oklch(59.69% 0.156 49.77)
oklch(59.69% 0.156 49.77 / .5)

/* Relative values */
oklch(from green l c h / 0.5)
oklch(from #123456 calc(l + 0.1) c h)
oklch(from hsl(180 100% 50%) calc(l - 0.1) c h)
oklch(from var(--color) l c h / calc(alpha - 0.1))

下面描述了絕對顏色和相對顏色的允許值。

注意:通常在 CSS 中,當百分比值有等效的數值時,100% 等於數字 1。但對於 oklch() 的所有分量值來說,情況並非如此。在這裡,對於 C 值,100% 等於 0.4

絕對值語法

oklch(L C H[ / A])

引數如下:

L

一個介於 01 之間的 <number>,一個介於 0%100% 之間的 <percentage>,或關鍵字 none(在此情況下等同於 0%)。在這裡,數字 0 對應 0%(黑色),數字 1 對應 100%(白色)。該值指定了顏色的感知亮度,即“明亮度”。

注意:oklch() 中的 L 是感知亮度,指的是我們眼睛視覺上感知的“明亮度”。這與 hsl() 中的 L 不同,後者表示的是與其他顏色相比較的亮度。

C

一個 <number>、一個 <percentage>,或關鍵字 none(在此情況下等同於 0%)。該值衡量顏色的色度(大致表示“顏色的量”)。其最小有效值為 0,而最大值理論上是無限的(但實際上不超過 0.5)。在這裡,0%0100% 是數字 0.4

H

一個 <number>、一個 <angle> 或關鍵字 none(在此情況下等同於 0deg),表示顏色的<hue>(色相)角度。

注意:在 sRGB(被 hsl()hwb() 使用)、CIELAB(被 lch() 使用)和 Oklab(被 oklch() 使用)顏色空間中,特定色相對應的角度是不同的。請參閱下面的oklch() 中的色相示例以及 <hue> 參考頁面以獲取更多詳細資訊和示例。

A 可選

一個 <alpha-value>,表示顏色的 alpha 通道值,其中數字 0 對應 0%(完全透明),1 對應 100%(完全不透明)。此外,關鍵字 none 可用於明確指定無 alpha 通道。如果未明確指定 A 通道值,則預設為 100%。如果包含該值,則其前面需要有一個斜槓(/)。

備註:有關 none 的效果,請參閱缺失的顏色分量

相對值語法

oklch(from <color> L C H[ / A])

引數如下:

from <color>

當定義相對顏色時,總是包含關鍵字 from,其後跟著一個表示源顏色<color> 值:這是相對顏色所基於的原始顏色。源顏色可以是任何有效的 <color> 語法,包括另一個相對顏色。

L

一個介於 01 之間的 <number>,一個介於 0%100% 之間的 <percentage>,或關鍵字 none(在此情況下等同於 0%)。這表示輸出顏色的亮度值。在這裡,數字 0 對應 0%(黑色),數字 1 對應 100%(白色)。

C

一個 <number>、一個 <percentage>,或關鍵字 none(在此情況下等同於 0%)。該值表示輸出顏色的色度值(大致表示“顏色的量”)。其最小有效值為 0,而最大值理論上是無限的(但實際上不超過 0.5)。在這裡,0%0100% 是數字 0.4

H

一個 <number>、一個 <angle>,或關鍵字 none(在此情況下等同於 0deg),表示輸出顏色的 <hue> 角度。請參閱下面示例章節中的不同色相的樣本

A 可選

一個 <alpha-value>,表示輸出顏色的 alpha 通道值,其中數字 0 對應 0%(完全透明),1 對應 100%(完全不透明)。此外,關鍵字 none 可用於明確指定無 alpha 通道。如果未明確指定 A 通道值,則預設為源顏色的 alpha 通道值。如果包含該值,則其前面需要有一個斜槓(/)。

定義相對顏色輸出通道分量

當在 oklch() 函式中使用相對顏色語法時,瀏覽器會將源顏色轉換為等效的 OkLCh 顏色(如果尚未指定)。該顏色被定義為三個不同的顏色通道值——l(亮度)、c(色度)和 h(色相),外加一個 alpha 通道值(alpha)。這些通道值在函式內部可用,用於定義輸出顏色的通道值。

  • l 通道值解析為一個介於 01(含)之間的 <number>
  • c 通道值解析為一個介於 00.4(含)之間的 <number>
  • h 通道值解析為一個介於 0360(含)之間的 <number>
  • alpha 通道值解析為一個介於 01(含)之間的 <number>

在定義相對顏色時,輸出顏色的不同通道可以用幾種不同的方式表示。下面,我們將透過一些示例來說明這些方式。

在下面的前兩個示例中,我們使用了相對顏色語法。然而,第一個示例輸出與源顏色相同的顏色,而第二個示例輸出的顏色則完全不基於源顏色。它們並沒有真正建立相對顏色!你不太可能在實際程式碼庫中使用這些,而可能會直接使用絕對顏色值。我們包含這些示例是為了讓你開始學習相對 oklch() 語法。

讓我們從一個源顏色 hsl(0 100% 50%)(相當於 red)開始。下面的函式輸出與源顏色相同的顏色——它使用源顏色的 lch 通道值(0.6279660.25770429.2346)作為輸出通道值。

css
oklch(from hsl(0 100% 50%) l c h)

此函式的輸出顏色是 oklch(0.627966 0.257704 29.2346)

下一個函式對輸出顏色的通道值使用絕對值,輸出了一個完全不同於源顏色的新顏色:

css
oklch(from hsl(0 100% 50%) 42.1% 0.25 328.363)

在上述情況中,輸出顏色是 oklch(0.421 0.25 328.363)

以下函式建立了一個基於源顏色的相對顏色:

css
oklch(from hsl(0 100% 50%) 0.8 0.4 h)

此示例:

  • hsl() 源顏色轉換為等效的 oklch() 顏色——oklch(0.627966 0.257704 29.2346)
  • 將輸出顏色的 h 通道值設定為源 oklch() 等效顏色的 h 通道值——29.2346
  • 將輸出顏色的 lc 通道值設定為不基於源顏色的新值:分別為 0.80.4

最終的輸出顏色是 oklch(0.8 0.4 29.2346)

備註:如上所述,如果輸出顏色使用的顏色模型與源顏色不同,源顏色會在後臺被轉換為與輸出顏色相同的模型,以便能夠以相容的方式表示(即使用相同的通道)。

在本節我們目前看到的示例中,源顏色和輸出顏色的 alpha 通道都沒有被明確指定。當未指定輸出顏色的 alpha 通道時,它預設為與源顏色 alpha 通道相同的值。當未指定源顏色的 alpha 通道時(且它不是相對顏色),它預設為 1。因此,上述示例中的源和輸出 alpha 通道值均為 1

讓我們看一些指定源和輸出 alpha 通道值的示例。第一個示例將輸出 alpha 通道值指定為與源 alpha 通道值相同,而第二個示例則指定一個與源 alpha 通道值無關的不同輸出 alpha 通道值。

css
oklch(from hsl(0 100% 50% / 0.8) l c h / alpha)
/* Computed output color: oklch(0.627966 0.257704 29.2346 / 0.8) */

oklch(from hsl(0 100% 50% / 0.8) l c h / 0.5)
/* Computed output color: oklch(0.627966 0.257704 29.2346 / 0.5) */

在下面的示例中,hsl() 源顏色再次被轉換為 oklch() 的等效顏色——oklch(0.627966 0.257704 29.2346)。對 lchalpha 值應用 calc() 計算,最終得到的輸出顏色為 oklch(0.827966 0.357704 9.23462 / 0.9)

css
oklch(from hsl(0 100% 50%) calc(l + 0.2) calc(c + 0.1) calc(h - 20) / calc(alpha - 0.1))

備註:因為源顏色通道值被解析為 <number> 值,所以在使用它們進行計算時,你必須給它們加上數字,即使在通道通常接受 <percentage><angle> 或其他值型別的情況下也是如此。例如,將 <percentage> 新增到 <number> 是行不通的。

正式語法

<oklch()> = 
oklch( [ from <color> ]? [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ <hue> | none ] [ / [ <alpha-value> | none ] ]? )

<hue> =
<number> |
<angle>

<alpha-value> =
<number> |
<percentage>

示例

調整顏色的亮度

此示例展示了改變 oklch() 函式式表示法中 L(亮度)值的效果。

HTML

html
<div data-color="blue-dark"></div>
<div data-color="blue"></div>
<div data-color="blue-light"></div>

<div data-color="red-dark"></div>
<div data-color="red"></div>
<div data-color="red-light"></div>

<div data-color="green-dark"></div>
<div data-color="green"></div>
<div data-color="green-light"></div>

CSS

css
[data-color="blue-dark"] {
  background-color: oklch(10% 0.4 240);
}
[data-color="blue"] {
  background-color: oklch(50% 0.4 240);
}
[data-color="blue-light"] {
  background-color: oklch(90% 0.4 240);
}

[data-color="red-dark"] {
  background-color: oklch(10% 0.4 20);
}
[data-color="red"] {
  background-color: oklch(50% 0.4 20);
}
[data-color="red-light"] {
  background-color: oklch(90% 0.4 20);
}

[data-color="green-dark"] {
  background-color: oklch(10% 0.4 130);
}
[data-color="green"] {
  background-color: oklch(50% 0.4 130);
}
[data-color="green-light"] {
  background-color: oklch(90% 0.4 130);
}

結果

透過色度調整顏色強度

下面的示例展示了改變 oklch() 函式式表示法中 C(色度)值的效果,隨著 C 值從完全飽和下降到接近灰色,顏色的強度也隨之降低。

HTML

html
<div data-color="blue"></div>
<div data-color="blue-chroma1"></div>
<div data-color="blue-chroma2"></div>
<div data-color="blue-chroma3"></div>

<div data-color="red"></div>
<div data-color="red-chroma1"></div>
<div data-color="red-chroma2"></div>
<div data-color="red-chroma3"></div>

<div data-color="green"></div>
<div data-color="green-chroma1"></div>
<div data-color="green-chroma2"></div>
<div data-color="green-chroma3"></div>

CSS

以藍色、紅色和綠色為初始顏色,我們為它們聲明瞭逐漸減小的色度值:從高值 0.4(相當於 100%)的完全飽和度開始,一直到 0.01(相當於 2%),這使得所有顏色都接近灰色。

css
[data-color="blue"] {
  background-color: oklch(50% 0.4 240);
}
[data-color="blue-chroma1"] {
  background-color: oklch(50% 0.2 240);
}
[data-color="blue-chroma2"] {
  background-color: oklch(50% 0.1 240);
}
[data-color="blue-chroma3"] {
  background-color: oklch(50% 0.01 240);
}

[data-color="red"] {
  background-color: oklch(50% 100% 20deg);
}
[data-color="red-chroma1"] {
  background-color: oklch(50% 50% 20deg);
}
[data-color="red-chroma2"] {
  background-color: oklch(50% 25% 20deg);
}
[data-color="red-chroma3"] {
  background-color: oklch(50% 2% 20deg);
}

[data-color="green"] {
  background-color: oklch(50% 0.4 130);
}
[data-color="green-chroma1"] {
  background-color: oklch(50% 0.2 130);
}
[data-color="green-chroma2"] {
  background-color: oklch(50% 0.1 130);
}
[data-color="green-chroma3"] {
  background-color: oklch(50% 0.01 130);
}

結果

如果我們使用 0 而不是 0.012%,並且亮度值相同,那麼所有顏色都將是相同色調的灰色。在這個例子中,它們只是接近灰色。

OkLCh 中的色相

下面的示例展示了具有不同 H(色相)值的 oklch() 函式式表示法的色板。

HTML

html
<div data-color="0">0deg</div>
<div data-color="20">20deg</div>
<div data-color="40">40deg</div>
<div data-color="60">60deg</div>

等等。

CSS

css
[data-color="0"] {
  background-color: oklch(50% 0.4 0deg);
}
[data-color="20"] {
  background-color: oklch(50% 0.4 20deg);
}
[data-color="40"] {
  background-color: oklch(50% 0.4 40deg);
}
[data-color="60"] {
  background-color: oklch(50% 0.4 60deg);
}

等等。

結果

oklch() 中的色相角度與 hsl() 中的不同。請參閱 <hue> 瞭解更多資訊。在 hsl() 中,sRGB 顏色的 0deg 代表紅色。然而,在 CIELab 顏色空間中,0deg 對應品紅色,而紅色大約是 41deg

調整顏色的 alpha 值

下面的示例展示了改變 oklch() 顏色函式中 A(alpha)值的效果。redred-alpha 元素與 #background-div 元素重疊,以演示不透明度的效果。將 A 的值設為 0.4 會使顏色變為 40% 不透明。

HTML

html
<div id="background-div">
  <div data-color="red"></div>
  <div data-color="red-alpha"></div>
</div>

CSS

css
[data-color="red"] {
  background-color: oklch(50% 0.5 20);
}
[data-color="red-alpha"] {
  background-color: oklch(50% 0.5 20 / 0.4);
}

結果

在 oklch() 中使用相對顏色

此示例為三個 <div> 元素設定了不同的背景顏色。中間的元素使用了未經修改的 --base-color,而左右兩邊的元素則使用了該 --base-color 的提亮和變暗版本。

這些變體是使用相對顏色定義的——--base-color 自定義屬性被傳入一個 oklch() 函式,然後透過一個 calc() 函式修改輸出顏色的亮度通道以達到預期效果。亮色變體的亮度通道增加了 0.15 (15%),而暗色變體的亮度通道減少了 0.15 (15%)。

CSS

css
:root {
  --base-color: orange;
}

#one {
  background-color: oklch(from var(--base-color) calc(l + 0.15) c h);
}

#two {
  background-color: var(--base-color);
}

#three {
  background-color: oklch(from var(--base-color) calc(l - 0.15) c h);
}

結果

輸出如下:

規範

規範
CSS 顏色模組第五版
# relative-Oklch
CSS 顏色模組第四版
# ok-lab

瀏覽器相容性

另見