網頁程式開發人員適用的無障礙功能

改善無障礙功能可讓所有使用者更容易使用網站。

Addy Osmani
Addy Osmani

請務必打造包容性網站,讓所有人都能存取。您至少可以針對下列六個主要身心障礙進行最佳化調整:視覺聽覺行動能力認知能力語言能力神經系統。即使您對網站無障礙設計一無所知,也有很多工具和資源可供您參考。

有超過 10 億人患有某種形式的身心障礙。

為了提供無障礙體驗,網站必須支援多種裝置,包括不同螢幕尺寸和不同類型的輸入方式 (例如螢幕閱讀器)。此外,網站應可供最廣泛的使用者群體使用,包括身心障礙人士。

以下列舉使用者可能有的幾種障礙:

Vision 聽力 機動性
  • 低視能
  • 視障課程
  • 色盲
  • 白內障
  • 太陽眩光
  • 聽障
  • 聽障課程
  • 噪音
  • 耳部感染
  • 脊髓損傷
  • 靈活度受限
  • 雙手騰不開
認知 語音 Neural
  • 學習障礙
  • 想睡或分心
  • 偏頭痛
  • 自閉症
  • 癲癇
  • 環境音
  • 喉嚨痛
  • 口吃
  • 無法說話
  • 憂鬱症
  • PTSD
  • 躁鬱症
  • 焦慮

視覺問題包括無法分辨顏色,甚至完全看不見。

  • 確保文字內容符合最低對比度門檻
  • 避免僅使用顏色傳達資訊,並確保所有文字都能調整大小
  • 確保所有使用者介面元件都能搭配輔助技術使用,例如螢幕閱讀器、放大鏡和點字顯示器。這項作業需要確保 UI 元件已標示,以便無障礙 API 以程式輔助方式判斷任何元素的角色狀態標題

Chrome 開發人員工具「檢查元素」工具提示的螢幕截圖。

我本身有視力障礙,經常會將網站、DevTools 和終端機放大。雖然開發人員幾乎不會將支援縮放列為優先事項,但這對我這類使用者來說,卻是相當重要的功能。

「聽力問題」:使用者可能無法聽見網頁發出的聲音。

ChromeVox 螢幕閱讀器朗讀網頁的螢幕截圖。

行動不便問題包括無法操作滑鼠、鍵盤或觸控螢幕。

  • 針對使用者介面元件內容,讓使用者可以透過鍵盤存取功能執行任何原本需要使用滑鼠的動作。
  • 請確認網頁已正確標示輔助技術,包括螢幕閱讀器、語音控制軟體和實體切換控制項,這些技術通常會使用相同的 API。

認知問題是指使用者可能需要輔助技術協助閱讀文字,因此請務必提供文字替代內容。

  • 使用動畫時請謹慎為之。避免使用重複或閃爍的影片和動畫,這可能會對部分使用者造成問題

    prefers-reduced-motion CSS 媒體查詢可讓您針對偏好減少動態效果的使用者,限制動畫和自動播放的影片:

    /*
    If the user expresses a preference for reduced motion, don't use animations on buttons.
    */
    @media (prefers-reduced-motion: reduce) {
      button {
        animation: none;
      }
    }
    
  • 避免以時間為依據的互動。

這似乎涵蓋了許多基礎知識,但我們會逐步說明如何評估及改善 UI 元件的無障礙性。

為提供額外的視覺支援,英國政府網站無障礙團隊製作了一系列無障礙事項的數位海報,您可以用來與團隊分享最佳做法。

數位海報:顯示無障礙設計的建議做法和禁止事項。
六張海報,列出無障礙功能最佳做法。閱讀全文

評估 UI 元件無障礙功能

