iT邦幫忙

2026 iThome 鐵人賽

DAY 22
0
Modern Web

前端不寫 Python,照樣 ship 一把網頁無障礙 CLI系列 第 22

Day 22:同一份 CSS,五月的工具沒話說,九月的工具報了一整排 fail

  • 分享至 

  • xImage
  •  

Day 22 · W4 · 無障礙線 · 難度 ★★★☆☆

本系列由 AI 協作撰寫。 內容、技術判斷、程式碼由 light-design 數位顧問團隊與 Claude 共同產出,最終由作者驗證後 publish。完整協作模式與把關方式見 Day 01

5 月 22 日,我把自家站 30 頁掃到 0 fail,四天後 AAA 標章核發。9 月 4 日,同一個站、同樣 30 頁、開瀏覽器再掃一次:33 個 fail。

我原本以為是這三個月裡我把站改壞了。翻完檔案時間,出 fail 的四個樣式檔,最後一次修改全在核發之前。站上那幾行 CSS 沒動,動的是拿來量它的尺。

一句話主軸:自評表沒改、出 fail 的 CSS 沒改,變的是工具在送驗之後長出了四條 WCAG 2.2 規則。

同一個站,四個數字

先把數字跟條件擺在一起,不然這四個數字看起來像一路惡化:

2026-05-22   30 頁   本機、深色模式   0.4.4        0 fail
2026-08-19   5 頁    正式站、不開瀏覽器  0.5.0      0 fail   ← Day 04
2026-08-31   6 頁    正式站、開瀏覽器   0.6.0 開發版  7 個停留點不合格 / 174   ← Day 17
2026-09-04   30 頁   正式站、開瀏覽器   0.6.0 開發版  33 fail · 179 info · 40 caveat

Day 04 那五頁 0 fail 是不開瀏覽器的靜態掃描;Day 17 六頁數的是鍵盤停留點,今天數的是頁。頁數、有沒有開瀏覽器、哪一版工具,三個條件各不相同,數字本來就不能直接排成一條線。

真正能對照的是第一列跟最後一列:都是 30 頁,都是這個站,一個 0,一個 33。差在中間三個半月工具改了什麼。

33 個 fail 是誰

依檢測碼分組,四條規則:

CS3241300E   2.4.13  AAA   焦點指示器對比        30 頁,每頁 1
CS2250800E   2.5.8   AA    目標尺寸(最低)        1 頁
CS3241200E   2.4.12  AAA   焦點不被遮(增強)      1 頁
FA2241100E   2.4.11  AA    焦點不被遮(最低)      1 頁

30 個是同一件事:頁首搜尋框的焦點外框,用的是 25% 透明度的藍,跟白底的對比 1.54:1,門檻 3:1。Day 13 量首頁時就抓到這一個,當時它是 33 個停留點裡的 2 個。搜尋框在共用的頁首,所以 30 頁每頁一次。

另外三個各一:首頁評價輪播的切換圓點量到 12×12 px,門檻 24×24(這條規範有間距例外,這顆還要人看一眼);部落格列表的分頁面板取得焦點時,上緣被固定的頁首蓋住,2.4.11 跟 2.4.12 同一個元素各報一次。

這四條檢測碼在 110.07 的碼表上都不存在,115.11 才加進來;對應的全是 WCAG 2.2 新增的準則。

發稿前的 9 月 6 日我又掃了一次,30 頁、33 個 fail、四條的分佈一個數字都沒變。這個站這兩天沒人動,工具也沒動,所以它該一樣。

四條規則什麼時候進工具的

標章核發那天是 5 月 26 日。那天工具是 0.4.5,133 條規則,其中 WCAG 2.2 的規則:0 條。

三週後的 6 月 18 日,0.5.0 對齊 115.11 規範,一次加了 13 條 2.2 規則,133 變 146,上面四條裡的三條就在這批。8 月 27 日又加了一條焦點外框對比,就是那條打中 30 頁的。

