專注

根據預設,互動式元素 (包括表單控制項連結和按鈕) 可聚焦並可使用 Tab 鍵瀏覽。可使用 Tab 鍵瀏覽的元素屬於文件的循序焦點導覽順序。其他元素則為惰性,也就是無法互動。使用 HTML 屬性,可以讓互動式元素處於閒置狀態,也可以讓閒置元素具有互動性。

根據預設,導覽焦點順序與視覺順序相同,也就是原始碼順序。HTML 屬性可以變更這個順序,CSS 屬性則可以變更內容的視覺順序。使用 HTML 變更分頁順序,或使用 CSS 變更視覺算繪順序,都可能導致使用者體驗不佳。

請勿使用 CSS 和 HTML 改變實際和預期的 Tab 鍵順序。如下列兩個範例所示,如果索引標籤順序與視覺上預期的順序不同,使用者會感到困惑,使用者體驗也會變差。

在本例中,tabindex 屬性的值會導致分頁順序混亂:

在這個範例中,CSS 造成分頁順序與內容的視覺順序不一致:

flex-flow: row-reverse; 聲明已反轉視覺順序。 此外,CSS order 屬性已套用至第六個字「This」,因此該字在視覺上會移動。分頁順序是程式碼的順序,不再與視覺順序相符,導致鍵盤使用者無法順利操作。

讓惰性元素可互動

contenteditabletabindex 屬性是全域屬性,可新增至任何元素,讓元素在過程中可聚焦。可聚焦元素也可以透過滑鼠或指標聚焦,方法是設定 autofocus 屬性,或是使用指令碼 (例如 element.focus())。

tabindex 屬性

屬性中導入的全域 tabindex 屬性可讓原本無法接收焦點的元素取得焦點 (通常是透過 Tab 鍵),因此得名。

tabindex 屬性的值為整數。負值會讓元素可聚焦,但無法使用 Tab 鍵選取。tabindex 值為 0 時,元素會變成可聚焦和可使用 Tab 鍵瀏覽的元素,並將套用該值的元素新增至來源程式碼順序的循序焦點導覽順序。值為 1 以上時,元素會變成可聚焦和可使用 Tab 鍵瀏覽,但會加入優先順序較高的 Tab 鍵瀏覽順序,因此應避免使用。

在這個頁面上,分享按鈕 <share-action>自訂元素tabindex="0" 會將這個通常無法取得焦點的元素新增至鍵盤預設的 Tab 鍵順序:

<share-action authors="@front-end.social/@estellevw" data-action="click" data-category="web.dev" data-icon="share" data-label="share, mastodon" role="button" tabindex="0">
  <svg aria-label="share" role="img" xmlns="http://www.w3.org/2000/svg">
    <use href="#shareIcon" />
  </svg>
  <span>Share</span>
</share-action>

這個網頁上還有另一個自訂元素:本機導覽有一個自訂元素,且 tabindex 值為負數:

<web-navigation-drawer type="standard" tabindex="-1">

如果 tabindex 屬性的值為負數,元素就會變成可聚焦,但無法使用 Tab 鍵選取。元素能夠接收焦點 (例如使用 HTMLElement.focus()),但不是循序焦點導覽順序的一部分。對於可聚焦但無法使用 Tab 鍵瀏覽的元素,慣例是使用 tabindex="-1"。如果將 tabindex="-1" 新增至互動式元素,該元素就不再可透過 Tab 鍵選取。

element.focus() 方法可用於將焦點設為可聚焦的元素。瀏覽器會將焦點元素捲動至可視範圍。因此,請避免使用 element.focus({preventScroll:true}),因為將焦點放在不可見的元素上會造成不良的使用者體驗。

如要查詢文件,找出焦點所在的元素,請使用唯讀的 Document.activeElement 屬性。

tabindex 大於或等於 1 的元素會納入獨立的 Tab 鍵順序。如您在 Codepen 中所見,分頁會先從最低值到最高值依序開始,然後再依來源順序,瀏覽一般序列中的分頁 (未設定 tabindextabindex="0"):

如果 tabindex 具有正值,元素就會進入優先順序較高的焦點序列,這可能會導致焦點順序混亂。 請勿使用 tabindex 修改 DOM 順序。變更索引標籤順序不僅會造成使用者體驗不佳,開發人員也很難管理及維護。

contenteditable 屬性

先前已討論過 contenteditable 屬性。在任何元素上設定 contenteditable="true",即可編輯、聚焦該元素,並將其納入 Tab 鍵順序。焦點行為與設定 tabindex="0" 類似,但不完全相同。巢狀 contenteditable 元素可聚焦,但無法使用 Tab 鍵選取。如要讓巢狀 contenteditable 元素可透過 Tab 鍵選取,請加入 tabindex="0",將其新增至循序焦點導覽順序。

為互動式元素提供 autofocus

雖然布林值 autofocus 是可針對任何元素設定的全域屬性,但不會讓閒置元素具有互動性。網頁載入時,只要第一個可聚焦的元素顯示在畫面上,且未巢狀內嵌於 <dialog> 中,就會收到焦點。autofocus

