先講清楚為什麼公部門網站要做無障礙:因為有規範要求。
它不是「做了比較好」的那種事,是「該做而沒做會被檢核」的事。而且和網站上其他工作不一樣——文案寫得好不好見仁見智,版面漂不漂亮各有各的看法,無障礙有客觀標準,而且有工具會直接告訴你過還是不過。
對我來說,這反而是最好處理的一類工作。因為驗收標準不是我說了算。
我負責的那個單位網站,是用 Gemini 協助處理無障礙的,它的工作是直接改 code——不是產出一份「你應該注意這些」的建議清單,是實際動到 HTML 和樣式。
結果是這個網站通過了 AA 等級的無障礙檢測,首頁頁尾現在掛著數位發展部的標章。
寫這篇之前,我把網站抓下來重新掃過。不是為了炫耀成績,是因為標章是某一個時間點的狀態,而網站每天都在新增內容——現在的它還合格嗎?
我掃了五個頁面:首頁、教育資源、最新消息、一則公告內頁,還有一個功能頁。
| 檢查項目 | 結果 |
|---|---|
網頁語言標示(lang) |
五頁全部是 zh-Hant-TW ✓ |
圖片替代文字(alt) |
17 張圖,沒有一張缺 ✓ |
| 標題階層 | 沒有跳號(不會出現 h2 直接跳到 h4) ✓ |
| 連結文字 | 198 個連結,沒有一個是「更多」「點此」這種讀了也不知道去哪的 ✓ |
| iframe 標題 | 沒有缺漏 ✓ |
| 跳到主要內容 | 有 ✓ |
五個頁面加起來,只找到 2 個異常。
那兩個在其中一個列表頁上,長這樣:一個 <a> 標籤,沒有 href,裡面包著一張圖片。(我後來又掃過一次,同樣型態的異常出現在另一個列表頁——所以它不是某一頁的問題,是同一種模組到處都會生出來的東西。)
嚴格說它不算錯——沒有 href 的 <a> 不是連結,不會被鍵盤走到,而且裡面的圖片有完整的替代文字。但它就是不乾淨。
重點是:這不是我寫的,也不是 Gemini 寫的。
Day 14 講過那套後台的脾氣,這裡是它另一個影響:很多 HTML 不是人手打的,是後台模組根據你填的資料自動生出來的——你在後台上傳一張圖、填一段文字,它就照自己的模板吐出一段 HTML。那段模板長什麼樣,不在我能改的範圍。
所以這件事的真相是:我能改的是自訂樣式和自訂腳本,以及各區塊裡我填進去的內容;模板本身動不了。
這是所有用校方 CMS 的人都會撞到的同一堵牆。能做的是在可控的範圍內做到最好,並且知道剩下的問題是什麼、為什麼不能改——而不是假裝它們不存在。
無障礙的工作可以拆成三段,AI 在每一段的價值差很多:
第一段:找出問題在哪。 這段自動化工具就能做,AI 不是必要的。
第二段:實際改 code。 這段是 Gemini 幫我做的,也是它價值最高的地方——因為問題數量多、每一個都是小修改(補一個 alt、調一個標題層級、給連結一個看得懂的名字),而且改法有標準答案。這種「量大、單筆簡單、有正確答案」的工作,正是可以交出去的典型。
第三段:判斷哪些不能改、哪些改了會壞。 這段還是得我自己來。模板生出來的東西改不動、有些調整會影響版面、有些替代文字得懂這張圖在講什麼才寫得出來——這些需要知道整個網站的來龍去脈。
寫到這裡要停下來講清楚界線,不然這篇會變成業配:
一、我沒有「改之前」的數據。 我掃的是現況,很漂亮,但我拿不出「原本有 87 個問題、改完剩 2 個」這種對照——因為當時沒有留下掃描紀錄。這是我的疏失,也是給你的提醒:要證明改善,得先留下改善前的樣子。
二、標章本身我沒能獨立驗證。 網站上掛著連到數位發展部的標章連結,但我要抓那個頁面時被擋掉了(回 403),發稿當天再試一次還是一樣。所以「已通過 AA」這件事,我目前的依據是網站自己的標示,不是我從官方系統確認的。
還有一個限制:我掃的是靜態 HTML——也就是伺服器一開始就送過來的那份原始檔。有些內容是網頁打開後才由 JavaScript(在瀏覽器裡跑的程式)現場生出來的,那部分我這次沒有涵蓋到。
一、標章不是終點,是某一天的快照。 網站每天在加新公告、新圖片,只要有人上傳圖片時忘了填替代文字,合格狀態就開始鬆動。所以我做的這件事——回頭重新掃一次——才是真正該固定下來的動作。
寫這篇的當天我又掃了一次首頁,結果跟三週前完全一樣:3 張圖全部有替代文字、49 個連結沒有一個沒有目的地、標題層級 1 個 h1/4 個 h2/16 個 h3 沒有跳號、3 個內嵌框架都有標題。沒有退化——但我知道這句話的有效期限只到下一個人上傳圖片為止。
二、要交出去的工作,挑「有標準答案」的那種。 補 alt、修標題階層這類工作之所以適合交給 AI,不是因為它多聰明,是因為對錯很明確、而且可以逐條驗。
三、講清楚哪些做不到。 那兩個空的 <a> 我沒有修掉,因為我改不動。與其宣稱全部完美,不如說明它是什麼、為什麼留著、影響是什麼。
Day 17:活動報到系統——手機掃 QR、大螢幕即時顯示,以及我為什麼從 Apps Script 換到 Firebase。