對比度是黑白研究唯一有法規效力的部分。WCAG 把它寫成一條兩行的公式,而全世界的設計工具都在用那條公式產生綠色勾勾。問題是那條公式建立在 1990 年代的簡化模型上,它看不見字級、看不見字重、看不見深色模式的非對稱性——而這些正好是 對比敏感度函數 告訴我們最重要的變數。


📖 學

一、WCAG 2.x 的公式

對比度 = (L1 + 0.05) ÷ (L2 + 0.05)

L1 = 較亮色的相對亮度,L2 = 較暗色的相對亮度
相對亮度範圍:0(黑)到 1(白)

相對亮度由 sRGB 值先做 gamma 解碼(轉回線性光),再用 Rec. 709 係數加權:0.2126 R + 0.7152 G + 0.0722 B。

最大值是純黑對純白的 21:1(代入 (1+0.05)/(0+0.05))。

門檻值:

層級一般文字大型/粗體文字
AA4.5:13:1
AAA7:14.5:1

那個 +0.05 是什麼? 它模擬環境光在螢幕表面造成的反射(flare)。沒有它,純黑的 L2 = 0 會讓比值變成無限大。這個常數是一個對典型觀看環境的假設,而不同環境(強光下的手機 vs 暗房裡的顯示器)的實際 flare 差很多——這是公式第一個隱藏的簡化。

二、四個已知盲點

盲點一:完全忽略字級與字重。

一個 12px 的細體灰字與一個 32px 的粗體字,只要顏色相同,WCAG 給的分數完全一樣。但 CSF 明確告訴我們:空間頻率是對比知覺的主要驅動因素之一。細小的字是高空間頻率刺激,需要更高的對比才能被偵測。

WCAG 有「大型文字門檻降到 3:1」這條規則,算是粗糙地承認了這件事,但它是一個二分的門檻而不是連續的函數。

盲點二:在深色區段系統性高估對比。

公式在兩色都偏暗時給出的數字,明顯高於實際可讀性。一個算出 4.5:1 的深灰配近黑,在實際使用中可能相當難讀。這直接導致 WCAG 2.x 對深色模式無法給出可靠指引——而深色模式在 2020 年代已經是主流需求,這一點讓它的實用性大打折扣。相關的實作討論見 Dark Theme 最佳實踐。

盲點三:對調前景與背景得到相同分數。

公式是對稱的——黑字白底與白字黑底算出來一模一樣。但這兩者的知覺性質不同:白字黑底會因為光暈(halation/irradiation)顯得字更粗、筆劃更容易糊在一起,在細字重上尤其明顯。極性(polarity)是真實變數,公式看不見它。

盲點四:對色相不敏感。

人眼對藍的敏感度遠低於綠與紅,但公式用固定的加權處理所有色相組合。某些在數值上達標的組合(特別是涉及飽和藍或飽和黃的)實際表現與分數不符。

三、APCA:提議中的替代方案

APCA(Accessible Perceptual Contrast Algorithm) 是為 WCAG 3.0 提議的替代算法,針對上述盲點做了結構性的改變:

  • 分別建模背景亮度與文字亮度,而不是取一個對稱的比值。
  • 把字級與字重納入,輸出的門檻隨字體參數變動。
  • 處理極性,light-on-dark 與 dark-on-light 給出不同結果。

APCA 的輸出是一個帶正負號的 Lc(lightness contrast)值,常被引用的門檻大致是:Lc 90 以上對應內文(大致相當於 WCAG AA 在淺底上的 4.5:1),Lc 75 以上對應大型/粗體文字。

但必須講清楚現狀:WCAG 3.0 仍在草案階段,APCA 的門檻值可能再調整,而目前絕大多數法規合規要求引用的仍是 WCAG 2.x。

實務立場:用 WCAG 2.x 做合規底線(因為那是法律要求的),用 APCA 或實際測試做品質判斷(因為它更貼近知覺)。兩者衝突時——通常發生在深色模式與細字上——相信眼睛與使用者測試。

四、黑白極端值的實務問題

純黑字配純白底(21:1)在長文閱讀上通常不是最佳選擇。 常見的理由是高對比在明亮環境下造成光暈與眼睛疲勞,許多閱讀介面因此選擇略低的對比(例如 #1a1a1a 配 #fafafa,約 17–18:1)。

這個「高對比反而不好」的說法需要小心處理。 它在設計圈廣泛流傳,但可引用的對照研究很有限,而且對視力不佳或低視力使用者而言,更高的對比通常確實更好。把「我覺得刺眼」推廣成「所有人都不該用純黑白」是過度推論,列在 主張 vs 可佐證。

純黑背景(#000000)在 OLED 上有實際的技術後果:像素完全關閉,與相鄰亮像素的切換會產生較明顯的拖影(smearing),而且極端對比在暗環境下的光暈更強。這是為什麼許多深色模式用的是 #121212 這類深灰而非純黑——Material Design 明確建議深色介面用深灰而非純黑,理由同時包含表達層級(純黑之下沒有更暗的層可用)與視覺舒適。

五、非文字元素的對比

常被忽略的一塊:WCAG 2.1 對非文字元素也有 3:1 的要求——UI 控制項的邊界、圖示、圖表中用來區分資料的元素。

這一條是最常被違反的,因為淺灰的細邊框在視覺上很討喜,而設計稿在高品質螢幕上看起來總是沒問題。典型的受害者是:輸入框的邊框、停用狀態的按鈕、圖表的格線與資料系列。

圖表有一個額外的硬要求:不能只靠顏色區分資料。 因為 明度軸 那篇講的——色相不同但明度接近的兩個顏色,在灰階下與對多數色覺異常者而言是同一個。對策是同時給出明度差、形狀差或圖案差,而驗收方法極簡單:把圖表轉成灰階,如果還分得出來就過關。


🧠 記

WCAG 公式的 +0.05 是對環境反射的假設,不同觀看環境下並不準確。

四個盲點:忽略字級字重、深色區段高估、極性對稱、色相不敏感——每一個都對應 CSF 已知的事實。

WCAG 2.x 是法規底線,APCA 是品質判斷;衝突時(深色模式、細字)相信測試。

「高對比傷眼」是流傳廣但證據薄的主張,對低視力使用者通常相反。

深色模式用深灰而非純黑,理由同時是層級表達與視覺舒適。

圖表驗收法:轉成灰階還分得出來就過關。


✍️ 實踐

對自己的介面做一次灰階與極性檢查,30 分鐘:

第一步:灰階測試(最快找出色相依賴)

/* 暫時套用到整個頁面 */
html { filter: grayscale(100%); }

逐頁檢視:圖表的資料系列還分得出來嗎?狀態色(成功/警告/錯誤)還分得出來嗎?連結還看得出是連結嗎?任何在灰階下消失的區分,都是只靠色相在工作的設計。

第二步:對比實測,不要只信設計稿

用瀏覽器開發者工具的對比度檢查(Chrome DevTools 的 Inspect 面板會直接顯示),特別查這四類最常出問題的元素:輸入框邊框、停用狀態、佔位文字(placeholder)、圖表格線。

第三步:極性對照

把同一段內文做成「深底淺字」與「淺底深字」兩版,用相同的字重,在明亮環境與昏暗環境各看一次。多數人會發現深底淺字在細字重下明顯較糊——那就是 WCAG 公式看不見的那個變數。

第四步:縮小測試

把介面縮到 50%,看哪些細線與小字消失了。這直接對應 CSF 的高頻截止。


🔗 延伸學習


相關