Ramp
一鍵掃出網頁的 WCAG 無障礙問題,以繁體中文說明成因與修法、對應台灣「網站無障礙規範」——還讓不會操作報讀軟體的開發者,「看見」NVDA 會怎麼念你的網頁。
無障礙檢測工具很多,講台灣規範的很少
網頁無障礙的自動化檢測工具其實不缺——但它們幾乎都說英文、對應的是 WCAG 條號。台灣開發者實際面對的,是行政院訂定的「網站無障礙規範」:有自己的準則編號、A / AA / AAA 檢測等級與官方檢測碼,還正處於 110.07 版與 115 年修正版的新舊版過渡期。查一條違規,往往要在英文報告、WCAG 原文與台灣規範 PDF 之間來回對照。
另一個更根本的斷層是:多數開發者沒用過報讀軟體。就算工具告訴你「缺少替代文字」,你還是很難想像視障使用者實際「聽到」的網頁長什麼樣子。
Ramp 把這兩個斷層接起來:繁中解說直接對應台灣準則,並模擬出 NVDA 會怎麼念出你的頁面——讓看得見的人,也能「看見」聽出來的網頁。Ramp 掃描的是 JavaScript 執行後的實際 DOM,登入後的頁面天然支援;點擊任何受影響元素,會在原網頁上高亮定位並自動捲過去。工具本身也以 AA 標準要求自己:深色模式下所有文字對比維持 ≥ 4.5:1、動畫尊重使用者的減少動態效果設定。
三種預覽,模擬報讀軟體的視角
報讀預覽
每個受影響元素下方,顯示 NVDA 會怎麼念它——名稱+角色+值+狀態+集合位置+描述+表格座標,如「音量 滑桿 『30』」「關於我們 清單項目 6 之 2」。用詞逐條校對自 NVDA 官方正體中文翻譯。
朗讀順序
把整頁線性化成 NVDA 實際念出的先後順序,標出地標與表格的進入/離開邊界,並偵測「順序落差」——畫面由左到右、朗讀卻相反的 WCAG 1.3.2 問題(flex order、float:right、RTL…)。
動態播報
以 MutationObserver 監看即時區域(aria-live、role=alert…),表單錯誤、儲存提示等動態變化發生時,NVDA 會自動播報的內容依時間軸列出,並標示打斷/依序的優先度。
幾個值得一提的技術決定
模擬報讀,用「真的 NVDA」驗證
報讀預覽如果念錯,比沒有更糟。Ramp 以 Guidepup 驅動真實 NVDA 走過測試頁、擷取實際語音,與模擬結果並排比對——Tab 走訪與瀏覽模式逐行兩種模式皆驗證吻合,過程中抓出並修正 6 個與真實播報的用詞落差(編輯區、功能表按鈕、表格語序、進度值、清單項目數、地標後綴)。v2.0 再做一輪,規則是凡涉及 NVDA 行為的修正,先讓真 NVDA 跑出事實再改:動態播報 9 個情境逐一比對「念了幾次」全數一致,並依真機結果修正 SVG 圖表的命名、排版用表格(role="presentation")誤念「表格有 N 列」等落差。名稱計算則直接複用 axe 的 accessible name 引擎,不自己重造。
對應台灣規範,含新舊版過渡期
自建 axe 規則 → 台灣準則的對應表:73 條對應條目(72 條實際的 axe 規則,另含 2.4.7「焦點可視」的文件性條目),涵蓋 27 條成功準則、其中可自動化檢測的 26 條;34 條標示官方檢測碼、可與官方工具 Freego 逐碼對照。規範正值交替:4.1.1「語法分析」現行版有、115 年修正版刪除(Ramp 因此重新啟用 axe 已預設停用的 duplicate-id 規則);2.5.8「目標尺寸」則是新版新增。兩版差異都在結果中附註說明,並排好了生效日當天的版本切換待辦。
權限最小化:不要求「所有網站」
只用 activeTab(點圖示才臨時取得當前分頁)、scripting(注入 axe)與 storage(掃描結果放 session 快取、關瀏覽器即清除;偏好設定與人工複核自評存在本機,最多保留最近 200 個網址,移除擴充功能即一併清除)。所有資料只存在你的瀏覽器、所有檢測在本機完成,不傳送任何資料到外部伺服器——一個檢查別人網站隱私問題的工具,自己得先站得住腳。v2.0 起這份承諾有測試守著:manifest 多出任何一項權限,CI 就紅燈。
誠實呈現,不灌水數字
axe 的純最佳實務規則獨立顯示為「建議」、不計入違規;無法自動判定的項目標示「需人工複核」,可逐項自評通過/不通過並納入報告。頁面與報告都明講:自動化檢測僅能涵蓋約三到四成的無障礙問題,檢測結果不等同官方標章。
順序落差偵測:寧可少報,不要誤報
朗讀順序與視覺順序的比對,用「同一視覺列以 top 分帶、列內以 left 排序」找出同列水平反序——刻意只做這種高信心、低誤報的判定;多欄版面的跨欄閱讀順序與純垂直重排暫不標示。檢測工具喊「狼來了」一次,開發者就不再信它了。
三層測試:單元、端對端、真實報讀
131 項單元測試以 jsdom 秒級驗證 scanner 與共用模組的純函式(NVDA 值/狀態/表格、地標判定、落差偵測、對應表完整性),另有 13 項 popup 靜態無障礙契約與 76 項 CLI 測試;54 項端對端測試啟動獨立 Chrome 跑完整流程;最上層是 Guidepup 驅動真 NVDA 的對照驗證。另備一頁故意塞滿已知違規的測試素材頁,覆蓋對應表的每一條規則。v2.0 再用變異測試驗測試本身:把關鍵修正故意改壞 46 處,測試抓到 45 處。
從一鍵掃描到可交付的報告
| 分級檢測 | 違規依 A / AA / AAA 等級分組、同組依嚴重度排序;頂部統計列一眼看懂全貌;目標等級預設 AA,超出目標的項目獨立分組不干擾。 |
| 繁中解說 | 每項問題附「為什麼是障礙」與「如何修正」,標示台灣準則編號、四大原則類別與影響程度;內建 axe 官方 zh_TW 語言包,未對應的規則也以繁中顯示。 |
| 高亮定位 | 點擊受影響元素,在原網頁高亮並自動捲動過去(尊重減少動態效果設定)。 |
| 人工複核自評 | 需人工複核項目可逐項標記通過/不通過,依網址持久保存(最多保留最近 200 個網址,存不進去會提示)並納入報告——對應官方自我評量流程。 |
| 匯出報告 | 一鍵下載自包含 HTML 檢測報告(統計、全部問題、限制聲明),開瀏覽器即讀、列印即轉 PDF;34 條規則標官方檢測碼,可與 Freego 逐碼對照。 |
| 順手體驗 | 結果快取(popup 重開自動還原)、深色模式、掃描前延遲(應付動畫與延遲載入)、鍵盤快捷鍵 Ctrl+Shift+U、受保護頁面的明確繁中錯誤提示。 |
擴充套件掃一頁,CLI 掃整個網站
擴充套件適合開發時邊改邊看;要稽核整個網站,同一套「規則 → 台灣準則」的對應核心另外包成本機 CLI cornhsu-ramp-scan(npm),對每一頁跑與擴充套件完全相同的掃描與繁中轉譯,彙整成全站報告(結構化 JSON + 自包含 HTML:全站摘要、最常見障礙、逐頁明細)。兩邊共用同一份對應模組——核心寫一次、兩處複用,不會各自漂移。
$ npx cornhsu-ramp-scan https://example.com --depth 2 --format html # 同源爬掃,深度 2 $ npx cornhsu-ramp-scan --url-list url_inventory.csv # 掃 PolyMigrate 盤點出的網址清單 $ npx cornhsu-ramp-scan https://example.com --fail-on violations # 有違規就 exit 3,直接當 CI 門檻
| 離開碼契約 | 0 掃描完成、1 參數錯誤(打錯旗標、清單檔不存在、網址全被篩掉——都在開 Chrome 之前就擋下)、2 掃描錯誤(含多頁模式全部失敗)、3 --fail-on 觸發。--fail-on violations 只算目標等級內、已對應台灣準則的違規,最佳實務建議不會讓 CI 紅燈——CI 不能假綠燈,也不能亂紅燈。 |
| 掃得動政府網站 | 嚴格 CSP 的頁面(政府網站常見)以前會吐出看不懂的錯誤,v2.0 起正常掃描。 |
| 與 PolyMigrate 橋接 | --url-list 直接吃 PolyMigrate 產出的 url_inventory.csv;清單帶語言欄時另出逐語言彙整——搬遷完的多語站,中文版與英文版的無障礙可以分開看。 |
| 使用倫理 | 爬掃會對目標網站送出實際請求:預設循序、每頁間隔 250ms,--delay/--concurrency/--max-pages 控制負載。只掃自己或已獲授權的網站。 |
跨在新舊規範交界上
台灣「網站無障礙規範」正處於過渡期,Ramp 同時對應兩版,差異條目在結果與報告中附註說明:
| 版本 | 對齊 | 成功準則 | 適用期間 |
|---|---|---|---|
| 110.07 版 | WCAG 2.1 | 78 條 | 現行,至 2026-11-29 |
| 115 年修正版 | WCAG 2.2 | 87 項(新增 9 條;4.1.1 保留編號、標示刪除,實際適用 86 條) | 2026-11-30 起生效 |
限制聲明,也是產品的一部分
自動化檢測僅能涵蓋約三到四成的無障礙問題——鍵盤動線、報讀實際體驗、內容語意仍須人工複核;檢測結果不等同任何官方無障礙標章。這些話直接寫在工具與報告裡:一個檢測工具的可信度,來自它誠實說出自己測不到什麼。
一套對應核心,擴充套件與 CLI 共用
| 平台 | Chrome / Edge 擴充套件 · Manifest V3(僅 activeTab / scripting / storage 三項權限,有測試守著) |
| 全站 CLI | cornhsu-ramp-scan(npm)· Node.js 22.12+ + Puppeteer 驅動本機 Chrome · 與擴充套件共用對應核心 · JSON/HTML 報告 · 離開碼契約與 --fail-on |
| 檢測引擎 | axe-core v4.10.3(MPL-2.0,本地打包)+ 官方 zh_TW 語言包 |
| 規範對應 | 自建對應表:73 條對應條目(72 條 axe 規則)→ 台灣「網站無障礙規範」27 條準則(110.07 / 115 年修正版)· 34 條官方檢測碼 |
| 報讀模擬 | axe accessible name 引擎 + 校對自 NVDA 官方 zh_TW 翻譯的用詞對照表 · Guidepup 驅動真實 NVDA 驗證 |
| 測試 | 131 項單元(jsdom)· 13 項 popup 無障礙契約 · 76 項 CLI · 54 項端對端(獨立 Chrome)· 真實 NVDA 雙模式+動態播報對照 · 變異測試 46 抓 45 |
| 隱私 | 全程本機檢測 · 不外傳資料 · 掃描結果 session 快取(關閉瀏覽器即清除)· 偏好與自評存本機(最多 200 個網址) |
Chrome 與 Edge 皆適用。安裝後開啟任一網頁,點擊工具列的 Ramp 圖示(或按 Ctrl+Shift+U)→「開始檢測」。所有檢測都在你的瀏覽器本機完成。要掃整個網站:npx cornhsu-ramp-scan <網址>(需 Node.js 22.12 以上與本機 Chrome)。