跳到主要內容
楓葉工具箱 ToolMaple

開發最後更新:

WCAG 對比度檢查

填前景色和背景色,看對比度過不過 WCAG 的 AA 或 AAA。

楓葉工具箱 ToolMaple
Aa Bb Cc 一般文字示意 — 看清楚嗎?
小字級也要能讀
對比度
17.40: 1
WCAG AA 一般文字(≥ 4.5)
WCAG AA 大字(≥ 3)
WCAG AAA 一般文字(≥ 7)
WCAG AAA 大字(≥ 4.5)

對比度是什麼?為什麼用眼睛看不準

WCAG 的對比度是一個數字,描述兩個顏色在「亮度」上差多遠:兩個一模一樣的顏色是 1:1,純黑配純白是 21:1。本頁收前景色與背景色兩個色碼,算出比值,再告訴你它過得了 WCAG 2.1 的哪幾條門檻。

算式本身很短:

ratio = (L1 + 0.05) / (L2 + 0.05)
L = 0.2126 × R + 0.7152 × G + 0.0722 × B(sRGB 線性化後)

那組權重就是「用眼睛看」會失準的原因。綠色佔了七成多的亮度、藍色不到十五分之一,所以一個飽和的藍看起來很亮很有精神,對亮度卻幾乎沒有貢獻。品牌色的藍、紫、紅放在白底上,常常就落在 3:1 到 4.5:1 之間,剛好是「挑色的人覺得沒問題、其他人看得很吃力」的那一段。公式裡兩邊各加的 0.05 是在模擬螢幕反射的環境光,也是比值最高只到 21 的原因。

另外,這個數字完全不管色相。兩個亮度相同的顏色,不管看起來差多少,算出來都是 1:1;而過了 4.5:1 的配色也可能刺眼到看不下去。對比度是及格線,不是設計審查。

如果你手邊只有 HEX,想轉成 RGB、HSL 或反推同色相不同明度的相近色,可搭配 色碼轉換工具 一起調,直接把調整後的色碼貼回本工具驗證 AA / AAA。

哪一條門檻對應介面的哪一塊

  • AA 一般文字(4.5:1):可讀性基本門檻,多數設計系統最低標
  • AA 大字(3:1):≥ 18pt 或 ≥ 14pt 粗體
  • AAA 一般文字(7:1):高可讀性、銀髮族與弱視友善
  • AAA 大字(4.5:1)
  • 圖示、控制項邊框、焦點框、圖表線條(3:1):WCAG 2.1 的 1.4.11 非文字對比(AA 級),管的是「辨識元件與其狀態所需的視覺資訊」。淡淡的 1px 輸入框邊線最常在這一條陣亡。
  • 商標與停用中的元件:WCAG 明文豁免商標、品牌名稱、停用中的介面元件與純裝飾。豁免不等於好讀,停用狀態的文字還是留一點可讀性比較好。
  • 深色模式:門檻一樣,但要分開量。白底過了不代表深色底也過,而且卡片只要比頁面淺一階,上面每一組比值都會跟著變。

「大字」在 WCAG 2.1 的定義是 18 點以上,或 14 點以上的粗體;換算成 CSS 大約是 24px,粗體大約 18.66px(CSS 的 1 點是 1/72 英吋)。中文字在同樣點數下看起來比英文密,所以標題靠大字門檻放行時,實際排出來再看一眼比較保險。

