トピックを検索
現在のページを見た目だけで示すパンくずリスト
ショップのパンくずリストはdivに並べただけのリンクで、最後のパンくずはクラスで灰色にしているだけです。そのため、スクリーンリーダーではパンくずリストであることも、どれが今いるページかも分かりません。
<a href="/kitchen/mugs" class="current">Mugs</a> 問題
スクリーンリーダー利用者は、パンくずリストがどこから始まりどこで終わるのか、どのパンくずが今いるページかが分かりません。それを示しているのがレイアウトと灰色だけだからです。
ショップのマグカップのカテゴリーページは、Home / Kitchen / Mugsというパンくずリストで始まります。見慣れた、すっきりしたデザインです。HomeとKitchenは下線付きの青いリンクで、今いるページのMugsは下線のない灰色です。目で見る人は、検索エンジンから来ても、KitchenのなかのMugsにいること、クリック一つで上の階層へ戻れることがすぐに分かります。
スクリーンリーダーの利用者がTabキーで同じページを移動すると、「Home、リンク」「Kitchen、リンク」「Mugs、リンク」と聞こえます。Mugsが今いるページであることも、三つのリンクがパンくずリストであることも伝わりません。1行ずつ読むと、パンくずの間のスラッシュも読まれることがあります。パンくずリストはナビゲーションとして読み上げられず、スクリーンリーダーのランドマーク一覧にも出ないので、そこへ移動することもできません。ヘッダーのリンクに続く、ただの三つのリンクです。
パンくずリストは関係を示しています。そのリンクはサイト内を移動するためのまとまりで、トップページからこのページまで順に並び、最後の一つが表示中のページです。WCAG 1.3.1「情報及び関係性」は、見た目で示した情報をコードかテキストでも伝えることを求めています。この例では、まとまりはレイアウトにしかありません。パンくずリストは div で、支援技術に対しては何もまとめないからです。達成方法H97は、関連するリンクを nav に入れることで1.3.1を満たします。順序も一行の文字の並びにしかなく、パンくずがいくつあるかを伝えるリストがありません。現在のページも見た目にしかありません。current クラスはMugsを灰色にするだけで、ブラウザーにとって意味がないためです。
パンくずリストは、ショップのカテゴリーや商品ページ、ヘルプセンター、ドキュメントのサイトなど、ほぼどのサイトにもあります。たいていは一つの共通コンポーネントから作られるため、一か所直せばすべてのページに届きます。特に重要なのは、検索エンジンや共有されたリンクから来たページです。パンくずリストが、どこに着いたかを知るいちばんの近道になります。階層の深い大きなサイトでも同じです。
10グループ中1グループに影響
- 全盲 (影響あり)
- 弱視 (影響なし)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響なし)
- 届く範囲・力 (影響なし)
- 認知 (影響なし)
- 光過敏 (影響なし)
- 視覚を使わない スクリーンリーダーではパンくずがばらばらのリンクとして読まれるため、パンくずリストであることも、どれが今いるページかも分からず、ランドマーク一覧から移動することもできません。検索エンジンから来た人は、どこに着いたかを知るいちばんの近道を失います。
自動チェックは、名前のあるリンクが三つあるとして合格にします。current や active といったクラス名には意味がないので、一つのリンクが現在地として装飾されていることは分かりません。div に並んだリンクがパンくずリストであることも分かりません。EaseWebの診断では、クラスや名前からパンくずリストと分かる場所で、表示中のページへのリンクが隣のパンくずと違う見た目なのに、aria-current も現在のページだと伝えるテキストもないものを報告します。ナビゲーションのランドマークの外にあるパンくずリストは、そのリンクを添えて、人が確認する項目として渡します。AIによるコード生成もこの穴を確実には埋めません。Aaron Gustafsonが2025年に公開したGPT-4の検証では、nav に名前がなく、aria-current="page" もないパンくずリストが生成されました。二つのページでパンくずリストを聞いて確かめてください。
修正方法
パンくずリストを名前付きのnavに入れ、現在のページをコードで示すか、パンくずリストに含めないようにします。
- 1パンくずリストは、固有の短い名前を付けた
navに番号付きリストとして入れる。 - 2最後のパンくずには
aria-current="page"を付けて見た目もそこから設定するか、パンくずリストを一つ上の階層で終える。 - 3区切りはテキストを使わずCSSで描くか隠し、読み上げられないようにする。
<div class="breadcrumbs"> <a href="/">Home</a> <span class="sep">/</span> <a href="/kitchen">Kitchen</a> <span class="sep">/</span> <a href="/kitchen/mugs" class="current">Mugs</a></div><h1>Mugs</h1>名前付きのnav、リスト、aria-current
<nav class="breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/">Home</a> </li> <li> <a href="/kitchen">Kitchen</a> </li> <li> <a href="/kitchen/mugs" aria-current="page">Mugs</a> </li> </ol></nav><h1>Mugs</h1>この方法を選ぶ理由:クラスではなく状態から見た目を決める
current クラスはMugsの見た目を変えるだけで、div も何もまとめません。スクリーンリーダーは「Home、リンク」「Kitchen、リンク」「Mugs、リンク」と読み、句読点の読み上げ設定によっては間のスラッシュも読みます。
デザインは変わりません。どのパンくずも描かれたとおりに見えます。パンくずリストは固有の名前を持つ nav になったため、スクリーンリーダーは入るときに「Breadcrumb、ナビゲーション」と読み、ランドマーク一覧にも並びます。番号付きリストにもなり、「リスト、3項目」として上から順に読まれます。Mugsに付けた aria-current="page" により、スクリーンリーダーはそこで「現在のページ」と読みます。灰色もこの属性で選ぶため、見た目とコードが別のパンくずを示すことはありません。区切りは境界線で描いた細い斜線なので、スクリーンリーダーが読むテキストはありません。
どちらも1.3.1を満たします。デザインに最後のパンくずがあるとき、またはパンくずリストの下の見出しが離れていたり、パンくずと言葉が違ったりするときは、最後のパンくずを残して aria-current="page" を付けてください。デザインは描かれたとおりのまま、見た目は属性から決まります。見出しがすぐ下にあり、同じ言葉を示すときは、一つ上の階層で終えてください。どのパンくずもどこかへ行くリンクになり、合わせておく状態もありません。
修正の周りにも、判断が必要な点があります。
- テキストの最後のパンくず:ARIA Authoring Practicesの例では、ここと同じく最後のパンくずを
aria-current="page"を付けたリンクにしています。aria-current="page"を付けたテキストのパンくずでも1.3.1を満たし、ページを再読み込みするだけのリンクを減らせます。 - 属性の代わりの隠したテキスト:テーマやCMSでパンくずの文字は変えられても属性は付けられない場合は、「(現在のページ)」のような視覚的に隠したテキストを中に加えます。メニューについては現在のページを見た目だけで示すナビゲーションで説明しています。
- 区切り:テキストを使わず、境界線や背景画像としてCSSで描くか、マークアップに入れて
aria-hidden="true"で隠します。contentに"/"や"›"などのテキストを書くと、ほとんどのブラウザーでスクリーンリーダーに読まれます。 - 名前:スクリーンリーダーが「ナビゲーション」を補うので、「Breadcrumb」で足ります。区別できない複数のナビゲーションランドマークを参照してください。
- リスト:SafariのVoiceOverは、CSSでマーカーを消したリストをリストとして読まないことがありますが、ここのように
navの中にあるリストはリストのまま読みます。navの外に置くパンくずリストでは、olにrole="list"を加えます。 - シングルページアプリ:画面遷移でページを読み込まずに入れ替えるときは、パンくずリストも作り直し、
aria-currentも一緒に移します。読み上げられないSPAの画面遷移を参照してください。
Windowsのコントラスト テーマでも現在のパンくずが見分けられるようにします。強制配色ではどのリンクも同じ色になるため、灰色だけで区別したパンくずはほかと同じに見えます。下線がない、あるいは太字にしたパンくずなら、区別が残ります。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得、または全ガイドをコーディングエージェントで使う。
修正の確認
マウスを使わない5つの確認
確認方法: スクリーンリーダー、キーボード、強制配色
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。共通のパンくずリストのコンポーネントを変更した際は、再度確認します。
制限
このサンプルは、どのサイトでも同じ結果になることを保証するものではありません。aria-current やランドマークの読み上げ方はスクリーンリーダーによって異なり、句読点の読み方は設定で変わります。利用者が使うスクリーンリーダーで確かめてください。パンくずリストが役に立つのは、サイトの実際の構造に沿っているときだけです。来た経路で変わったり、階層を飛ばしたりするパンくずリストは、ないのと同じくらい迷わせます。長い一覧の最後にあるページのリンクには、別の問題があります。現在のページも行き先も伝えないページネーションを参照してください。サイトのメインメニューも、同じ属性で現在のページを示します。現在のページを見た目だけで示すナビゲーションを参照してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
参考資料
- WCAG Understanding: info-and-relationships(新しいタブで開きます)
- WCAG Technique H97(新しいタブで開きます)
- ARIA APG: breadcrumb(新しいタブで開きます)
- developer.mozilla.org: aria-current(新しいタブで開きます)
- design-system.service.gov.uk: breadcrumbs(新しいタブで開きます)
- aaron-gustafson.com: identifying-accessibility-data-gaps-in-codegen-models(新しいタブで開きます)
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。