這四條問的都是畫面上的事:焦點落在元件上時,外框跟底色的對比夠不夠(2.4.13);取得焦點的元件有沒有被固定的頁首蓋住,蓋住一部分(2.4.11)還是一點都不能蓋(2.4.12);可以按的東西有沒有 24×24 px(2.5.8)。四條沒有一條讀 HTML 就能回答,都要開瀏覽器把頁面畫出來、把 Tab 按過去才量得到。

所以 Day 04 那五頁 0 fail 還有另一層:8 月 19 日那天,四條裡的三條已經在工具裡了,只是靜態掃描不開瀏覽器,它們根本沒跑。工具有規則,跟規則有機會跑,是兩件事。

時間軸:上排是工具的變化,5 月 21 日 0.4.4 加兩條規則、5 月 22 日整站掃到 0 fail、5 月 26 日標章核發時 WCAG 2.2 規則 0 條、6 月 18 日 0.5.0 加 13 條 2.2 規則、8 月 27 日再加焦點外框對比一條、9 月 4 日掃出 33 個 fail;下排是站上四個出 fail 的樣式檔最後修改日,Header 3 月 9 日、button 3 月 20 日、reset 4 月 27 日、common 5 月 22 日,全部落在核發日之前

上排是尺在變長,下排是 CSS 停在原地。33 個 fail 是兩排的距離。

換句話說,送驗那天的工具沒有任何一條規則問「焦點外框看不看得見」。它沒話說,不是因為站過了,是因為它不會問那個問題。

那份 CSS 上一次動,是為了讓五月的工具閉嘴

翻站的原始碼,看每個檔的最後修改時間。核發之後動過 28 個檔:頁尾掛標章、四篇部落格文章、鐵人賽索引頁、產生分享圖的腳本。沒有一個是樣式檔。

出 fail 的四個樣式檔,時間全在核發前:頁首元件 3 月 9 日、按鈕 3 月 20 日、reset 4 月 27 日、全域樣式 5 月 22 日。

5 月 22 日這個日期有來歷。站的 repo 裡留著那幾天的掃描紀錄:

05-21 22:20   30 頁   39 fail    0.4.4 當天剛加兩條規則,30 頁全中,加 8 個對比
05-21 23:19   30 頁    0 fail    修完
05-22 13:51   30 頁   26 fail    焦點可見(2.4.7),26 頁
05-22 14:26   30 頁    0 fail    修完

全域樣式最後一次改,跟修焦點可見是同一天。也就是說,這件事五月就發生過一次:工具加了規則,站立刻掉一排 fail,我修到 0,然後送驗。差別只在五月那次發生在送驗前,九月這次發生在核發後。

規則會長,站不會自己跟著長。

自評表問的是 110.07 的題

那自評表為什麼全過?Day 03 講過送件要填 20 題,每題對應一個檢測碼。那 20 個碼全部在 110.07 的碼表上就有。再對回成功準則,是 18 個不同的準則:

兩欄對照圖:左欄列出自評表 20 題對應的 18 個成功準則,1.1.1、1.2.6、1.3.1、1.3.5、1.3.6、1.4.3、1.4.6、1.4.12、2.1.1、2.4.1、2.4.4、2.4.5、2.4.6、2.4.7、2.4.8、3.3.2、3.3.3、3.3.6,檢測碼 110.07 就有、準則全部來自 WCAG 2.1 或更早;右欄是今天四條 fail 對應的 2.4.11、2.4.12、2.4.13、2.5.8,檢測碼 115.11 才有、準則全部是 WCAG 2.2 新增;中間標示交集為零

左邊 18 個,右邊 4 個,沒有一個重疊。

左邊沒有任何一題是 2.2 新增的。這張表也不算老,1.3.5 跟 1.4.12 都是 2.1 才加進來的準則,它就是一張 110.07 的表、2.1 的題。表全過是真的,因為表問的題目裡沒有這四條;工具 33 fail 也是真的,因為工具長到 115.11、長到 2.2 了。兩邊都對,量的不是同一組東西。

