跳到主要內容

Switch

Demo 與 Accessibility Tree

通知方式

變更後立即生效,不需要另外送出。

Accessibility Tree

觀察對象:外層的開關群組。

元素目前不在無障礙樹中。

Accessibility Tree

觀察對象:第一個開關。

元素目前不在無障礙樹中。

鍵盤操作

按鍵行為
Space切換開與關。底層是原生 <input type=checkbox>,這個行為由平台提供,不需要自行綁定。
Tab逐一移入每個開關。開關之間不是互斥選項,所以不像 Radio Group 那樣整組只佔一個停留點。

ARIA 屬性

屬性值用途
roleswitch底層是 <input type=checkbox>,補上這個角色才會被唸成「開關,開啟」而不是「核取方塊,已勾選」。差別在於語意:開關改的是當下的狀態,核取方塊是待送出的選擇。
checkedtrue / false開關狀態。原生 checkbox 的勾選狀態存在 DOM property 上,瀏覽器直接把它映射進無障礙樹,不需要另外寫 aria-checked。若改用 <div role=switch> 實作,就得自己維護 aria-checked。
aria-pressed(不使用)這是 Toggle Button 的屬性,不屬於 Switch。兩者都有開關的意思,但一個元素只能有一種角色 —— 同時標上會讓輔助科技唸出互相矛盾的狀態。
role(群組)group多個開關構成一組時需要容器與名稱。這裡用 <fieldset> + <legend>,隱含角色就是 group,legend 直接成為它的無障礙名稱,不必自己接 aria-labelledby。
aria-describedby補充說明的 id「變更後立即生效」是整組共通的規則,所以掛在群組上而不是每個開關上。掛在個別開關會讓同一句話被唸三次。
aria-hiddentrue軌道與滑塊是純視覺,狀態已由 checked 表達。原生 input 本身以 appearance-none 隱藏外觀,但仍留在無障礙樹與 Tab 順序裡。

WCAG 對應

  • 三個開關包在 <fieldset> 內,「它們是一組」這件事程式判斷得出來,不只靠視覺上的靠近。

  • 等級 A2.1.1 鍵盤

    空白鍵即可切換,不需要滑鼠。

  • 聚焦時軌道外圍出現橘色 focus ring。原生外觀被隱藏後,焦點樣式必須自己補回來。

  • 切換開關會立即改變設定,這正是 Switch 的語意;使用者從角色與標籤就能預期這件事。

  • 每個開關具備 switch 角色、來自 label 的名稱,以及反映開關狀態的值;群組本身也有名稱。

APG 規則

  • 元件語意

    開關在 accessibility tree 中呈現 switch 角色

    Switch 元素在 accessibility tree 中的計算角色為 switch;若以 HTML input[type=checkbox] 實作 Switch,也會呈現 role=switch。

  • 元件語意

    開關具有無障礙名稱

    開關的無障礙名稱來自其文字內容、aria-labelledby 或 aria-label。

  • 元件語意

    開關正確呈現開啟與關閉狀態

    開啟的 Switch 呈現 aria-checked=true,關閉的 Switch 呈現 aria-checked=false;若以 checkbox 輸入元件實作 Switch,則以其 checked 狀態表示。

  • 元件語意

    開關群組具有無障礙名稱

    若多個開關構成同一群組,使用有名稱的 role=group,或使用 fieldset 與 legend 標示群組。

  • 頁面結構

    開關或開關群組具有無障礙補充說明

    若開關或開關群組有補充說明,對應元素的 aria-describedby 指向包含該補充說明的元素。

  • 鍵盤操作

    開關可用 Space 切換狀態

    當焦點位於開關時,按 Space 會切換其狀態。

  • 鍵盤操作選做

    開關可用 Enter 切換狀態

    當焦點位於開關時,按 Enter 會切換其狀態。

  • 一致的識別、導覽與行為

    開關切換狀態時標籤保持不變

    Switch 在開啟與關閉狀態之間切換時,其標籤不會改變。