發布日期:2025 年 9 月 29 日
無論你喜不喜歡,輪播都是廣為使用且備受歡迎的模式。因此,實作輪播時,應確保輪播功能穩定且易於存取。應在首次算繪時提供互動功能,並採用宣告式設計,方便維護,且建構時應使用語意結構,並透過輔助技術進行測試。
不過,讓輪播內容無障礙通常很困難。管理焦點、正確發布螢幕閱讀器公告,以及處理畫面外的互動元素相當複雜,因此許多網站上的輪播內容無法存取。為解決這些挑戰,Chrome 團隊著手開發互動式 CSS 輪播效果,並納入 CSS Overflow Module Level 5,於 Chrome 135 中推出。
這項功能在 Chrome 推出後,我們收到許多社群意見回饋,並致力於解決相關問題。包括支援離散和導覽捲動標記模式等新功能,以及多項錯誤修正。例如:
- 支援替代文字中的計數器,已在 Chrome 140 中推出。
- 修正螢幕閱讀器無法正確讀取已停用
::scroll-button state
的問題。 - 確保
::scroll-marker
從內容值取得 ARIA 標籤名稱。 - 修正錯誤:所有
::scroll-marker
虛擬元素都會讀取為「已選取」。
我們相信 CSS Overflow 5 中的功能可以建立強大且無障礙的輪轉介面,在首次算繪時即可互動。本文將逐步說明如何使用這些功能解決長期存在的無障礙問題。
如需輪轉介面的基本介紹,請參閱「使用 CSS 的輪轉介面」一文。請注意,任何 UI 都無法保證開箱即用,您一律需要測試網頁的可存取性。
您需要哪種類型的輪播內容?
開始編寫程式碼前,請務必瞭解要建構的輪播類型。適當的無障礙策略取決於使用者體驗內容的方式。這篇文章將介紹三種常見的類型:
單一項目輪轉介面
單一項目輪播一次只會完整顯示並互動一張投影片 (例如主打橫幅或投影片)。
自動分頁輪播內容
自動分頁輪播內容會顯示「頁面」,例如產品或電視節目清單。
多項目輪轉介面
在多個項目的輪轉介面中,輪轉介面會一次顯示多個項目,但你仍可個別捲動瀏覽這些項目,不必分頁。
每種輪播內容都有不同的無障礙考量和最佳做法。
單一項目輪轉介面
這是傳統投影片。一次只能讀取一個子項元素,但使用者通常會「預覽」下一個或上一個項目,藉此取得其他內容的脈絡線索。目標是確保只有位於中央且完全可見的投影片可供互動。
以下是逐步操作說明。
步驟 1:使用捲動貼齊功能強制執行單一焦點
如要確保捲動容器一律「貼齊」至某個投影片,不會有項目卡在中間,請使用 CSS 捲動貼齊。這可確保項目在捲動後「貼齊」至正確位置,打造流暢的使用者體驗。
.carousel {
scroll-snap-type: inline mandatory;
}
.item {
scroll-snap-align: center;
}
步驟 2:朗讀輪播內容和投影片變更
使用螢幕閱讀器的使用者需要知道自己已進入輪播,以及輪播內容何時變更。這需要在輪轉介面容器上使用幾個 ARIA 屬性:
ARIA 屬性 |
說明 |
---|---|
role="region" |
將輪轉介面識別為網頁上的地標區域,方便使用者瀏覽。 |
aria-label |
為區域提供描述性名稱,例如「精選產品輪播」。 |
aria-live="polite" |
這就是魔法食材。這項屬性會指示螢幕閱讀器禮貌地播報這個區域內的變更,例如捲動到新投影片時,不會中斷使用者操作。 |
HTML 結構如下:
<div class="carousel" role="region" aria-label="Slideshow" aria-live="polite"> ... </div>
步驟 3:只讓顯示的投影片具有互動性
這對無障礙功能至關重要,因為可防止使用者意外將焦點移至螢幕外投影片上的按鈕或連結。如要達成這個目標,請使用新的 scroll-state
容器查詢和 interactivity
屬性。
首先,請使用 interactivity: inert
,預設讓每個投影片項目都處於非作用中狀態。
然後,使用 scroll-state
容器查詢,以目前在可視區域中「對齊」的投影片為目標,並將其內容設為 interactivity: auto
。
.item {
container-type: scroll-state;
}
/* Make all content inside slides inert by default */
.item > * {
interactivity: inert;
/* When a slide is snapped inline, make its content interactive */
@container scroll-state(snapped: inline) {
> .content {
interactivity: auto;
}
}
}
使用這項 CSS 時,瀏覽器會自動處理可聚焦的項目。管理 tabindex 時不再需要 JavaScript。scroll-state
查詢會讓目前投影片以外的所有投影片都處於閒置狀態。
分頁輪轉介面
這種模式通常用於產品或選項的圖片庫,內容會分組顯示在不同頁面。視內容呈現方式而定,可透過兩種方式處理無障礙功能。
輪轉介面,內含多個獨立頁面
使用含有 role="region"
的容器,其中包含一個 role="tabpanel"
元素。這個分頁面板會更新內容,以反映目前的分頁或頁面。
<div role="region" class="carousel" aria-label="Featured Products Carousel">
<div role="tabpanel">
<div class="item">Item 1</div>
<div class="item">Item 2</div>
...
<div class="item">Item n</div> </div>
</div>
</div>
如要管理互動性,請使用與 view()
時間軸相關的動畫技巧。這樣可確保 Tab 鍵順序只會到達螢幕上目前顯示的項目。
@keyframes interactive-when-visible {
0% { interactivity: auto; }
}
.item {
interactivity: inert;
animation: interactive-when-visible steps(1);
animation-timeline: view(inline);
}
內容清單
如果內容基本上是清單,請使用 <ul>
元素,確保語意正確。
例如:
<div class="carousel" role="region" aria-label="Related Posts">
<ul>
<li><!-- Post 1 content --></li>
<li><!-- Post 2 content --></li>
<li><!-- Post 3 content --></li>
<!-- ... -->
</ul>
</div>
在這個模式中,請勿使用互動性屬性,讓螢幕外內容處於閒置狀態。這麼做會影響螢幕閱讀器播報的項目數量,因此所有內容都必須保留在無障礙樹狀結構中。
多項目輪轉介面
這個模式適用於輪播,可同時顯示及讀取多個子元素。例如電子商務網站上的「相關產品」專區。
這些輪播內容的行為會有所不同,取決於您對下列決策的回答:您是否要引導使用者一次專注於一個項目,還是要允許他們自由存取所有可見內容?
模式 1:可見項目中的單一互動式項目
在這個模型中,多個項目都會顯示,但只有主要或「目前」項目可互動。其他可見項目則為惰性。這個模式可引導使用者逐一瀏覽一組項目。
如要正確建構這個項目,請使用與稍早討論的單一項目輪轉介面相同的無障礙模式。這些行為包括:
- 使用捲動狀態容器查詢,對非使用中的項目套用互動性:惰性。
- 在項目周圍加入足夠的邊框間距,確保每個項目都能貼齊主要位置 (例如捲動埠的中央)。這讓逐一瀏覽模式感覺更自然流暢。
模式 2:所有顯示項目都是互動式項目
如果目標是讓使用者自由與所有可見項目互動,最佳做法是確保所有內容都不是靜態。
這個模式:
- 如果內容在語意上是清單,請使用
<ul>
元素,因為這會為螢幕閱讀器使用者提供正確的背景資訊。 - 請勿使用互動管理 (
interactivity: inert
)。所有可見內容都應保留在無障礙樹狀結構中,並可透過鍵盤 Tab 鍵存取。
總結
CSS Overflow 5 可讓您以宣告方式建構常見的互動式輪轉介面模式,減少無障礙功能方面的問題。結合語意 HTML、捲動狀態和互動性等現代 CSS,以及適當的 ARIA 角色,您就能建立高效能的無障礙體驗,在首次算繪時提供互動功能。
歡迎試用這些新 API!一如往常,雖然這些模式和 API 的設計宗旨是簡化互動式、快速且無障礙元件的建構作業,但仍無法取代完整的無障礙測試。您一律需要驗證程式碼是否可存取,並適用於基準目標。