oklch()
oklch() 函式式表示法用於在 Oklab 顏色空間中表示指定顏色。oklch() 是 oklab() 的圓柱形式,使用相同的 L 軸,但帶有極座標形式的色度(C)和色相(h)座標。
語法
/* 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-
一個介於
0和1之間的<number>,一個介於0%和100%之間的<percentage>,或關鍵字none(在此情況下等同於0%)。在這裡,數字0對應0%(黑色),數字1對應100%(白色)。該值指定了顏色的感知亮度,即“明亮度”。注意:
oklch()中的L是感知亮度,指的是我們眼睛視覺上感知的“明亮度”。這與hsl()中的L不同,後者表示的是與其他顏色相比較的亮度。 C-
一個
<number>、一個<percentage>,或關鍵字none(在此情況下等同於0%)。該值衡量顏色的色度(大致表示“顏色的量”)。其最小有效值為0,而最大值理論上是無限的(但實際上不超過0.5)。在這裡,0%是0,100%是數字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-
一個介於
0和1之間的<number>,一個介於0%和100%之間的<percentage>,或關鍵字none(在此情況下等同於0%)。這表示輸出顏色的亮度值。在這裡,數字0對應0%(黑色),數字1對應100%(白色)。 C-
一個
<number>、一個<percentage>,或關鍵字none(在此情況下等同於0%)。該值表示輸出顏色的色度值(大致表示“顏色的量”)。其最小有效值為0,而最大值理論上是無限的(但實際上不超過0.5)。在這裡,0%是0,100%是數字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通道值解析為一個介於0和1(含)之間的<number>。c通道值解析為一個介於0和0.4(含)之間的<number>。h通道值解析為一個介於0和360(含)之間的<number>。alpha通道值解析為一個介於0和1(含)之間的<number>。
在定義相對顏色時,輸出顏色的不同通道可以用幾種不同的方式表示。下面,我們將透過一些示例來說明這些方式。
在下面的前兩個示例中,我們使用了相對顏色語法。然而,第一個示例輸出與源顏色相同的顏色,而第二個示例輸出的顏色則完全不基於源顏色。它們並沒有真正建立相對顏色!你不太可能在實際程式碼庫中使用這些,而可能會直接使用絕對顏色值。我們包含這些示例是為了讓你開始學習相對 oklch() 語法。
讓我們從一個源顏色 hsl(0 100% 50%)(相當於 red)開始。下面的函式輸出與源顏色相同的顏色——它使用源顏色的 l、c 和 h 通道值(0.627966、0.257704 和 29.2346)作為輸出通道值。
oklch(from hsl(0 100% 50%) l c h)
此函式的輸出顏色是 oklch(0.627966 0.257704 29.2346)。
下一個函式對輸出顏色的通道值使用絕對值,輸出了一個完全不同於源顏色的新顏色:
oklch(from hsl(0 100% 50%) 42.1% 0.25 328.363)
在上述情況中,輸出顏色是 oklch(0.421 0.25 328.363)。
以下函式建立了一個基於源顏色的相對顏色:
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。 - 將輸出顏色的
l和c通道值設定為不基於源顏色的新值:分別為0.8和0.4。
最終的輸出顏色是 oklch(0.8 0.4 29.2346)。
備註:如上所述,如果輸出顏色使用的顏色模型與源顏色不同,源顏色會在後臺被轉換為與輸出顏色相同的模型,以便能夠以相容的方式表示(即使用相同的通道)。
在本節我們目前看到的示例中,源顏色和輸出顏色的 alpha 通道都沒有被明確指定。當未指定輸出顏色的 alpha 通道時,它預設為與源顏色 alpha 通道相同的值。當未指定源顏色的 alpha 通道時(且它不是相對顏色),它預設為 1。因此,上述示例中的源和輸出 alpha 通道值均為 1。
讓我們看一些指定源和輸出 alpha 通道值的示例。第一個示例將輸出 alpha 通道值指定為與源 alpha 通道值相同,而第二個示例則指定一個與源 alpha 通道值無關的不同輸出 alpha 通道值。
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)。對 l、c、h 和 alpha 值應用 calc() 計算,最終得到的輸出顏色為 oklch(0.827966 0.357704 9.23462 / 0.9)。
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
<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
[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
<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%),這使得所有顏色都接近灰色。
[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.01 和 2%,並且亮度值相同,那麼所有顏色都將是相同色調的灰色。在這個例子中,它們只是接近灰色。
OkLCh 中的色相
下面的示例展示了具有不同 H(色相)值的 oklch() 函式式表示法的色板。
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
[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)值的效果。red 和 red-alpha 元素與 #background-div 元素重疊,以演示不透明度的效果。將 A 的值設為 0.4 會使顏色變為 40% 不透明。
HTML
<div id="background-div">
<div data-color="red"></div>
<div data-color="red-alpha"></div>
</div>
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
: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 |
瀏覽器相容性
載入中…
另見
- 所有顏色表示法列表
- 使用相對顏色
- CSS 顏色模組
<hue>資料型別lch()和oklab()顏色函式- 關於 OkLCh 顏色空間的互動文章 (2024)
- CSS 中的 OKLCH:我們為什麼從 RGB 和 HSL 遷移 (2024)
- 一種用於影像處理的感知顏色空間 (2020)