CSSタブジェネレーター

次へ

タブはあらゆる場所に存在しています、設定画面、ドキュメントサイト、製品ギャラリーなどです。ネイティブHTMLには専用のタブ要素がないため、開発者は自作します。このジェネレーターは、アクティブなタブ用のアクセントカラー、ボタンの角丸、ホバー状態を備えたシンプルなタブバーをHTML+CSSで作成します。マークアップをプロジェクトに貼り付け、タブの切り替えはご自身のJavaScriptで実装してください。

タブの作成方法

  1. 1

    アクセントカラーを選ぶ

    アクティブなタブの背景色と文字色です。ブランドに合う色を選んでください。

  2. 2

    角丸を設定する

    タブボタンの上の角を丸めます。値を大きくすると柔らかい印象になります。

  3. 3

    ラベルを編集する

    出力には「Overview」「Details」「Settings」の3つのボタンがあります。コンテンツに合わせて名前を変更してください。

  4. 4

    コードをコピーする

    タブのマークアップには<style>ブロックが付属します。両方をページに貼り付けてください。

  5. 5

    タブ切り替えを追加する

    ジェネレーターが作るのは見た目だけです。パネルの表示・非表示を切り替えるため、ボタンを自作のJavaScriptやUIライブラリに接続してください。

正しいアクセシブルなマークアップ

<div class="tabs">
  <div role="tablist" aria-label="Product info">
    <button role="tab" id="tab-1" aria-selected="true"  aria-controls="panel-1" tabindex="0">Overview</button>
    <button role="tab" id="tab-2" aria-selected="false" aria-controls="panel-2" tabindex="-1">Specs</button>
    <button role="tab" id="tab-3" aria-selected="false" aria-controls="panel-3" tabindex="-1">Reviews</button>
  </div>
  <section role="tabpanel" id="panel-1" aria-labelledby="tab-1">...</section>
  <section role="tabpanel" id="panel-2" aria-labelledby="tab-2" hidden>...</section>
  <section role="tabpanel" id="panel-3" aria-labelledby="tab-3" hidden>...</section>
</div>

重要な属性:

  • role="tablist" がボタン群を囲みます。
  • 各ボタンに role="tab" を付け、aria-selectedaria-controls を指定します。
  • tabindexroving tabindex パターンを使います。アクティブなタブだけが 0 で、それ以外はすべて -1 です。矢印キーで両者の間をフォーカス移動します。
  • 各パネルに role="tabpanel" を付け、aria-labelledby でそのタブを指し示します。
  • 非アクティブなパネルには hidden を付けます(display: none だけでは不十分です。支援技術が参照するのはこの属性です)。

キーボードの操作規則

キー 動作
Tab タブリストへの出入り
ArrowLeft 前のタブ(最後に折り返す)
ArrowRight 次のタブ(最初に折り返す)
Home 最初のタブ
End 最後のタブ
Enter / Space フォーカス中のタブをアクティブにする(手動アクティブ化の場合)

自動起動(フォーカスが移動する際にタブが切り替わる)と手動起動(フォーカスが移動するとEnterキーでタブが起動する)、WAI-ARIAでは両方をサポートしています。視覚障害ユーザーにとっては自動起動の方が便利ですが、タブのコンテンツが複雑に表示される場合には手動起動の方が適しています。

下線スタイル

[role="tablist"] {
  display: flex;
  border-bottom: 1px solid #e5e7eb;
}
[role="tab"] {
  padding: 0.75rem 1rem;
  background: transparent;
  border: 0;
  color: #6b7280;
  position: relative;
  cursor: pointer;
}
[role="tab"][aria-selected="true"] {
  color: #111827;
}
[role="tab"][aria-selected="true"]::after {
  content: "";
  position: absolute;
  left: 1rem; right: 1rem; bottom: -1px;
  height: 2px;
  background: #2563eb;
}

ピル型スタイル

[role="tab"] {
  padding: 0.5rem 0.9rem;
  border-radius: 9999px;
  border: 0;
  background: transparent;
}
[role="tab"][aria-selected="true"] {
  background: #2563eb;
  color: #fff;
}

フォーカスを可視化する

キーボードでフォーカスが設定される際には、常にフォーカスリングを描画してください:

[role="tab"]:focus-visible {
  outline: 2px solid #60a5fa;
  outline-offset: 2px;
}

JavaScript

おおよそ:

const tabs = document.querySelectorAll('[role="tab"]');
tabs.forEach(tab => {
  tab.addEventListener('click', () => activate(tab));
  tab.addEventListener('keydown', e => {
    const i = [...tabs].indexOf(tab);
    if (e.key === 'ArrowRight') tabs[(i + 1) % tabs.length].focus();
    if (e.key === 'ArrowLeft')  tabs[(i - 1 + tabs.length) % tabs.length].focus();
    if (e.key === 'Home') tabs[0].focus();
    if (e.key === 'End')  tabs[tabs.length - 1].focus();
  });
});

function activate(tab) {
  tabs.forEach(t => {
    const panel = document.getElementById(t.getAttribute('aria-controls'));
    const active = t === tab;
    t.setAttribute('aria-selected', active);
    t.setAttribute('tabindex', active ? '0' : '-1');
    panel.hidden = !active;
  });
  tab.focus();
}

合計30行、依存関係はゼロです。

タブとアコーディオンの使い分け

狭い画面ではタブの行が狭くなりやすくなります。一般的なパターンは、デスクトップではタブ表示、モバイル端末ではアコーディオン表示です。ARIAロールを変更することなく視覚表現を切り替えるには、コンテナクエリまたはメディアクエリを使用してください。

よくある質問

アクセシブルなタブには必要です。role="tablist"role="tab" がないと、スクリーンリーダーはボタンを通常のボタンとして扱い、ユーザーはタブというナビゲーションの慣習を失います。代替として、意味構造が組み込まれたシンプルな <details> / <summary> のアコーディオンを使う方法もあります。

各タブのコンテンツがレンダリングに負担が少ない場合、自動方式(フォーカス移動時にタブがアクティブになる)は適しています。一方、タブの切り替えが大規模な処理(例えば大型フォームの読み込みやレンダリング)を引き起こす場合には、手動方式(フォーカス移動時にEnterキーを押してタブをアクティブにする)の方が適しています。

コンテンツを含むタブ(ドキュメントや製品タブ)については、ハッシュ値(#specs)またはクエリパラメータを使用することで、リンクが特定のタブにディープリンクされ、再読み込み時にアクティブなタブが維持されます。UIタブ(設定ペイン)についてはURLは任意です。

矢印キーによるナビゲーションやARIAステートが欠如しているチェックボックス/ラジオハック方式のみが利用可能です。真にアクセシブルな実装には、この小さなJSスニペットは十分に価値があります。サーバー上でレンダリングされるバックアップ機能が必要な場合は、各タブを独自のURLにリンクし、対応するパネルをサーバー側でレンダリングしてください。

関連ツール

このツールは他の言語でも利用できます