ナビゲーション
パンくずリスト
解説ありBreadcrumb
サイト内の現在位置を示すナビ。nav とリスト、現在地の aria-current が肝。
パンくずリスト(breadcrumb)とは?
パンくずリストは、「ホーム > 商品一覧 > シューズ > ランニング」のように、いまサイトのどの階層にいるかを示し、上の階層へ素早く戻れるようにするナビゲーションです。 ページ上部によく置かれます。
見た目はただのリンクの並びですが、支援技術には 「これはナビゲーションで、順序のあるリストで、最後が現在地」という構造を 正しく伝えることが大切です。
なぜアクセシビリティが大事なの?
- スクリーンリーダー利用者は、
<nav>でラベル付けされていれば ランドマーク移動でパンくずに一発でジャンプできます。<ol>なら「リスト 4項目」と読み上げられ、階層の深さも分かります。 - 最後の項目を
aria-current="page"にすると「現在のページ」と読み上げられ、いまどこにいるかが明確になります。リンクにしないことで「同じページへの無意味なリンク」も避けられます。 - 区切りの「
>」や「/」をテキストで入れると、 一文字ずつ読み上げられて耳障りです。CSS の擬似要素で描けば読み上げられません。
ライブデモ(推奨実装)
下が APG に沿ったパンくずです。リンクは Tab で順に移動でき、 最後の「ランニング」は現在地なのでリンクになっていません。
試してみよう:Tab でリンクを順に移動。最後の「ランニング」にはフォーカスが当たらない(現在地はリンクにしないため)。スクリーンリーダーでは「ナビゲーション, リスト, 4項目, …現在のページ」と読まれます。
ポイント
aria-current="page" を付けたリンクは「現在のページ」と読み上げられます。 現在地は href 付きのリンクにせず、ただのテキスト、またはaria-current 付きの非リンク要素にするのが一般的です(このデモでは挙動確認のためa に aria-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> とリンク、テキストの「>」だけで作ったパンくずです。見た目は同じですが、ナビゲーションでもリストでもなく、現在地も伝わりません。
試してみよう:スクリーンリーダーでは nav にジャンプできず、「リスト」とも読まれません。区切りの「>」が「大なり」などと一つずつ読み上げられ、現在地も分かりません。
<!-- ❌ div と「>」テキストだけ -->
<div class="crumbs">
<a href="/">ホーム</a> >
<a href="/products">商品一覧</a> >
<a href="/products/shoes">シューズ</a> >
<span>ランニング</span>
</div>
<!-- nav も ol/li も無く、現在地も伝わらない -->悪い例 / 避ける
この実装の問題点:
- ランドマークが無い —
<nav>でないので、パンくずへ一発で移動できない。 - リスト構造が無い —
<ol>/<li>でないので「何項目あるか」が伝わらない。 - 現在地が伝わらない —
aria-current="page"が無く、いまどこにいるか分からない。 - 区切りが読み上げられる — テキストの「>」が一つずつ読まれ、耳障り。
実装チェックリスト
- 外側を
<nav aria-label="…">で囲んでいる - 中身は
<ol>><li>の順序付きリスト - 各階層は
<a href>(キーボードで移動できる) - 現在地は
aria-current="page"を付け、リンクにしていない - 区切り文字は CSS の擬似要素で描き、テキストにしていない
- フォーカスリングを消していない