Oklab Color Space

2019 年的時候,寫過一篇文章介紹了 Lab Gradient,然後就沒特別關注相關發展,直到前幾天看到勞哥的推文提到 Oklab 這個色彩空間,而且瀏覽器已經原生支援了,我才發現原來網路標準的發展有跟上來,我也趁機多惡補了一些相關的知識。

在介紹 Oklab 前,先來介紹以前提到的 Lab 吧,其實它是國際照明委員會(International Commission on Illumination,簡稱 CIE)在 1976 年提出的色彩空間定義,全名是 CIELAB color space,或是簡寫為 L*a*b*,多加*為了避免混淆,Lab 其實是不正確的縮寫,不過這三個字母其實就是該顏色空間的三個軸:L 代表亮度、a 代表紅色到綠色間的位置、b 代表藍色到黃色間的位置,也就是 opponent color theory(又稱對比色理論或色覺對向論)的顏色組成,這個色彩空間的重點在它的座標比較符合人類對色彩的感知。

Oklab 又是什麼呢?它是 Björn Ottosson 在 2020 年底發表的一個新的色彩空間定義,他在文章內有詳細的說明為什麼會想要定義一個新的色彩空間,文內也列舉了現存的色彩空間的主要問題,其中 CIELAB 的問題就是在 predict hue (預測色相)有些問題,尤其是藍色附近,其實我一開始對於這個 predict 感到很疑惑,想說到底是什麼意思,後來看到另外一篇文章 An interactive review of Oklab,文章一開始放的互動工具預設的漸層設定就是藍色到白色,然後一看就很明顯, CIELAB 的漸層色相跑一下就歪掉了變成偏紫色去了(random 按鈕可以按按看看其他色相都沒這樣嚴重),因為 CIELAB 是屬於人類感知的色彩空間,意思就是它的依歸其實是人類的感覺,所以需要從三維座標去預測人類實際上看到感覺到的顏色,數值上一樣的話就應該讓人感覺一致,而 Oklab 則是結構和 CIELAB 一樣,但是透過新的資料集來調整並解決前面提到的問題,而後在 2023,Oklab 進了 CSS Color Level 4 的草稿,主流瀏覽器現在也都已經支援。

CIELAB

進 CSS Color 代表什麼意思呢?第一個當然就是可以用 oklab() 函數來定義顏色了:

oklab(40.1% 0.1143 0.045);
oklab(59.69% 0.1007 0.1191);
oklab(59.69% 0.1007 0.1191 / 0.5);

除了直接定義顏色之外,現在 CSS 也支援相對顏色(relative color)了:

/* Relative values */
oklab(from green l a b / 0.5)
oklab(from #0000FF calc(l + 0.1) a b / calc(alpha * 0.9))
oklab(from hsl(180 100% 50%) calc(l - 0.1) a b)

這樣要只調整色相或是亮度都變得很簡單,或是也可以用 oklch(),這樣色相(Hue)就更好挑選。

然後就是漸層了,現在的 CSS 漸層也支援使用不同的顏色內差方式,也就是用不同色彩空間來算中間的顏色變化:

linear-gradient(in oklab, blue, red)
linear-gradient(in lab to right, #44C, #795)

在最前面加上in <color-space>就可以,支援的色彩空間其實不少,如果是線性漸層,那支援 srgb、srgb-linear、display-p3、a98-rgb、prophoto-rgb、rec2020、lab、oklab、xyz、xyz-d50、xyz-d65,如果是 polar 漸層,那支援 hsl、hwb、lch、oklch,其實相當夠用,而這段語法其實是叫 color-interpolate(顏色內插),除了漸層之外,會用到的地方還包括 filter、animation、transition 和color-mix()函數等。

前面也已經提到,現在主流瀏覽器都已經支援了,不過還是來看一下 caniuse 上的細節,Chrome 是 2022 就支援了,但是 Firefox 是到去年的 2023 才支援,如果要抓兩年的時間的話就還要再等等,當然現在也還是可以直接用,多加一組 fallback 就可以。

除了瀏覽器原生支援外,其實也不少其它開發相關的工具支援,也有不少文章在介紹,像是 Smashing Magazine 的 Falling For Oklch: A Love Story Of Color Spaces, Gamuts, And CSS 和 Evil Martians 的 OKLCH in CSS: why we moved from RGB and HSL,兩篇文章就介紹了不少工具和一些延伸的文章,工具部分像是 Figma 的 plugin OkColor 和 npm 上的 convert-to-oklch,Evil Martians 還做了一個 oklch.com ,是針對 Oklch 的 color picker 還蠻厲害的。

oklch.com


溝通

とこなめ招き猫通り

照片是常滑招財貓大道的「除憂解難」。

沒想到這週這麼熱鬧,前後兩天分別發生兩件和溝通有關的熱烈討論(網路對罵?),第一件事情比較少人知道,是發生在 COSCUP 的 telegram 社群,雖然是公開社群但是因為沒有直接的公開網址所以我就不寫網路 id 了。有社群朋友(後面用 A 代稱)想要辦 BoF 需要一些硬體設備,但是因為今年的 BoF 公告還沒出來,所以他想知道大會方是不是有機會能協助(幫忙借用設備),可以的話就會提出申請,其實如果熟悉 BoF 的應該都知道大會方只有提供場地,不過我當時在開車也沒辦法馬上幫忙回,總之就有其他朋友幫忙回了,四貓作為工作人員也在幫忙釐清對方的需求,當時大概就是有位社群朋友回文時多了一句:

但如果認為大會方該要提供的話,你們預期大會方能從哪搞到這個資源呀

閱讀「溝通」全文

看見不同的學習風景

SEE DIFFERENT 看見不同的學習風景

週末帶小孩去松山菸廠意外發現到「SEE DIFFERENT 看見不同的學習風景」這個展覽,心中實在是有些想法和感觸想分享,首先先來介紹一下這個展覽吧:這個展覽其實是「第二屆教科圖書設計獎」的得獎作品,沒錯,是教科書,國中國小的教科書的設計展!而且不只是視覺上的設計,評選的範圍也包含內容的設計,展場展出的就是本屆得獎的教科書們,有一整區是可以翻閱的,只能說現在的教科書和我接觸過的三十年前左右的真的是差很多,除了更加活潑有質感的設計,還有各種清晰的圖表輔助,甚至連內文都變得很好閱讀,很像是在看科普書而不是教科書,深入了解之後,才知道這一切其實要從十年前,也就是 2014 年在 FlyingV 上的「美感細胞的教科書改造計畫」開始,其實我當年也有看到,不過我是沒什麼參與,覺得就是很理想但是很難進入體制內,沒想到,美感細胞默默耕耘十年,加上教育部推動美感教育,還真的推展開來了,教科圖書設計獎都辦到了第二屆,而美感細胞在其中的角色,除了在 FlyingV 上三季的募資計畫,後來還成立社團法人,承接一些政府合作案之外,也持續進行相關研究,發佈了不少的設計報告和參考資料,另外還有一個很重要的角色,就是作為教科書出版社和設計師之間的媒合橋樑,其實教科書的出版不是那麼容易,和一般書籍比起來限制較多,除了內容要送審之外,教育部還有印製規定

閱讀「看見不同的學習風景」全文

時間ねぇ

時間のないサイト運営者リング

在 blog 這詞最為蓬勃之時,很流行在自己的網站上放各式各樣的 banner,這些 banner 種類用途很多,像是顯示你網站使用了甚麼技術、你想幫忙宣傳的東西、網站連結、甚至是一些自我的主張表現或是可以稱為無用小廢物(像是日本放置協会,又簡寫為 NHK)的都有,我以前也放了不少,不過最後留下來的就只有兩個,第一個是 MDN 的推廣貼紙,第二個則是「時間のないサイト運営者リング」,沒時間的站長串連,這張 banner 我看到的第一眼就很喜歡,有很符合個人狀況所以我放了很久,從 2007 年五月開始就一直放著,也有連結回去,直到前陣子整理網站的時候才發現,當初連回的串連網站已經死掉了!然後我就花了些時間尋找替代方案。

閱讀「時間ねぇ」全文

JSON Type Definition

之前工作上需要,想要一個簡單的可以檢查 JSON 資料結構的工具,研究了一陣子,發現到了 JSON Type Definition(簡稱 JSON Typedef 或是 JTD) 這個 RFC 標準,相較於發展已經很久的 JSON Schema,JSON Typedef 的語法簡潔不少:

{
	"properties": {
		"id": { "type": "string" },
		"createdAt": { "type": "timestamp" },
		"karma": { "type": "int32" },
		"isAdmin": { "type": "boolean" }
	 }
}
閱讀「JSON Type Definition」全文

➡ 看看其它文章