檢查網頁的 UI 元件是否符合無障礙標準時,請問自己以下問題:

  • 您是否可以只使用鍵盤使用 UI 元件?

    元件是否會管理焦點並避免焦點陷阱?是否可以回應適當的鍵盤事件?

  • 您可以使用螢幕閱讀器搭配 UI 元件嗎?

    您是否已為任何視覺呈現的資訊提供文字替代?您是否已使用 ARIA 新增語義資訊?

  • 您的 UI 元件是否能在沒有聲音的情況下運作?

    關閉音箱,並測試你的用途。

  • 您的 UI 元件是否能在沒有顏色的情況下運作?

    請確認您的 UI 元件可供色盲人士使用。Colorblindly 是 Chrome 擴充功能,可用來模擬色盲。(試試所有四種色盲模擬功能)。 你或許也會對 Daltonize 擴充功能感興趣,這項工具同樣實用。

  • 您的 UI 元件是否可在啟用高對比模式時運作?

    所有現代作業系統都支援高對比模式。高對比 是可協助你解決這個問題的 Chrome 擴充功能。

標準化控制項 (例如 <button><select>) 在瀏覽器中內建無障礙功能。可使用 Tab 鍵將焦點設為焦點;可回應鍵盤事件 (例如 EnterSpace 和方向鍵);且具有無障礙工具使用的語意角色、狀態和屬性。其預設樣式也應符合上述無障礙規定。

自訂 UI 元件 (除了擴充標準元素 (例如 <button>) 的元件) 沒有任何內建功能,包括無障礙功能,因此您需要提供這些功能。實作無障礙功能時,建議您先將元件與類似的標準元素 (或多個標準元素的組合,視元件的複雜度而定) 進行比較。

大多數瀏覽器開發人員工具都支援檢查網頁的無障礙樹狀結構。在 Chrome 開發人員工具中,這項功能位於「元素」面板的「無障礙」分頁中。

Chrome 開發人員工具中的無障礙樹狀檢視畫面螢幕截圖。

Firefox 也有無障礙面板。

Firefox 開發人員工具中的無障礙樹狀檢視畫面螢幕截圖。

Safari 會在「Elements」面板的「Node」分頁中提供無障礙資訊。

以下是嘗試讓 UI 元件更容易存取時,可以問自己的問題清單。

改善鍵盤焦點

理想情況下,請確保可透過鍵盤存取 UI 元件中的所有功能。設計使用者體驗時,請思考如何只使用鍵盤使用元素,並找出一致的鍵盤互動方式。

首先,請確保每個元件都有合理的焦點目標。舉例來說,選單等複雜元件可能是頁面中的一個焦點目標,但應自行管理焦點,以便讓有效的選單項目始終獲得焦點。

需要焦點管理的選單和子選單螢幕截圖。
在複雜元素中管理焦點。

使用 tabindex

您可以使用 tabindex 屬性,為元素和 UI 元件新增鍵盤焦點。使用者若只使用鍵盤或輔助技術,就必須能夠將鍵盤焦點放在元素上,以便與元素互動。

內建互動元素 (例如 <button>) 可隱含聚焦,因此除非您需要變更其在分頁順序中的順序,否則不需要 tabindex 屬性。

tabindex 值分為三種類型:

  • tabindex="0" 是最常見的選項,可將元素放在自然的索引標籤順序 (由 DOM 順序定義) 中。
  • tabindex 值等於 -1 會導致元素可透過程式設計取得焦點,但不會出現在分頁順序中。
  • 如果 tabindex 值大於 0,元素就會採用手動分頁順序。網頁中所有具有正 tabindex 值的元素,會依數字順序進行檢查,而非自然分頁順序。

請參閱「使用 tabindex」一文,瞭解 tabindex 的部分用途。

請務必確保焦點一律可見,無論是使用預設焦點環樣式,還是套用可辨識的自訂焦點樣式皆然。請注意,請勿限制鍵盤使用者,他們應該可以只使用鍵盤將焦點移離元素。

使用自動對焦功能

HTML autofocus 屬性可讓作者指定特定元素應在網頁載入時自動取得焦點。autofocus 已支援所有網頁表單控制項,包括按鈕。如要自動對焦您自訂 UI 元件中的元素,請呼叫 focus() 方法,此方法支援所有可聚焦的 HTML 元素 (例如 document.querySelector('myButton').focus())。

