快速開始

只需引入兩個檔案,在 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 時顯示水平頁籤,低於時自動切換為折疊面板。

互動示範 type: default
  • 🏠 首頁
  • 📋 關於
  • ⚙️ 設定
  • 📞 聯絡

首頁內容

這是首頁頁籤的內容區域。您可以在這裡放置任何 HTML 內容,包含圖片、表格、表單等。

試試使用鍵盤 Tab 鍵進行遊走:焦點會依序進入頁籤標題 → 首頁內容 → 下一個頁籤標題。

關於我們

這是關於頁籤的內容。Tad Tabs 是一個完全符合 WCAG 2.2 AAA 標準的頁籤套件,支援 NVDA、JAWS 等讀報軟體。

設定

這是設定頁籤的內容。您可以透過 CSS 自訂屬性輕鬆調整外觀。

查看所有設定選項 →

聯絡我們

這是聯絡頁籤的內容。底部有一個可互動的連結,測試 Tab 鍵是否可正確遊走至此連結後再跳出頁籤元件。

前往垂直頁籤示範

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>

垂直頁籤

頁籤標題列顯示於左側,同樣在窄螢幕下自動切換為折疊面板。

互動示範 type: vertical
  • 🍎 蘋果
  • 🍋 檸檬
  • 🫐 藍莓
  • 🥭 芒果

蘋果

蘋果(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)

永遠以折疊面板形式呈現,不受螢幕寬度影響。

互動示範 type: 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 自訂切換點。縮小瀏覽器視窗可觀察從頁籤切換為折疊面板的效果。

互動示範(請縮放視窗觀察變化) breakpoint: 900px
  • 簡介
  • 功能特色
  • 使用授權

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 順序問題。

頁籤模式(水平 / 垂直)

Tab 進入頁籤清單,焦點移至作用中頁籤
Tab 從作用中頁籤 → 進入作用中頁籤的內容區域
Tab 從作用中頁籤內容 → 移至下一個頁籤標題(若為最後一個則離開元件)
Shift+Tab 從作用中頁籤內容 → 返回作用中頁籤標題
Shift+Tab 從作用中頁籤的「下一個」標題 → 返回作用中頁籤內容
←→ 在頁籤標題間移動焦點(繞回)
↑↓ 垂直頁籤:上下移動焦點
Home 跳至第一個頁籤
End 跳至最後一個頁籤
Enter / Space 啟用當前焦點所在的頁籤(manual 模式)

折疊面板模式(Accordion)

Tab 在各折疊按鈕及面板內容間依序遊走
↓ 焦點移至下一個折疊按鈕(繞回)
↑ 焦點移至上一個折疊按鈕(繞回)
Home 跳至第一個折疊按鈕
End 跳至最後一個折疊按鈕
Enter / Space 展開 / 收合目前焦點所在的面板
Esc 收合目前展開的面板(需 closed 選項允許收合)
✓ Tab 順序修正說明 原始 DOM 結構中,所有頁籤標題集中在 <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)使用提示

瀏覽模式 vs 焦點模式 NVDA 在進入頁籤元件時會自動切換至「焦點模式」(Forms Mode),此時方向鍵用於頁籤導覽而非虛擬游標移動。進入頁籤內容後可按 Esc 切換回瀏覽模式,使用方向鍵閱讀內容。

從 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>