實戰教學:檢查一組配色

  1. 前景色填文字的顏色,背景色填文字後面那一層的顏色。三位數簡寫(例如 #fff)可以用,旁邊的色彩選擇器也能直接點。
  2. 看那個大數字。下面四格會分別告訴你 AA 一般文字、AA 大字、AAA 一般文字、AAA 大字過不過。
  3. 順便看上面的即時預覽。它用你的兩個顏色畫標題、內文與小字;剛好壓線過 4.5:1 的配色,落到小字往往還是很虛,這就是「看」比「算」多出來的資訊。
  4. 要量圖示或邊框,就把圖示的顏色填前景、它正後方那一層填背景,改看 3:1 那一格。
  5. 每個會換顏色的狀態都要各量一次:hover、focus、已瀏覽過的連結、錯誤訊息。

這個檢查最常出現在這些場合:

  • UI 元件審查:按鈕、表單、連結對比是否足夠
  • 品牌主色 vs 背景色驗證
  • 無障礙檢測(a11y audit)必跑
  • 銀髮族、教育、醫療類產品優先採用 AAA

實戰教學:品牌色過不了 AA 怎麼救

前景色沒過 AA 一般文字時,本頁會直接給一個建議色:保留色相與飽和度、只動明度,停在剛好到 4.5:1 的最小幅度,所以看起來還是同一個顏色。按「套用建議色」就換過去,或者換個方式解:

  1. 改背景,不要改品牌色。品牌色通常動不了,底色可以:在白底上不及格的黃,放到接近黑的底色上就過得很輕鬆。
  2. 把按鈕反過來做。淺的品牌色當文字很糟、當底色很好。底色用品牌色、文字用白或接近黑,改量那一組,再確認按鈕跟頁面背景之間有沒有 3:1。
  3. 把文字升級成大字。18 點、或 14 點以上的粗體,門檻降到 3:1。標題這樣做沒問題,整段內文這樣做就是自欺欺人。
  4. 品牌色準備兩個版本。很多設計系統會有一個給大面積用的行銷色,再加一個只給文字與圖示用的加深或提亮版本,這是「品牌當初沒為螢幕設計」的標準解法。

色碼怎麼取得、結論怎麼交出去

這件事最花時間的其實是拿到正確的色碼。用眼睛從截圖上判讀出來的顏色,跟樣式表裡的值往往不一樣,廣色域螢幕還會再偏一點。

  • 從線上的頁面取:開 devtools 選到元素,複製 computed 的 color 與 background-color。computed 值已經把繼承與疊色算進去了,那才是你要的那個。
  • 從設計稿取:直接複製填色的色碼,不要用滴管在畫布上吸,那會吸到反鋸齒的邊緣像素。
  • macOS、Windows:macOS 的「數位色彩計」(在工具程式裡)可以讀螢幕上任一個像素,記得切成 sRGB 顯示,不然數字跟 CSS 對不起來;Windows 用 PowerToys 的 Color Picker。
  • 把結論交出去:把比值與四格過關表截一張圖丟進 PR 或聊天室最快。順手把條款編號寫上(1.4.3 或 1.4.11),對方要查有得查。

別的工具怎麼算、哪裡會對不起來

符合規範的檢查器用的都是同一條公式,所以兩邊算出來不一樣,幾乎都是「餵進去的顏色不同」。用 JavaScript 寫出來就十來行:

const lin = c => {
  const s = c / 255
  return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4
}
const luminance = ([r, g, b]) =>
  0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b)

const ratio = (a, b) => {
  const [hi, lo] = [luminance(a), luminance(b)].sort((x, y) => y - x)
  return (hi + 0.05) / (lo + 0.05)
}

ratio([26, 26, 26], [255, 255, 255]) // 17.4
  • 瀏覽器 devtools:Chrome 的 Styles 面板點色塊會顯示對比度與 AA / AAA 標記,還能在選色器上畫一條門檻線;Firefox 在無障礙檢測器裡顯示,文字壓在圖片上時給的是一個範圍而不是單一數字;Safari 的選色器也會顯示比值。確切位置每個版本都在搬,這裡寫的是目前的情況。
  • 自動化檢測:Lighthouse 與 axe 都會報文字對比不足,但兩者都會跳過它們算不出來的情況,包括壓在圖片或漸層上的文字、以及畫進 canvas 的文字。報告全綠不等於這頁過了 1.4.3。
  • 設計工具外掛:對比外掛通常拿選取的圖層跟它正後方那一層比,中間夾了半透明遮罩時就會算錯。
  • 廣色域色彩:WCAG 的公式定義在 sRGB 上,寫成 color(display-p3 ...) 或 oklch() 的顏色要先轉回 sRGB;超出 sRGB 色域的顏色沒有精確答案。
  • 作業系統可以蓋過你:Windows 的高對比佈景會整組換掉你的配色,CSS 端看到的是 forced-colors;Windows 與 macOS 也都有「提高對比」的設定,對應 prefers-contrast。這兩種模式也要測。

台灣這邊,公部門網站與政府標案採用的「網站無障礙規範」是依 WCAG 訂的,驗收時看的通常是 AA 級;實際要對到哪一版、哪幾條,以該案的招標與驗收文件寫的為準。民間產品沒有法定門檻,但 AA 已經是多數設計系統的最低標。

限制與隱私

什麼都不會離開你的瀏覽器。兩個色碼都是在你的裝置上解析與相除,不上傳、不儲存、不寫進紀錄,載入之後斷網也照樣能用。

