トピックを検索
ページによって順序や名前が変わるナビゲーション
ショップのJournalは別のブログサービスで、ショップのヘッダーを写して作られています。時間とともにその写しでは、Journalがメニューの先頭に移り、BasketがCartという名前に変わりました。
<a href="/basket">Cart</a> 問題
メニューのリンクの場所と名前を覚えた人が、一部のページでそれが動いたり名前が変わったりしているのに出会います。
ある生活雑貨のショップのページは、共通のヘッダーを使っています。ロゴ、Shop、Sale、Journal、Aboutのメニュー、そしてAccountとBasketです。レシピや読み物を載せるJournalは別のブログサービスで動いていて、ヘッダーはブログを作ったときにショップのものを写しました。それ以来、どちらも別々に手直しされてきました。Journalでは「Journalのページだから」とメニューの先頭がJournalになり、同じページへ行く買い物かごのリンクはCartと書かれています。ショップでメニューを使っていた人がJournalの記事へ移ると、リンクの順序が違い、Basketが見当たりません。
同じずれは、ほかの形でも起きます。
- メニューを人気順やページの内容に合わせて並べ替えるため、同じリンクがページによって違う順序になる。
- 検索ボタンが、ほとんどのページでは「検索」、検索結果のページでは「Go」になっている。
- アイコンのボタンの名前が、ほとんどのページとほかのチームが作ったページで違う。たとえば「メニューを開く」と「ナビゲーション」。
レベルAAの2つの達成基準が、これを扱います。3.2.3「一貫したナビゲーション」は、複数のページで繰り返されるナビゲーションは、利用者が変えた場合を除き、毎回同じ相対的な順序で現れることを求めています。3.2.4「一貫した識別性」は、複数のページで同じ働きをする部品は一貫して識別されることを求めています。同じ働きなら、同じ名前です。
同じ相対的な順序は、まったく同じという意味ではありません。Journalのカテゴリーのようにリンクを足したり、今いるページへのリンクのように省いたりしても、ほかのページと共通するリンクが同じ順序なら適合します。この例では、共通する2つのリンクが入れ替わっています。ショップのページではJournalがSaleの後にあり、JournalのページではShopの前にあります。これは失敗例F66に当たります。
一貫していることも、まったく同じという意味ではありません。商品を入れた後の「Basket (2)」は、やはりBasketです。しかし、BasketとCartは1つのリンクの2つの名前で、失敗例F31に当たります。同じものだと分からない人もいます。ページ群を決めるのは、共通の目的と、同じ作成者や組織が作っていることで、ページを出すサービスではありません。Journalはショップ自身のもので、ショップのアドレスにあり、ショップのヘッダーの写しを使っているため、同じページ群に入ります。
いちばん違いが出やすいのは、ブログ、ヘルプセンター、店舗検索など、よそで作られ、それぞれがヘッダーの写しを持つページです。
10グループ中4グループに影響
- 全盲 (影響あり)
- 弱視 (影響あり)
- 色覚 (影響なし)
- ろう (影響なし)
- 難聴 (影響なし)
- 発話 (影響なし)
- 手の操作 (影響あり)
- 届く範囲・力 (影響なし)
- 認知 (影響あり)
- 光過敏 (影響なし)
- 言語・認知・学習の能力が限られる リンクの場所と名前を覚えて使う人は、いつもの場所でBasketを探し、そこにCartや別のリンクを見つけます。CartがBasketと同じものだと分からないこともあり、違うページのたびに時間がかかり、自信を失います。
- 視覚が限られる 画面拡大ソフトの利用者は、一度に数個のリンクしか見えず、前にあった場所へまっすぐ向かいます。メニューの順序が変わっていると、少しずつ見て探し直すしかありません。
- 視覚を使わない スクリーンリーダー利用者は、サイトのリンクの順序を覚え、記憶を頼りに飛ばしたり、リンクの一覧で頭文字を押してリンクへ移動したりします。順序や名前が変わると、そのどちらも使えなくなります。
- 手の操作が限られる キーボード利用者は、よく使うリンクに決まった回数のTabキーで届きますが、メニューの順序が変わると、その回数がページごとに変わります。音声操作の利用者はリンクの名前を言います。一部のページでBasketがCartと呼ばれていると、そこでは「Basketをクリック」が何もしません。
どのページのメニューも単独では問題がなく、axeなどの自動チェックは1ページずつ調べます。3.2.3と3.2.4を扱うルールはありません。EaseWebの診断は、一回の実行で調べたページどうしを比べます。ヘッダー、ナビゲーションメニュー、フッターで繰り返される2つのリンクが、一部のページと別のページで逆の順序になっている場合と、同じアドレスへのリンクの名前が、多くのページでの名前と1語も共通しない場合を報告します。実行で開かなかったページや mainランドマークがちょうど1つではないページのリンク、同じ働きを別の名前で持つボタン、CSSだけで起きる変化は見分けられません。渡されたページしか比べないため、Journalも対象に含める必要があります。AIのコードアシスタントに「ブログにヘッダーを付けて」と頼むと、見たものから新しいヘッダーを書き、独自の順序と言葉にしてしまうことがあります。
修正方法
どのページでも、1つのリンクの一覧から、同じヘッダーとフッターを出します。
- 1繰り返されるリンクは、どのページでも同じ順序に保つ。足したり省いたりはしてよいが、入れ替えない。
- 2同じ場所へのリンクには、どのページでも同じ名前を付ける。
- 3どのサービスのページでも、ヘッダーとフッターを1つの元から作る。
<!-- Every shop page --><header class="site-header"> <a href="/" class="logo">Fernhill</a> <nav aria-label="Main"> <a href="/shop">Shop</a> <a href="/sale">Sale</a> <a href="/journal">Journal</a> <a href="/about">About</a> </nav> <a href="/account">Account</a> <a href="/basket">Basket</a></header><!-- Every shop page --><header class="site-header"> <a href="/" class="logo">Fernhill</a> <nav aria-label="Main"> <a href="/shop">Shop</a> <a href="/sale">Sale</a> <a href="/journal">Journal</a> <a href="/about">About</a> </nav> <a href="/account">Account</a> <a href="/basket">Basket</a></header>2つのヘッダーには同じリンクがありますが、Journalはメニューの先頭に移り、買い物かごへのリンクはCartと呼ばれています。どちらのヘッダーも単独では正しく、並べると両方の基準を満たしません。
どちらのサービスも同じ2つの一覧からヘッダーを作るため、Journalだけが自分のリンクを先頭に置いたり、買い物かごのリンクを別の名前で呼んだりするには、すべてのページを変えることになります。Journalのページでは、Journalのリンクが現在のページとして示されます。見た目や読み上げは変わり得ますが、位置は変わりません。示し方は現在のページを見た目だけで示すナビゲーションで説明しています。カテゴリーの並びなど、Journalにさらに必要なものがあれば、共通のメニューの後に足します。リンクを足しても、共通するリンクの順序は保たれます。
ブログが共通のヘッダーをどう受け取るかは、サービスによって違います。
- ショップ自身のコードが表示するブログ:ほかのすべてのページと同じく、ショップのヘッダーのコンポーネントを使う。
- 独自のテンプレートを持つブログサービス:写しを手直しするのではなく、ビルド時に同じ一覧からヘッダーを生成するか、ショップが公開するファイルから一覧を読み込ませる。
- ヘルプセンターなど、HTMLしか受け付けない外部のサービス:ショップが出力したヘッダーを貼り付け、一覧が変わるたびに貼り直す。写しをそろえ続ける仕組みがないため、3つの中でいちばん弱い方法です。メニューを変えるたびに確認してください。
順序は固定します。人気順、今週のセール、ページの属するセクションで並べ替えるメニューは、リンクがすべて同じでも、ページによって順序が変わります。変わるリンクは、繰り返されるメニューの外の、別の場所にまとめてください。
名前も、アイコンのボタンのアクセシブルな名前も、どのテンプレートでもそろえます。「Basket (2)」のように件数を加えるのは問題ありません。名前が何であるかを言い続けているからです。違う言葉は、書いた人には同じ意味でも問題です。1つを選び、フッターやスマートフォンのメニューも含めて、どこでもそれを使ってください。
スマートフォンでは、メニューがメニューボタンの中に入ることがよくあります。これは別のレイアウトなので、同じ幅のページどうしで比べます。ただし、その幅でもどのページでもリンクの順序と名前をそろえる必要があります。
一部のページだけ、CSSの order、flex-direction: row-reverse、グリッドの配置でメニューを並べ替えないでください。スクリーンリーダーとキーボードはソースの順序に従うため、見た目はそろっていても読まれる順序はそろわず、その逆も起きます。
ヘルプのリンクや連絡先も同じで、3.2.6はそれを同じ場所に置くことを求めています。ページごとに場所が変わるヘルプリンクを参照してください。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得、または全ガイドをコーディングエージェントで使う。
修正の確認
マウスを使わない5つの確認
確認方法: スクリーンリーダー、キーボード、ズーム
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。メニュー、テンプレート、サイトが使うサービスを変更した際は、再度確認します。
制限
このサンプルは、どのサイトでも同じ結果になることを保証するものではありません。この基準が求めるのは一貫性で、メニューのよさではありません。どこでも同じリンクでも、分かりにくいことはあります。対象は一つのページ群なので、別の人たちが書き、ナビゲーションも異なるサブドメインのブログのように、それ自体が別のページ群になるサイトは、一貫していれば独自のメニューを持てます。リーダー表示や、設定で並べ替えたメニューのように、利用者自身が起こす変化は認められています。サイト全体を、ページの種類ごとに、利用者が頼る人や道具と一緒に確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。