115.11 從今年 11 月 30 日起適用,基準是 WCAG 2.2。依主管機關的公告,同一天起舊版停收申請,而在那之前取得的標章效期照舊三年。所以我們這張標章本身沒有問題,問題是它證明的東西有日期:它證明的是 2026 年 5 月那把尺量出來的結果。

表以後會不會換題,不是我能講的。我能講的是:拿 2.1 的表過關,不代表站在 2.2 的尺上也過。

20 題在今天的報告裡

把那 20 個檢測碼在 9 月 4 日這份報告裡的狀態抓出來:

fail      0 題
沒報     17 題
info      2 題   Q4 標頭巢狀 1 頁 · Q14 文字容器單位 29 頁
caveat    2 題   Q15 AA 對比 4 頁 · Q16 AAA 對比 4 頁(漸層底,量不到)

沒報是通過,caveat 是量不到,info 是意見,這三種讀法 Day 21 講過。要補一句:這份報告沒開模型,20 題裡要模型判的那幾題,在這裡是「未執行」,不是「通過」。

兩個 info 都值得看一眼。Q4 那一頁是首頁,標題從 h2「客戶怎麼說」直接跳到 h6,中間空了三級,自評表填的是「通過」,因為表問的是「只有一個 h1」,它確實只有一個。Q14 是文字容器的寬高用了 px,首頁一頁就 68 處,自評時我以為框架給的相對單位夠用,結果工具數的是實際算出來的樣式。兩個都不到 fail,但兩個都是表問法比工具寬的地方。

Q15、Q16 那 8 個 caveat 全是漸層底上的文字,Day 10 講過公式吃不了漸層,五月送件時人工量過一次,今天還是同樣的答案:工具量不到,不是站不過。

標章不是終點

拿到標章那天的 0 fail,是那一天那把尺量的結果。尺每長一截,站就要重量一次。這不是工具的問題,也不是站的問題,是規範在往前走。

對我來說行動很具體:30 個 fail 是搜尋框一行 outline 的顏色,把 25% 透明的藍換成實色,對比就從 1.54 過 3:1,收 30 頁。這篇發完就去改。

剩下三個沒那麼機械。輪播圓點要放大到 24×24 還是靠間距例外過關,是設計決定;分頁面板被頁首蓋住,要改 scroll-padding 還是換掉固定頁首,也是設計決定。工具能告訴你哪裡不合格,改成什麼樣它不替你決定。

看規則進工具的日期:

a11y-moda rules show CS3241300E --format json

輸出裡有它對應的準則跟等級。哪一版加的,查 CHANGELOG 就知道。你的站如果也在五月之前過了標章,值得用現在的工具重掃一次。

今天的重點

  • 出 fail 的 CSS 從核發前就沒動過:四個樣式檔的最後修改日全在 5 月 26 日之前,改的是尺不是站。
  • 33 個 fail 的四條檢測碼都是 115.11 才有的,對應準則全是 WCAG 2.2 新增,分別在 6 月 18 日跟 8 月 27 日才進工具。
  • 自評表 20 題的檢測碼全在 110.07 碼表上,對應 18 個準則沒有一個是 2.2 新增的:表全過跟工具 33 fail 兩邊都對,量的範圍不同。
  • 同一個站 0 / 0 / 7 / 33 不是惡化:頁數、開不開瀏覽器、哪一版工具,數字要帶條件。
  • 30 個 fail 是一條規則一行 CSS,改一處收 30 頁;標章不是終點,尺會長。

明天 Day 23:33 個 fail 攤在這裡了,那一行 CSS 改完,誰來證明它真的修好了?我沒教 AI 怎麼修,我教它怎麼證明修好了。


上一篇
Day 21:九成的檢測碼要靠人判,LLM 補的不是聰明,是可重複
系列文
前端不寫 Python,照樣 ship 一把網頁無障礙 CLI22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言