トピックを検索
区別できない複数のナビゲーションランドマーク
ショップのページに nav 要素が3つあり、2つには名前がなく、1つは「フッターナビゲーション」という名前のため、ランドマークの一覧で「ナビゲーション」が2回読まれ、続けて「フッターナビゲーション ナビゲーション」と読まれます。
<nav> 問題
スクリーンリーダー利用者がページ内のナビゲーションを区別できず、必要なものへ直接移動できません。
ショップの一覧ページに、リンクのまとまりが3つあります。ヘッダーにはメインメニューの「ショップ」「読みもの」「私たちについて」があります。「カテゴリー」という見出しのサイドバーには「キッチン」「バッグ」「文房具」が並びます。フッターには「ヘルプ」という見出しの列があり、「配送」「返品」「お問い合わせ」があります。どのまとまりも、正しく nav 要素に入っています。返品の決まりを探すスクリーンリーダー利用者は、ページ内の領域へ移動するためにスクリーンリーダーが用意しているランドマークの一覧を開き、「バナー」「ナビゲーション」「ナビゲーション」「メイン」「コンテンツ情報」「フッターナビゲーション ナビゲーション」と聞きます。2つの項目は区別できず、3つ目は同じ言葉を繰り返し、どれも「ヘルプ」とは言いません。返品のリンクを見つけるには、一つずつ訪ねるしかありません。
nav 要素はナビゲーションランドマークで、スクリーンリーダーは各ランドマークを名前とロールで一覧にします。ヘッダーとサイドバーの nav には名前がないため、ロールだけが読まれます。フッターの nav には aria-label="フッターナビゲーション" が付いていますが、名前にロールが加わるため「ナビゲーション」が2回読まれます。このラベルは中身ではなく場所を表しており、見える人が使う「ヘルプ」という見出しも無視しています。1.3.1は、見て分かる構造をコードでも伝えることを求めます。ランドマークで1.3.1を満たすWCAGの達成方法ARIA11は、2回以上使うランドマークに固有で意味のある名前があることを確認します。ここで満たしていないのは、その部分です。
見た目のページには何の問題もありません。リンクのまとまりが3つの別々の場所にあり、そのうち2つには見出しもあります。問題は、コードがそれらに付けている名前だけにあります。
10グループ中2グループに影響
axe の landmark-unique は、同じロールで同じ名前のランドマーク、またはどちらも名前のないランドマークを検出します。ただし axe はこれをベストプラクティスに分類しているため、多くの診断では報告されず、ロールを繰り返す名前や見出しを無視した名前には何も言いません。AIによる手早い修正では、すべての nav を「ナビゲーション」「ナビメニュー」「メインナビゲーション」と名付けがちです。固有ではあっても役に立ちません。nav の中の ul に aria-label を付ける修正もありますが、リストはその名前を持てません。すべての section に名前を付け、誰も移動したくない領域でランドマークの一覧を埋めてしまう修正もあります。各名前がその領域の中身を表しているかは、人が判断する必要があります。
試してみる
ランドマークの一覧を使って、ヘルプのリンクへ移動してください。
一覧には、このページでスクリーンリーダーが示すランドマークが出ます。項目を選ぶとそこへ移動します。試す前に、どれに「返品」があるか分かりますか?
問題あり 修正できますか?
新着:キッチンリネン
12点の商品
スクリーンリーダーのランドマーク一覧:
再現デモです。「問題あり」は意図的にアクセシブルでない状態にしています。
修正方法
繰り返し使うランドマークには、中身を表す名前を、見える見出しがあればそこから付けます。
- 12回以上使うランドマークのロールには、インスタンスごとに固有の名前を付ける。
- 2ランドマークの名前は、ロールを含めず、中身を表す一、二語にする。
- 3見える見出しがあれば、aria-labelledby でそこから名前を付ける。
<header> <a href="/" class="logo">Fern & Fold</a> <nav> <ul> <li><a href="/shop">ショップ</a></li> <li><a href="/journal">読みもの</a></li> <li><a href="/about">私たちについて</a></li> </ul> </nav></header><div class="layout"> <nav class="sidebar"> <h2>カテゴリー</h2> <ul>…キッチン、バッグ、文房具…</ul> </nav> <main>…</main></div><footer> <nav aria-label="フッターナビゲーション"> <h2>ヘルプ</h2> <ul>…配送、返品、お問い合わせ…</ul> </nav></footer>各 nav に aria-label を付ける
<header> <a href="/" class="logo">Fern & Fold</a> <nav aria-label="メイン"> <ul>…ショップ、読みもの、私たちについて…</ul> </nav></header><div class="layout"> <nav class="sidebar" aria-label="カテゴリー"> <h2>カテゴリー</h2> <ul>…キッチン、バッグ、文房具…</ul> </nav> <main>…</main></div><footer> <nav aria-label="ヘルプ"> <h2>ヘルプ</h2> <ul>…配送、返品、お問い合わせ…</ul> </nav></footer>2つのナビゲーションランドマークには名前がなく、3つ目は場所にロールを足した名前のため、ランドマークの一覧では区別できません。
各 nav に、ロールを含まず中身を表す短い名前が付き、ランドマークの一覧は「メイン ナビゲーション」「カテゴリー ナビゲーション」「ヘルプ ナビゲーション」と読みます。nav ごとに属性が一つで、コンポーネントのpropsからも簡単に渡せます。サイドバーとフッターの名前は見出しの写しなので、両方を一緒に変える必要があります。また、aria-label を翻訳しない翻訳ツールでは、隣の見出しだけが別の言語に変わります。
どちらの方法でも各ナビゲーションに固有の名前が付き、1.3.1のARIA11を満たすので、一つ目の方法も間違いではありません。それでも、見える見出しがあるランドマークでは見出しを指してください。理由は二つあります。
テキストが一か所で済みます。aria-label では「カテゴリー」が見出しと属性の両方に書かれます。見出しを「部屋から選ぶ」に変えても、属性を直すきっかけはなく、スクリーンリーダーの利用者だけが、画面のどこにもない「カテゴリー」という名前を聞き続けます。
名前がページと一緒に翻訳されます。ブラウザのページ翻訳は見出しのテキストを訳しますが、aria-label を訳さないことが多く、翻訳したページでもランドマークの一覧だけ元の言語のまま残ります。見出しから取った名前は見出しそのものなので、一緒に変わります。
この例のヘッダーの nav のように見える見出しがないランドマークや、共有コンポーネントが見出しに id を受け取れない場合は、aria-label を使ってください。
名前にロールを入れない。 ロールはスクリーンリーダーが加えるため、aria-label="メイン" で「メイン ナビゲーション」と読まれます。「領域」「メニュー」「ランドマーク」も同じです。文章の中で呼ぶように、領域の中身を一、二語で名付けます。
一度しか現れないランドマークに名前は要らない。 ページには通常、最上位の header(バナー)、main、footer(コンテンツ情報)が一つずつあり、これらに名前は要りません。名前が必要なのは、同じロールが2回以上現れるときです。たとえば複数の nav や aside、ヘッダーと検索結果ページの両方にある search 要素です。
名前を付けた section はランドマークになる。 section 要素は名前があるときだけ region ランドマークになるため、すべての section にラベルを付けるとランドマークの一覧があふれます。移動したくなる少数の領域にだけ名前を付け、残りは見出しに任せます。
内容が同じナビゲーションは名前を共有できる。 同じページ送りが結果一覧の上と下にあるとき、2つの nav は同じリンクを持ちます。ARIA Authoring Practicesは、どちらを使っても同じことができるため、「ページ送り」のように同じ名前を付けることを認めています。
名前はランドマークに付ける。 名前は nav、aside、section、form そのものに付けます。ランドマークの中の ul、ロールのない div、見出しは名前を上に渡せません。ロールのない div のラベルは、多くのスクリーンリーダーが無視します。
コンポーネント。 何か所かで使う共通のナビゲーションコンポーネントには、名前を必須のpropsにするか、見出しの id を渡せるようにし、インスタンスごとに違う名前が付くようにします。コンポーネント単体ではなく、出力されたページで確認してください。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得
修正の確認
マウスを使わない3つの確認
確認方法: スクリーンリーダー
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。ナビゲーションを追加したときや共通のレイアウトを変更した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。パス、クラス名、リストの中の … は仮のものです。ランドマークの一覧の言い回しはスクリーンリーダーによって違い、名前より先にロールを読むものもあるため、言い回しではなく名前を聞いてください。このガイドはランドマークの名前を扱い、ページに適切なランドマークがあるか、ランドマークの外に内容が残っていないかは扱いません。実際に使用する支援技術で、操作全体を確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。