新增鍵盤互動

當 UI 元件可聚焦時,請處理適當的鍵盤事件,在元件聚焦時提供良好的鍵盤互動情境。舉例來說,您可以允許使用者使用方向鍵選取選單選項,並使用 SpaceEnter 啟用按鈕。ARIA 設計模式指南提供相關指引。

最後,請確認您的鍵盤快速鍵可供使用者輕鬆找到。常見做法是提供鍵盤快速鍵說明 (畫面上的文字),讓使用者瞭解有哪些快速鍵。例如「按下 ? 鍵盤快速鍵。」或者,您也可以使用提示 (例如工具提示) 向使用者說明捷徑。

管理焦點的重要性不言可喻。其中一個重要的例子就是導覽匣。如果您在頁面中新增 UI 元件,就必須將焦點直接導向該元件;否則,使用者可能必須在整個頁面中按下 Tab 鍵才能找到該元件。這可能會讓使用者感到困擾,因此請務必測試頁面中所有可透過鍵盤導覽的元件。

WalkMe 狀態切換測試。
// Example for expanding and collapsing a category with the Space key
const category = await page.$(`.category`);

// verify tabIndex, role and focus
expect(await page.evaluate(elem => elem.getAttribute(`role`), category)).toEqual(`button`);
expect(await page.evaluate(elem => elem.getAttribute(`tabindex`), category)).toEqual(`0`);
expect(await page.evaluate(elem => window.document.activeElement === elem, category)).toEqual(true);

// verify aria-expanded = false
expect(await page.evaluate(elem => elem.getAttribute(`aria-expanded`), category)).toEqual(`false`);

// toggle category by pressing Space
await page.keyboard.press('Space');

// verify aria-expanded = true
expect(await page.evaluate(elem => elem.getAttribute(`aria-expanded`), category)).toEqual(`true`);

確保螢幕閱讀器可順利使用

約 1% 至 2% 的使用者會使用螢幕閱讀器。您能否只使用螢幕閱讀器和鍵盤,瞭解所有重要資訊並與元件互動?

下列問題可協助您解決螢幕閱讀器無障礙問題。

所有元件和圖片是否都有有意義的替代文字?

凡是透過視覺方式傳達互動元件名稱用途的資訊時,請提供無障礙的文字替代內容。

舉例來說,如果 <fancy-menu> UI 元件只顯示齒輪圖示,用來表示這是設定選單,就需要提供可供存取的文字替代項目,例如「設定」等,以便傳達相同資訊。視情況而定,您可以使用 alt 屬性、aria-label 屬性、aria-labelledby 屬性,或 Shadow DOM 中的純文字,提供文字替代內容。如需一般技術提示,請參閱 WebAIM 快速參考指南

任何顯示圖片的 UI 元件都應提供機制,以便為該圖片提供替代文字,類似於 alt 屬性。

您的元件是否提供語意資訊?

輔助技術會傳達語意資訊,以便透過視覺提示 (例如格式、游標樣式或位置) 向視障使用者表達資訊。標準化元素內建瀏覽器的語義資訊,但自訂元件需要使用 ARIA 新增資訊。

一般來說,任何監聽滑鼠點擊或懸停事件的元件都應具備某種鍵盤事件監聽器 ARIA 角色,也可能具備 ARIA 狀態和屬性。

舉例來說,自訂 <fancy-slider> UI 元件可能會採用 ARIA 角色的滑桿,該角色具有一些相關的 ARIA 屬性:aria-valuenowaria-valueminaria-valuemax。您可以將這些屬性繫結至自訂元件中的相關屬性,讓輔助技術使用者與元素互動、變更元素的值,甚至讓元素的視覺呈現方式隨之變更。

滑桿的螢幕截圖。
範圍滑桿元件。
<fancy-slider role="slider" aria-valuemin="1" aria-valuemax="5" aria-valuenow="2.5">
</fancy-slider>

使用者是否能不必依賴顏色就能理解所有內容?

