ナビゲーション

パンくずリスト

解説あり

Breadcrumb

サイト内の現在位置を示すナビ。nav とリスト、現在地の aria-current が肝。

パンくずリスト(breadcrumb)とは?

パンくずリストは、「ホーム > 商品一覧 > シューズ > ランニング」のように、いまサイトのどの階層にいるかを示し、上の階層へ素早く戻れるようにするナビゲーションです。 ページ上部によく置かれます。

見た目はただのリンクの並びですが、支援技術には 「これはナビゲーションで、順序のあるリストで、最後が現在地」という構造を 正しく伝えることが大切です。

なぜアクセシビリティが大事なの?

ライブデモ(推奨実装)

下が APG に沿ったパンくずです。リンクは Tab で順に移動でき、 最後の「ランニング」は現在地なのでリンクになっていません。

nav > ol > li > a のパンくず

試してみよう:Tab でリンクを順に移動。最後の「ランニング」にはフォーカスが当たらない(現在地はリンクにしないため)。スクリーンリーダーでは「ナビゲーション, リスト, 4項目, …現在のページ」と読まれます。

ポイント

aria-current="page" を付けたリンクは「現在のページ」と読み上げられます。 現在地は href 付きのリンクにせず、ただのテキスト、またはaria-current 付きの非リンク要素にするのが一般的です(このデモでは挙動確認のためaaria-current を付けています)。

キーボード操作

キー動作必須/任意
Tab / Shift+Tab前後のリンクへ移動(普通のリンクと同じ)必須
Enterフォーカス中のリンク先へ移動必須

補足

パンくずはただのリンクの並びです。特別なキー操作は不要で、<a href> を使えばキーボード操作は自動で得られます。 凝った矢印キー操作などは要りません。

必要な WAI-ARIA / ロール

付ける場所属性 / ロール意味
外側のコンテナ<nav aria-label="パンくずリスト">ナビゲーションのランドマークにし、名前で区別する。
リンクの並び<ol> > <li>順序のあるリストにして、階層の数と順番を伝える。
現在地の項目aria-current="page"「現在のページ」であることを示す。リンクにはしない。
区切り文字(CSS の ::before「/」「>」は装飾。テキストにせず擬似要素で描き、読み上げ対象外にする。

実装:推奨パターン(Good)

良い例 / 推奨

<nav>(ラベル付き)の中に <ol>><li>><a>。現在地は aria-current="page"

マークアップ:

<nav aria-label="パンくずリスト">
  <ol>
    <li><a href="/">ホーム</a></li>
    <li><a href="/products">商品一覧</a></li>
    <li><a href="/products/shoes">シューズ</a></li>
    <!-- 現在地はリンクにせず aria-current="page" を付ける -->
    <li><a href="/products/shoes/running" aria-current="page">ランニング</a></li>
  </ol>
</nav>

区切り文字は CSS で描く(テキストにしない):

/* 区切り文字は CSS の擬似要素で描く(テキストとして読み上げさせない) */
nav[aria-label="パンくずリスト"] ol {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  padding: 0;
}
nav[aria-label="パンくずリスト"] li + li::before {
  content: "/";
  margin-right: 0.5rem;
  color: var(--text-muted);
}

アンチパターン(Bad)

下は <div> とリンク、テキストの「>」だけで作ったパンくずです。見た目は同じですが、ナビゲーションでもリストでもなく、現在地も伝わりません。

div と「>」テキストだけのパンくず

試してみよう:スクリーンリーダーでは nav にジャンプできず、「リスト」とも読まれません。区切りの「>」が「大なり」などと一つずつ読み上げられ、現在地も分かりません。

<!-- ❌ div と「>」テキストだけ -->
<div class="crumbs">
  <a href="/">ホーム</a> &gt;
  <a href="/products">商品一覧</a> &gt;
  <a href="/products/shoes">シューズ</a> &gt;
  <span>ランニング</span>
</div>
<!-- nav も ol/li も無く、現在地も伝わらない -->

悪い例 / 避ける

この実装の問題点:

  • ランドマークが無い<nav> でないので、パンくずへ一発で移動できない。
  • リスト構造が無い<ol>/<li> でないので「何項目あるか」が伝わらない。
  • 現在地が伝わらないaria-current="page" が無く、いまどこにいるか分からない。
  • 区切りが読み上げられる — テキストの「>」が一つずつ読まれ、耳障り。

実装チェックリスト


原文(英語):Breadcrumb Pattern — W3C APG(新しいタブで開きます)