はじめに
ウェブサイトやアプリでよく見かける「タブ」は、情報を整理して使いやすくするための重要な要素です。本調査では、タブ機能の基本概念から実際の実装例、デザインのカスタマイズ方法、そしてレスポンシブ対応までを分かりやすく解説します。
対象は、これからタブを使ってUIを改善したいデザイナーや開発者、または基礎を学びたい初心者です。具体例としては、設定画面の項目切替、商品情報の詳細表示、よくある質問(FAQ)の分類表示などを想定しています。
本稿では、まずタブの役割と構造の理解を優先します。その後、HTMLとCSSでの基本構造、CSSでの見た目調整、JavaScriptによる切り替え制御、さらにJavaScriptを使わないCSSのみの実装方法を順に紹介します。最後に、スマートフォンやタブレットでも使いやすくするレスポンシブ設計について考えます。各章は具体的なコード例とポイントを交え、実際に手を動かしながら学べるように構成しました。
タブ機能の基本概念と役割
定義
タブは複数の見出し(タブ)を並べ、選んだタブに対応する領域だけを表示するUIパーツです。クリックやキー操作で表示を切り替え、同じ領域に複数の情報を集めます。
役割
- 情報の整理:関連する情報をカテゴリーごとに分け、画面をすっきり見せます。
- ユーザーの効率化:必要な情報へ素早くアクセスでき、スクロールやページ遷移を減らします。
- 比較の容易さ:仕様や価格などを横並びで切り替えて比較しやすくします。
具体例
ECサイトでは「概要」「仕様」「レビュー」をタブに分けます。企業サイトでは「会社概要」「沿革」「採用情報」などです。どちらも同じページ内で情報を切り替えられます。
注意点
- 過度にタブ数を増やすと逆に分かりにくくなります。3〜6個程度が目安です。
- キーボード操作やスクリーンリーダー対応を考慮すると使いやすさが向上します。
これらを理解すると、設計や実装時に適切なタブ構成が作れます。
HTMLとCSSを使用したタブの基本構造
概要
タブの基本は、HTMLで構造を作り、CSSで表示・非表示を切り替える基礎を整えることです。ここではシンプルなHTML構造と最低限のCSS例を示します。誰でも読みやすい形で説明します。
HTMLの基本構造
- タブメニューは
- と
- で表現します。
- 各タブに対応するコンテンツは
で分けます。
- data属性や順番でタブと内容を対応させます。
例(シンプルなHTML):
<ul class="tabs" role="tablist"> <li class="tab" data-target="#panel1">タブ1</li> <li class="tab" data-target="#panel2">タブ2</li> <li class="tab" data-target="#panel3">タブ3</li> </ul> <div id="panel1" class="tab-panel">内容1</div> <div id="panel2" class="tab-panel">内容2</div> <div id="panel3" class="tab-panel">内容3</div>最低限のCSS例
- 非表示はdisplay:noneで行い、選択中のパネルだけ表示します。
.tab-panel{display:none} .tab-panel.active{display:block} .tab{cursor:pointer} .tab.active{font-weight:bold}タブとコンテンツを結び付ける方法
- data-target属性でIDを指定する方法が分かりやすいです。
- またはタブの順番とパネルの順番を一致させる方法もあります。
注意点
- 見た目だけでなく、キーボード操作やARIA属性での配慮を後で加えると親切です。
- 次章でCSSの詳しい調整とJavaScriptでの切り替え方法を解説します。
CSSによるスタイリングと見た目の調整
タブの基本配置
タブは横並びに配置すると分かりやすくなります。display: flex;を使えば要素を均等に並べられます。簡潔なクラス名にしておくと管理が楽です。
クリック可能であることを示す
タブにはcursor: pointer;を付けて、マウスポインタでクリック可能と分かるようにします。フォーカス時にはoutlineやbox-shadowで視覚的な手がかりを追加してください。
アクティブ状態の表現
選択中のタブは背景色や文字色を変えると視認性が上がります。border-bottomで下線を引く方法もよく使われます。色は配色ガイドに合わせて統一しましょう。
コンテンツの表示・非表示
タブに対応するコンテンツはdisplayやvisibilityで切り替えます。display:none;だとスクリーンリーダーの扱いに注意が必要なので、roleやaria-hiddenを併用すると親切です。
具体的なCSS例
.tabs { display:flex; gap:8px; } .tab { padding:8px 12px; cursor:pointer; background:#f2f2f2; border-radius:4px; } .tab:focus { outline:2px solid #6ca0ff; } .tab.active { background:#0066cc; color:#fff; } .tab-content { display:none; padding:12px; border-top:1px solid #e0e0e0; } .tab-content.active { display:block; }親切な配慮(アクセシビリティ)
色だけで区別せず、アイコンや下線も併用してください。キーボード操作で切替できるようにfocus管理を行うと使いやすくなります。
JavaScriptによる切り替え動作の制御
概要
JavaScriptでタブのクリックを監視し、アクティブなタブのクラスを切り替えて対応するコンテンツを表示します。ここではシンプルで実用的な実装例と、アクセシビリティや動作の注意点を示します。
サンプルHTML
<ul class="tabs" role="tablist"> <li class="tab" role="tab" data-target="panel1" tabindex="0" aria-selected="true">概要</li> <li class="tab" role="tab" data-target="panel2" tabindex="-1" aria-selected="false">詳細</li> </ul> <div id="panel1" class="panel">概要の内容</div> <div id="panel2" class="panel" hidden>詳細の内容</div>基本的なJavaScript
const tabs = document.querySelectorAll('.tab'); const panels = document.querySelectorAll('.panel'); tabs.forEach(tab => { tab.addEventListener('click', () => activateTab(tab)); tab.addEventListener('keydown', (e) => handleKey(e, tab)); }); function activateTab(tab) { tabs.forEach(t => { t.classList.remove('active'); t.setAttribute('aria-selected','false'); t.tabIndex = -1; }); panels.forEach(p => p.hidden = true); tab.classList.add('active'); tab.setAttribute('aria-selected','true'); tab.tabIndex = 0; document.getElementById(tab.dataset.target).hidden = false; tab.focus(); }キーボード操作とアクセシビリティ
矢印キーでタブ間を移動し、EnterやSpaceで切り替えると使いやすくなります。roleやaria属性、tabindexを適切に設定してください。
注意点とヒント
- DOM検索は最小限にしてパフォーマンスを保ちます。上の例では一度だけquerySelectorAllしています。
- JSなし環境では最初のパネルを表示するCSSを用意すると良いです。
- アニメーションを加える場合は表示・非表示の切り替えはclassで行い、layoutの負荷を避けてください。
JavaScriptなしでCSSのみでタブを実装する方法
概要
CSSの:checked疑似クラスや:has()疑似クラスを使うと、JavaScriptなしでタブ切替を実現できます。基本はラジオボタンを非表示にして、対応する
HTML(ラジオ+ラベル)
<div class="tabs"> <input id="tab1" type="radio" name="tab" checked> <label for="tab1">タブ1</label> <input id="tab2" type="radio" name="tab"> <label for="tab2">タブ2</label> <div class="panel" id="panel1">内容1</div> <div class="panel" id="panel2">内容2</div> </div>CSS(:checkedで表示切替)
.tabs input{display:none} .tabs .panel{display:none} #tab1:checked ~ #panel1, #tab2:checked ~ #panel2{display:block} label{cursor:pointer;padding:8px}この方法はシンプルで互換性が高いです。
:has()を使う例
親要素に:has()を使えば、ラジオを隠したまま見た目の切替を柔軟に書けます。ただしブラウザ対応に差があります。
アクセシビリティと注意点
ラベルはフォーカス可能にし、キーボード操作でも切替できるようにします。:has()は一部ブラウザで未対応のため、重要なUIではラジオ方式を推奨します。
レスポンシブデザインへの対応
概要
画面サイズに応じてタブの配置や見た目を切り替えます。デスクトップでは横並び、スマホなどの小さな画面では縦並びやドロップダウンへ切り替えると見やすくなります。
実装例(CSS)
基本はフレックスを使います。小さな画面では縦並びにします。
.tabs{display:flex;gap:8px} .tab{padding:10px 14px;cursor:pointer} @media(max-width:600px){ .tabs{flex-direction:column} .tab{width:100%} }タブが多い場合は横スクロールにして指でスワイプできるようにします。
.tabs{overflow-x:auto;white-space:nowrap} .tab{display:inline-block}さらに小さい画面ではselect要素に切り替えると操作しやすくなります。
.tab-select{display:none} @media(max-width:480px){.tabs{display:none}.tab-select{display:block;width:100%}}実用のコツ
- タッチ目標は高さ40〜48px程度にする。
- テキストを詰めすぎないで余白を確保する。
- フォーカスや選択状態が分かる色を用意する。
- 多数のタブはスクロールか絞り込みで対応する。
アクセシビリティを意識して、選択状態(aria-selected)やキーボード操作を確認してください。