自動將焦點設在內容上可能會造成混淆。在表單控制項上設定 autofocus,表示表單控制項會在網頁載入時捲動到檢視畫面中。所有使用者 (包括螢幕閱讀器使用者和使用小型檢視區塊的使用者) 可能「看不到」表單的操作說明,甚至可能捲動經過表單控制項正常顯示的標籤。autofocus 屬性不會改變文件的循序焦點導覽順序。系統會略過序列中自動聚焦元素之前的元素。基於上述原因,我們不建議加入 autofocus 屬性。

「請勿使用 autofocus」建議的例外狀況,是在 <dialog> 元素中加入 autofocus 屬性。開啟對話方塊時,瀏覽器會自動將焦點放在 <dialog> 內第一個可聚焦的互動式元素,因此不必在元素中加入 autofocus。如要確保對話方塊開啟時,對話方塊內的特定互動式元素會收到焦點,請將 autofocus 屬性新增至該元素。

<dialog open>
  <form method="dialog">
    <button type="submit" autofocus>close</button>
  </form>
</dialog>

在關閉 <button> 上設定的 autofocus 屬性,可讓對話方塊開啟時接收焦點。由於這是對話方塊中的第一個元素,因此無論如何都會收到焦點。根據預設,開啟對話方塊時,對話方塊內第一個可聚焦的元素會取得焦點,除非對話方塊內的不同元素已設定 autofocus 屬性。

讓互動元素處於閒置狀態

此外,HTML 屬性也可以從分頁順序中移除互動式元素。包括可聚焦元素中的負 tabindex、將 disabled 屬性新增至支援的表單控制項,以及將全域 inert 屬性新增至容器,都會導致元素無法使用 Tab 鍵選取。這三項屬性「無法」互換。

tabindex

如果 tabindex 屬性的值為負數,元素就會變成可聚焦,但無法透過 Tab 鍵選取。為預設可聚焦的元素 (包括連結、按鈕、表單控制項和 contenteditable 元素) 新增 tabindex="0" 並非必要;但如果加入負值的 tabindex,通常可從循序焦點導覽順序中移除可使用 Tab 鍵選取的元素。

負值的 tabindex 值會禁止鍵盤使用者將焦點放在互動式元素上,但不會停用該元素。指標使用者仍可將焦點放在元素上。如要停用元素,請使用 disabled 屬性。

已停用

布林值 disabled 屬性會讓套用該屬性的表單控制項及其後代 (如有) 無法成為焦點。已停用的表單控制項無法成為焦點、不會收到點擊事件,且不會在提交表單時一併提交。

disabled」不是全域屬性。適用於 <button><input><optgroup><option><select><textarea>、表單相關聯的自訂元素和 <fieldset>。如果設為 <optgroup><fieldset>,除了 <fieldset> 第一個 <legend> 的內容外,所有子表單控制項都會停用。

支援 disabled 的元素也適用於 :disabled:enabled 虛擬類別。使用 disabled 屬性停用的元素通常會以淺灰色顯示,並套用使用者代理程式樣式表,即使已設定 accent-color 也是如此。

由於這是布林屬性,因此只要有這個屬性,系統就會停用原本已啟用的元素,您無法將其設為 false。如要重新啟用已停用的元素,必須移除屬性,通常是使用 Element.removeAttribute('disabled')

HTMLInputElement.disabled 屬性可讓您檢查輸入是否已停用。由於 disabled 不是全域屬性,因此不會從 HTMLElement 繼承,但每個支援的元素介面 (例如 HTMLSelectElementHTMLTextareaElement) 都有相同的唯讀屬性。

disabled 屬性不適用於以 tabindexcontenteditable 設為可聚焦的正常 inert 元素,也不適用於 <form> 元素。如要停用這些元素,可以使用全域 inert 屬性。

inert 屬性

inert 全域布林屬性加到元素後,該元素和所有巢狀內容都會停用,也就是無法點選或使用 Tab 鍵切換。也會從無障礙樹狀結構中移除。inert 可套用至任何元素,但通常用於內容區段,例如螢幕外或隱藏的內容。

disabled 套用至表單控制項時,瀏覽器會提供預設樣式,並可使用 :disabled 虛擬類別設定樣式。inert 屬性不會提供任何視覺指標,也沒有相符的虛擬類別 (但 [inert] 屬性選取器會相符)。

在沒有樣式指出惰性的可見內容上使用 inert,可能會導致不良的使用者體驗。由於螢幕閱讀器使用者無法存取閒置內容,如果螢幕閱讀器使用者看到螢幕上的內容無法透過無障礙工具存取,可能會感到困惑。使用 CSS 讓惰性狀態非常明顯。

請確保焦點不會移至非可見內容。如果焦點移到螢幕外,但螢幕外算繪的內容不會自動顯示,就應設為非互動式。如果內容隱藏,但聚焦時會顯示 (例如「跳到內容」連結),則不需要設為非作用中。

隨堂測驗

測試你對焦點的瞭解程度。

如果無法聚焦元素,系統會將其描述為?

空白。
請再試一次。
Inert。
答對了!
請再試一次。

如果元素具有 disabled 屬性,下列哪項為真?

無法聚焦。
答對了!
不會顯示。
請再試一次。
如果是表單元素,系統就不會提交。
答對了!