顏色不應是傳達資訊的唯一方式,例如表示狀態、提示使用者回應,或以視覺化方式呈現資料。舉例來說,如果您使用圓餅圖,請為每個切片提供標籤和值,讓視障使用者即使看不到切片的起點和終點,也能理解資訊:

圓餅圖含有標籤和值,可確保無障礙存取。
無障礙圓餅圖。(摘自 W3C 網頁無障礙設計計畫)。

對比度是否足夠?

元件中顯示的任何文字內容都應符合 WCAG AA 級別最小對比度門檻。建議提供符合更高的 AAA 門檻的高對比主題,並確保在使用者需要自訂對比或不同顏色時,可套用使用者代理程式樣式表單。您可以在設計元件時使用這項顏色對比度檢查工具

移動或閃爍的內容是否可以停止播放且安全無虞?

使用者應可暫停、停止或隱藏移動、捲動或閃爍超過五秒的內容。一般來說,請避免使用閃爍內容。

如果必須閃爍,請確保每秒閃爍次數不超過三次。

無障礙工具和測試

有超過 100 種工具可用來評估網站和其元件的無障礙性。有些工具是自動化的,有些則需要手動測試。

以下提供幾個建議:

  • Axe 可為您選擇的架構或瀏覽器提供自動無障礙程度測試。Axe Puppeteer 可用於編寫自動化無障礙測試。
  • Lighthouse 無障礙功能稽核功能可提供實用的洞察資料,協助您找出常見的無障礙功能問題。無障礙分數是根據 Axe 使用者影響評估,對所有無障礙稽核結果加權平均後得到的值。如要透過持續整合監控無障礙功能,請參閱 Lighthouse CI

    Lighthouse 無障礙稽核的螢幕截圖。

  • Tenon.io 可用於測試常見的無障礙功能問題。Tenon 提供強大的整合支援功能,涵蓋建構工具、瀏覽器 (透過擴充功能),甚至是文字編輯器。

  • 許多程式庫和架構專屬工具可用來找出元件的無障礙問題。例如,使用 eslint-plugin-jsx-a11y 醒目顯示編輯器中 React 元件的無障礙問題。

    螢幕截圖:程式碼編輯器中,由 eslint-plugin-jsx-a11y 標示的無障礙問題。

    如果您使用的是 Angular,codelyzer 也會提供編輯器內的無障礙稽核功能:

    程式碼編輯器的螢幕截圖,其中有由 Codelyzer 標示的無障礙問題。

使用輔助技術

  • 您可以使用輔助工具檢查器 (Mac) 或 Windows Automation API 測試工具AccProbe (Windows),檢查輔助技術查看網頁內容的方式。您也可以前往 about://accessibility,查看 Chrome 建立的完整無障礙樹狀結構。
  • 如要測試 Mac 上的螢幕閱讀器支援功能,最好的方法就是使用 VoiceOver 公用程式。使用 ⌘F5 啟用或停用,使用 Ctrl+Option ←→ 瀏覽頁面,並使用 Ctrl+Shift+Option + ↑↓ 在無障礙樹狀結構中上下移動。如需詳細操作說明,請參閱完整的 VoiceOver 指令清單VoiceOver Web 指令清單
  • 在 Windows 上,NVDA 是一款免費的開放原始碼螢幕閱讀器。不過,對於視障使用者來說,這類應用程式需要花費大量時間學習。

    ChromeLens 的螢幕截圖。

  • ChromeOS 內建螢幕閱讀器

我們仍有許多進步空間,以改善網站的無障礙性。根據網站年鑑

  • 每 5 個網站中有 4 個的文字會與背景融合,導致無法閱讀。
  • 49.91% 的網頁仍未為部分圖片提供 alt 屬性。
  • 只有 24% 使用按鈕或連結的網頁包含標籤。
  • 只有 22.33% 的網頁為所有表單輸入欄位提供標籤。

我們可以做很多事,打造更容易取得的體驗,讓所有人都能享有這項服務。