只吃兩個不透明的純色。工具讀的是 hex,並假設兩個顏色都完全不透明。有半透明就自己先疊好、把疊完的顏色貼進來。它也看不到你的頁面,不知道文字後面實際上是什麼。

2.x 的公式有已知的盲點。普遍認為它對「淺色文字壓在中深色背景上」過於嚴格、對很暗的配色又過於寬鬆,這也是 APCA 與 WCAG 3.0 在處理的事。在那之前,會被拿來驗收的還是 4.5:1 與 3:1。

對比只是其中一條。過了不代表字級、行長、細字重沒問題,也不代表你沒有犯「只用顏色區分狀態」(那是另外一條)。它更沒有考慮色覺辨認障礙,因為公式從頭到尾不看色相。

四捨五入。比值顯示到小數點後兩位。顯示 4.49 是不及格、4.50 是及格,不同工具在邊界上的進位方式不同就會吵起來。差這麼一點的配色,直接改掉比較快。

常見問題

AA 跟 AAA 差在哪?我該選哪個?

AA 是業界基本門檻(一般文字 4.5:1),多數設計系統採用。AAA 是高可讀性等級(一般文字 7:1),銀髮族、教育、醫療類產品建議採用。一般消費型產品達到 AA 即可,行銷頁、品牌頁可允許部分大字降到 3:1。

為什麼用 RGB 看起來明明很亮,對比度卻不夠?

WCAG 使用「相對亮度(relative luminance)」,會把 RGB 經 sRGB 線性化,再以 0.2126 R + 0.7152 G + 0.0722 B 加權。綠色權重最高、藍色最低,所以「亮藍色」看起來鮮豔但對比度可能很低。要靠公式或本工具實測。

深色模式(dark mode)對比要怎麼設計?

深色模式不是把顏色反相就好。建議:背景用 #0E0E0E ~ #1A1A1A(非純黑、減少光暈)、主文字用 #E5E5E5 ~ #F5F5F5、次文字降到 #999 仍要過 AA。品牌主色可能在深色背景變太亮,需要重新調飽和度。

WCAG 2.1 跟 2.2、APCA 哪個比較準?

WCAG 2.1 / 2.2 對比計算方式相同(本工具採用)。APCA 是 WCAG 3.0 候選新公式,更符合人眼感知(特別是深色 UI),但 W3C 尚未正式採納。為了相容法規(無障礙標準、政府網站規範),仍建議用 WCAG 2.x 驗收。

純白配上品牌色按鈕,為什麼老是過不了 AA?

品牌色(特別是黃、橘、淺綠)在白底上對比常落在 2-3:1 區間。解法:1) 文字加粗,用大字標準 3:1;2) 把品牌色當邊框,文字改深灰;3) 按鈕用品牌色為底,文字白色(深色品牌色才有效)。可用本工具實測。

計算標準

對比度公式採 WCAG 2.1 規格(與 2.2 相同),不採還在草案階段的 APCA。兩個色碼的運算就是幾行數學,在你的瀏覽器內直接算完。

  • W3C,Web Content Accessibility Guidelines (WCAG) 2.1:1.4.3 對比(最低)的 4.5:1 與 3:1、1.4.6 對比(增強)的 7:1 與 4.5:1、1.4.11 非文字對比的 3:1,以及商標與停用元件的豁免、「大字」為 18 點或 14 點粗體的定義。
  • W3C,Web Content Accessibility Guidelines (WCAG) 2.2:對比相關的條款與門檻原封不動沿用 2.1。
  • W3C,CSS Color Module Level 4:hex 寫法、sRGB 色彩空間,以及套用 WCAG 權重前必須先轉回 sRGB 的廣色域寫法。
  • devtools 與自動化檢測的行為,寫的是撰稿當下各瀏覽器出貨版本的情況,會隨版本移動。

更多工具

要把候選色在 HEX、RGB、HSL 之間換算,或把同一個色相走幾階明度再貼回來驗,用色碼轉換工具;底色要做漸層的話,CSS 漸層產生器可以直接產出 code 再回來量兩端。整份樣式表要一次盤點,正規表達式測試器可以先把裡面所有的 hex 撈出來,再一組一組檢查。

相關工具

隱私:兩個色碼都在你的瀏覽器裡解析與比較,不會送到伺服器、不會儲存、也不會寫進紀錄,分析事件不帶你輸入的顏色。