快速開始
只需引入兩個檔案,在 HTML 加上 data-tad 屬性,即可自動初始化。
1. 引入檔案
<link rel="stylesheet" href="tad-tabs.css">
<script src="tad-tabs.js"></script>
2. HTML 結構
<!-- data-tad 屬性觸發自動初始化 -->
<div id="my-tabs" data-tad>
<!-- 頁籤標題:直接子元素 <ul> -->
<ul>
<li>頁籤一</li>
<li>頁籤二</li>
<li>頁籤三</li>
</ul>
<!-- 頁籤內容:與 <ul> 同層的 <div>,順序對應 -->
<div>頁籤一的內容</div>
<div>頁籤二的內容</div>
<div>頁籤三的內容</div>
</div>
3. 透過 JavaScript 初始化(可選)
// 手動初始化單一元素
const tabs = new TadTabs('#my-tabs', {
type: 'default', // 'default' | 'vertical' | 'accordion'
activation: 'manual', // 'manual' | 'auto'
activate: function(index, tabEl, panelEl) {
console.log('已切換至頁籤', index);
}
});
// 批次初始化所有含 data-tad 屬性的元素
TadTabs.init();
// jQuery 方式
$('#my-tabs').tadTabs({ type: 'vertical' });
水平頁籤(預設)
螢幕寬度超過 768 px 時顯示水平頁籤,低於時自動切換為折疊面板。
- 🏠 首頁
- 📋 關於
- ⚙️ 設定
- 📞 聯絡
首頁內容
這是首頁頁籤的內容區域。您可以在這裡放置任何 HTML 內容,包含圖片、表格、表單等。
試試使用鍵盤 Tab 鍵進行遊走:焦點會依序進入頁籤標題 → 首頁內容 → 下一個頁籤標題。
關於我們
這是關於頁籤的內容。Tad Tabs 是一個完全符合 WCAG 2.2 AAA 標準的頁籤套件,支援 NVDA、JAWS 等讀報軟體。
HTML 程式碼
<div id="demo1" data-tad data-tad-type="default">
<ul>
<li>🏠 首頁</li>
<li>📋 關於</li>
<li>⚙️ 設定</li>
</ul>
<div>首頁內容…</div>
<div>關於內容…</div>
<div>設定內容…</div>
</div>
垂直頁籤
頁籤標題列顯示於左側,同樣在窄螢幕下自動切換為折疊面板。
- 🍎 蘋果
- 🍋 檸檬
- 🫐 藍莓
- 🥭 芒果
蘋果
蘋果(Malus domestica)是全球最廣泛栽培的水果之一,原產於中亞地區。富含膳食纖維、維生素 C 與多種抗氧化物質。
檸檬
檸檬(Citrus limon)是一種常見的柑橘類水果,以其酸味和濃郁香氣著稱,廣泛用於烹飪、飲料和甜點中。
藍莓
藍莓(Vaccinium corymbosum)含有豐富的花青素,是強效的抗氧化劑,有助於保護細胞、維持腦部健康。
芒果
芒果(Mangifera indica)被稱為「熱帶水果之王」,富含維生素 A、C 和葉酸,味道香甜濃郁。
HTML 程式碼
<div data-tad data-tad-type="vertical">
<ul>
<li>蘋果</li>
<li>檸檬</li>
</ul>
<div>蘋果內容…</div>
<div>檸檬內容…</div>
</div>
折疊面板(Accordion)
永遠以折疊面板形式呈現,不受螢幕寬度影響。
- WCAG 2.2 AAA 是什麼?
- 如何支援鍵盤使用者?
- 如何支援讀報軟體(NVDA)?
- 可以自訂外觀嗎?
WCAG(Web Content Accessibility Guidelines)是由 W3C 制定的網頁無障礙設計指引。2.2 版於 2023 年發布,分為 A、AA、AAA 三個等級,AAA 是最高標準,涵蓋焦點外觀(SC 2.4.13)、目標尺寸(SC 2.5.5)等要求。
Tad Tabs 完整實作 ARIA 1.2 頁籤模式,支援方向鍵切換頁籤、Tab 鍵以正確順序遊走、Home/End 直跳首末頁籤、Enter/Space 啟動頁籤,以及 Escape 收合折疊面板。
套件設定了正確的 role、aria-selected、aria-expanded、aria-controls、aria-labelledby 等 ARIA 屬性,確保 NVDA、JAWS、VoiceOver 能正確朗讀頁籤狀態與內容。
可以!所有顏色、字體、間距、邊框圓角都以 CSS 自訂屬性(CSS Custom Properties)定義,在 .tad-tabs { } 內覆寫即可完全自訂外觀,無需修改套件原始碼。
可收合的折疊面板
加上 data-tad-closed="accordion" 允許點擊已展開項目時收合。
<div
data-tad
data-tad-type="accordion"
data-tad-closed="accordion"
>
...
</div>
響應式自動切換
透過 data-tad-breakpoint 自訂切換點。縮小瀏覽器視窗可觀察從頁籤切換為折疊面板的效果。
- 簡介
- 功能特色
- 使用授權
Tad Tabs 簡介
Tad Tabs 是以純 JavaScript(ES6+)撰寫的頁籤套件,不相依任何第三方函式庫。透過現代化的 ResizeObserver API 監聽容器尺寸,在視窗縮放時即時切換顯示模式。
功能特色
- 水平頁籤、垂直頁籤、折疊面板三種模式
- 響應式自動切換,斷點可自訂
- WCAG 2.2 AAA 完整合規
- ARIA 1.2 頁籤模式與折疊面板模式
- 手動 / 自動兩種方向鍵行為
- URL Hash 同步
- jQuery 橋接(可選)
- 支援 destroy() 完整清除
使用授權
Tad Tabs 採用 MIT 授權,可自由使用於個人與商業專案,修改後無需開放原始碼,唯需保留版權宣告。
<!-- 視窗寬度 ≤ 900 px 時切換為折疊面板 -->
<!-- data-tad-activation="auto" 啟用方向鍵自動切換頁籤 -->
<div
data-tad
data-tad-type="default"
data-tad-breakpoint="900"
data-tad-activation="auto"
>
...
</div>
選項參數
可透過 JavaScript 物件或 HTML data-* 屬性兩種方式傳入。
| JS 選項 | data-* 屬性 | 型別 | 預設值 | 說明 |
|---|---|---|---|---|
| type | data-tad-type | string | 'default' | 版型。'default'(水平)、'vertical'(垂直)、'accordion'(折疊) |
| closed | data-tad-closed | bool|string | false | 初始是否收合。false、true、'accordion'(僅折疊模式下收合)、'tabs'(僅頁籤模式下收合) |
| breakpoint | data-tad-breakpoint | number | 768 | 切換為折疊面板的視窗寬度(px)。type 為 'accordion' 時無效。 |
| activeIndex | data-tad-active | number | 0 | 初始啟用的頁籤索引(0 起算)。若 URL Hash 存在則優先使用 Hash。 |
| activation | data-tad-activation | string | 'manual' | 方向鍵行為。'manual':僅移動焦點,Enter/Space 啟動(推薦);'auto':移動焦點並立即切換。 |
| hash | data-tad-hash | boolean | true | 是否將當前啟用頁籤同步至 URL Hash,格式:#容器id-索引(1 起算)。 |
| activate | — | function | null | 頁籤切換後的回呼函式,接收 (index, tabEl, panelEl),this 為實例。 |
| i18n.tablistLabel | — | string | '頁籤導覽' | 頁籤清單的 aria-label,供讀報軟體朗讀。 |
| i18n.accordionLabel | — | string | '折疊面板' | 折疊面板的標籤,供讀報軟體使用。 |
公開 API
| 方法 | 回傳 | 說明 |
|---|---|---|
| activate(index) | TadTabs | 啟用指定索引的頁籤(0 起算)。可鏈式呼叫。 |
| next() | TadTabs | 啟用下一個頁籤(超過最後一個會繞回第一個)。 |
| prev() | TadTabs | 啟用上一個頁籤(超過第一個會繞回最後一個)。 |
| getActive() | number | 取得當前啟用的頁籤索引,無啟用時回傳 -1。 |
| length() | number | 取得頁籤總數。 |
| destroy() | void | 移除所有事件監聽器、清除注入的 ARIA 屬性與折疊面板按鈕,恢復原始 HTML。 |
| TadTabs.init(selector?) | TadTabs[] | 靜態方法:批次初始化符合選擇器的所有元素,預設選擇器為 '[data-tad]'。回傳實例陣列。 |
| TadTabs.version | string | 版本號字串,如 '1.0.0'。 |
JavaScript 使用範例
const tabs = new TadTabs('#my-tabs', {
type: 'default',
activate(index, tabEl, panelEl) {
console.log(`已切換至第 ${index + 1} 個頁籤`);
}
});
// 切換至第 3 個頁籤(索引 2)
tabs.activate(2);
// 下一個 / 上一個(可鏈式)
tabs.next().next();
// 讀取當前索引
console.log(tabs.getActive()); // → 4
// 清除並重建
tabs.destroy();
const newTabs = new TadTabs('#my-tabs', { type: 'accordion' });
鍵盤導覽說明
完整實作 ARIA APG 頁籤與折疊面板的鍵盤互動規範,並修正 DOM 結構造成的 Tab 順序問題。
頁籤模式(水平 / 垂直)
折疊面板模式(Accordion)
<ul> 前段,所有內容集中在後段,導致自然 Tab 順序為「所有標題 → 所有內容」。Tad Tabs 透過攔截 Tab 鍵事件,強制實現正確的遊走順序:前方標題… → 作用中標題 → 作用中內容 → 後方標題… → 離開元件
無障礙設計說明
符合的 WCAG 2.2 成功準則
- SC 1.3.1 資訊與關聯 — role、aria-controls、aria-labelledby 正確關聯頁籤與內容
- SC 1.4.6 對比度(增強型)AAA — 文字與背景對比 ≥ 7:1
- SC 1.4.11 非文字對比 — 邊框、圖示等 UI 元件對比 ≥ 3:1
- SC 2.1.1 鍵盤 — 所有功能均可純鍵盤操作
- SC 2.1.3 鍵盤(無例外)AAA — 無任何功能需要滑鼠路徑移動
- SC 2.4.3 焦點順序 — Tab 順序與視覺順序一致且符合邏輯
- SC 2.4.7 焦點可見 — 所有互動元素具備明顯焦點指示器
- SC 2.4.11 焦點不被遮蔽(最低)AA — 焦點元素不被固定元素完全遮蓋
- SC 2.4.13 焦點外觀 AAA — 焦點指示器 ≥ 3px 外框,對比 ≥ 3:1
- SC 2.5.5 目標尺寸(增強型)AAA — 最小點擊目標 44×44 CSS px
- SC 2.3.3 動畫(三次閃爍)AAA — 尊重 prefers-reduced-motion,停用裝飾動畫
- SC 4.1.2 名稱、角色、值 — 所有元件具備正確 ARIA 名稱與狀態
ARIA 屬性說明
| 元素 | ARIA 屬性 | 說明 |
|---|---|---|
| <ul> | role="tablist" aria-label aria-orientation | 宣告為頁籤清單;提供可讀標籤;宣告水平或垂直方向 |
| <li> | role="tab" aria-selected aria-controls tabindex | 宣告為頁籤;選取狀態;控制哪個面板;roving tabindex |
| <div>(面板) | role="tabpanel" aria-hidden aria-labelledby tabindex | 宣告為面板;是否隱藏;由哪個頁籤標記;可聚焦 |
| <button>(折疊) | aria-expanded aria-controls | 展開/收合狀態;控制哪個面板 |
讀報軟體(NVDA)使用提示
從 easyResponsiveTabs 遷移
Tad Tabs 提供 easyResponsiveTabs jQuery 相容介面,大多數情況只需更換引入檔案。
方法一:直接替換(需 jQuery)
將引入的 JS/CSS 換成 Tad Tabs,既有的 jQuery 呼叫方式完全相容:
<!-- 舊 -->
<link rel="stylesheet" href="easy-responsive-tabs.css">
<script src="easyResponsiveTabs.js"></script>
<!-- 新:只換這兩行 -->
<link rel="stylesheet" href="tad-tabs.css">
<script src="tad-tabs.js"></script>
// 既有呼叫方式無需更改:
$('#my-tabs').easyResponsiveTabs({
type: 'default',
activate: function() { ... }
});
方法二:改用 Tad Tabs 原生 API
建議逐步改用原生 API,以獲得完整功能並移除 jQuery 相依:
| easyResponsiveTabs 選項 | Tad Tabs 對應 | 說明 |
|---|---|---|
| type: 'default' | type: 'default' | 相同 |
| type: 'vertical' | type: 'vertical' | 相同 |
| type: 'accordion' | type: 'accordion' | 相同 |
| closed: false | closed: false | 相同 |
| closed: 'accordion' | closed: 'accordion' | 相同 |
| activate: fn | activate: fn | 簽章改為 (index, tabEl, panelEl) |
| tabidentify: '…' | (不需要) | 以容器 id 自動區分多實例 |
| activetab_bg | CSS: --tad-bg-active | 改用 CSS 自訂屬性 |
| inactive_bg | CSS: --tad-bg-inactive | 改用 CSS 自訂屬性 |
HTML 結構變更
不需要 class="resp-tabs-list" 或 class="resp-tabs-container",直接使用乾淨的 <ul> 和 <div>:
<!-- 舊結構 -->
<div id="my-tabs">
<ul class="resp-tabs-list">
<li>頁籤一</li>
</ul>
<div class="resp-tabs-container">
<div>內容一</div>
</div>
</div>
<!-- 新結構(推薦)-->
<div id="my-tabs" data-tad>
<ul>
<li>頁籤一</li>
</ul>
<div>內容一</div>
</div>