無障礙功能樹狀結構

無障礙樹狀結構簡介

Alice Boxhall
Alice Boxhall
Dave Gash
Dave Gash
Meggin Kearney
Meggin Kearney

假設您要建構專為螢幕閱讀器使用者設計的使用者介面。在這裡,您完全不需要建立任何視覺 UI,只要提供足夠的資訊供螢幕閱讀器使用即可。

您要建立的是一種描述頁面結構的 API,類似於 DOM API,但您可以減少資訊和節點,因為許多資訊僅適用於視覺呈現。看起來可能像這樣。

螢幕閱讀器 DOM API 模擬

基本上,這就是瀏覽器實際向螢幕閱讀器呈現的內容。瀏覽器會擷取 DOM 樹狀結構,並將其修改為適合輔助技術使用的格式。我們將這個修改後的樹狀結構稱為「無障礙樹狀結構」。

您可以將無障礙樹狀結構想像成 90 年代的舊網頁:幾張圖片、許多連結,可能還有一個欄位和一個按鈕。

1990 年代風格的網頁

像這樣用視覺掃描網頁,就能獲得與螢幕閱讀器使用者類似的體驗。雖然有介面,但簡單直接,就像無障礙樹狀結構介面。

無障礙樹狀結構是大多數輔助技術互動的對象。流程大致如下。

  1. 應用程式 (瀏覽器或其他應用程式) 會透過 API,向輔助技術公開其 UI 的語意版本。
  2. 輔助技術可能會使用透過 API 讀取的資訊,為使用者建立替代的使用者介面。舉例來說,螢幕閱讀器會建立一個介面,讓使用者聽取應用程式的語音表示法。
  3. 輔助技術也可能允許使用者以不同方式與應用程式互動。舉例來說,大多數螢幕閱讀器都提供掛鉤,讓使用者輕鬆模擬滑鼠點擊或手指輕觸。
  4. 輔助技術會透過 Accessibility API,將使用者意圖 (例如「點擊」) 傳回應用程式。接著,應用程式會負責在原始 UI 的情境中適當解讀動作。

如果是網路瀏覽器,每個方向都會多一個步驟,因為瀏覽器實際上是網頁應用程式的平台,網頁應用程式會在瀏覽器中執行。因此,瀏覽器必須將網頁應用程式轉譯為無障礙樹狀結構,並確保根據輔助技術傳入的使用者動作,在 JavaScript 中觸發適當的事件。

但這完全是瀏覽器的責任。網頁程式開發人員的工作,就是瞭解這個過程,並開發利用這個過程的網頁,為使用者打造無障礙體驗。

為此,我們會確保正確表達網頁語意:確認網頁中的重要元素具有正確的無障礙角色、狀態和屬性,並指定無障礙元素名稱和說明。瀏覽器接著會允許輔助技術存取該資訊,打造自訂體驗。

原生 HTML 的語意

瀏覽器可以將 DOM 樹狀結構轉換為無障礙樹狀結構,因為 DOM 的大部分內容都具有「隱含」語意。也就是說,DOM 使用瀏覽器可辨識的原生 HTML 元素,且在各種平台上都能正常運作。因此,系統會自動處理原生 HTML 元素 (例如連結或按鈕) 的無障礙功能。只要編寫 HTML 來表達網頁元素的語意,就能善用這項內建無障礙功能。

不過,有時我們會使用看起來像原生元素,但實際上並非原生元素的元素。舉例來說,這個「按鈕」根本不是按鈕。

給我墨西哥夾餅

這項元素可以透過多種方式在 HTML 中建構,以下是其中一種方式。

<div class="button-ish">Give me tacos</div>

如果我們不使用實際的按鈕元素,螢幕閱讀器就無法得知其所在位置。此外,我們還必須額外新增 tabindex,才能讓僅使用鍵盤的使用者使用,因為以目前的程式碼來說,只能使用滑鼠。

只要使用一般 button 元素,而非 div,即可輕鬆修正這個問題。使用原生元素還有一個好處,就是可以處理鍵盤互動。請記住,您不必因為使用原生元素而失去精美的視覺效果;您可以設定原生元素的樣式,使其看起來符合您的需求,同時仍保留隱含的語意和行為。

我們在前面提過,螢幕閱讀器會朗讀元素的角色、名稱、狀態和值。使用正確的語意元素,即可涵蓋角色、狀態和值,但我們也必須確保元素名稱可供偵測。

名稱大致分為兩類:

  • 可見標籤:所有使用者都可使用,用於將意義與元素建立關聯。
  • 文字替代項目:僅在不需要視覺標籤時使用。

對於文字層級元素,我們不需要執行任何操作,因為根據定義,這類元素會包含一些文字內容。不過,對於輸入或控制項元素,以及圖片等視覺內容,我們必須確保指定名稱。事實上,為任何非文字內容提供替代文字,是 WebAIM 檢查清單的第一個項目。

其中一個方法是遵循「表單輸入內容具有相關聯的文字標籤」建議。將標籤與表單元素 (例如核取方塊) 建立關聯的方法有兩種。無論採用哪種方法,標籤文字也會成為核取方塊的點擊目標,這對滑鼠或觸控螢幕使用者也很有幫助。如要將標籤與元素建立關聯,請

  • 將輸入元素放在標籤元素中
<label>
    <input type="checkbox">Receive promotional offers?
</label>

或

  • 使用標籤的 for 屬性,並參照元素的 id
<input id="promo" type="checkbox">
<label for="promo">Receive promotional offers?</label>

正確標示核取方塊後,螢幕閱讀器就能回報該元素具有核取方塊角色、處於勾選狀態,且名稱為「接收促銷優惠?」。

VoiceOver 的螢幕文字輸出,顯示核取方塊的語音標籤