トピックを検索
ランドマークがない、または正しく置かれていないページ
書店のページが div だけで作られているか、ヘッダー、2つ目の main、フッターを1つの main で囲んでいるため、スクリーンリーダーのランドマークの一覧が空になるか、ページのほぼ全体がメインコンテンツだと伝わります。
<div id="content"> 問題
スクリーンリーダー利用者が、ランドマークで本文、メニュー、フッターへ移動できず、どのランドマークにも入っていない内容を聞き逃します。
ある書店のページは、どれも同じレイアウトを使っています。いちばん上の細い帯に「$30以上のご注文で送料無料」とあり、その下にロゴの Harbour Books と4つのリンクのメニュー、次にページごとの本文(ここでは新刊の一覧)、最後に「お問い合わせ」と「返品」のあるフッターが続きます。新刊を見たいスクリーンリーダー利用者は、どのショップでもするように、ページ内の領域へ移動するためにスクリーンリーダーが用意しているランドマークの一覧を開くか、ランドマークからランドマークへ移動するキーを押します。このページでは一覧が空で、キーを押しても何も見つからないため、見出しで移動しない限り、帯、ロゴ、メニューのリンクをすべて上から順に聞くことになります。
その後のリニューアルで、ページは新しいアプリのレイアウトに移り、一覧は「メイン」「ナビゲーション」「メイン」と読むようになりました。最初の「メイン」はページのほぼ全体なので、選ぶとロゴに着きます。2つ目が本文です。ヘッダーとフッターにあたるバナーとコンテンツ情報は一覧になく、送料無料の帯はどのランドマークにも入っていないため、ランドマークごとに移動すると通り過ぎてしまいます。
ページには見て分かる4つの領域があり、1.3.1は見て分かる構造をコードでも伝えることを求めます。HTMLには、ちょうどこれらの領域のための要素があります。ページの最上位にある header はバナーランドマーク、nav はナビゲーションランドマーク、main はメインコンテンツ、最上位にある footer はコンテンツ情報ランドマークです。WCAGの達成方法H101とARIA11は、これらを使って1.3.1を満たします。最初の版は4つすべてに div を使っているため、コードからはどれも伝わりません。
2つ目の版にはランドマークがありますが、置き場所が誤っています。
- レイアウトがすべてを
mainで囲んでいるため、メインランドマークがロゴから始まり、ヘッダーとフッターまで本文として扱います。 main、article、aside、nav、sectionの中にあるheaderやfooterは、バナーやコンテンツ情報のランドマークになりません。そのため、サイトのヘッダーとフッターはランドマークではなくなります。- ページが、レイアウトの
mainの中に自分のmainを加えています。HTMLで認められるのは、隠されていないmainが1つで、その祖先がhtml、body、div、アクセシブルな名前のない form、自律カスタム要素だけの場合です。それでも2つの要素はどちらも main として公開されるため、スクリーンリーダーには2つの「メイン」が並びます。 - 送料無料の帯は外側の
mainより上にあり、どのランドマークにも入っていません。
WCAGはランドマークを十分な達成方法として挙げていますが、必須とはしておらず、ランドマークのないページを失敗とする失敗例もありません。そのため、見出しが同じ構造を伝えていれば、合格とする診断者もいます。この例では、ほかに構造を伝えるものがありません。メニューとフッターには見出しがなく、見出しは本文のものだけです。
どちらの版も見た目は正しいため、目で読む人は誰も気づきません。問題はマークアップにあり、同じレイアウトを使うすべてのページで繰り返されます。
10グループ中2グループに影響
axe には、この問題の多くに対応するルールがあります。どのランドマークにも入っていない内容には region、main のないページには landmark-one-main、入れ子になった2つ目の main には landmark-no-duplicate-main と landmark-main-is-top-level、2回使われたり別のランドマークの中に置かれたりしたバナーやコンテンツ情報には、さらに4つのルールがあります。ただし axe はどれもベストプラクティスに分類しているため、WCAGのルールだけを実行する診断では報告されません。main の中のヘッダーとフッターには、どのルールも気づきません。そこにある header は記事の header と同じく普通の header であるべきなので、axe は対象にしないからです。この診断ツールは、この場合を人の確認に回します。バナーやコンテンツ情報がなく、最初の header や footer が main や区分コンテンツの要素の中にあるページを、確認対象として挙げます。手早い修正は、ランドマークを動かす代わりに足すことがあります。さらに別の囲みに role="main" を付けたり、main の中に残ったヘッダーに role="banner" を付けて本文の中にバナーを作ったり、すべての section にラベルを付けて、誰も移動したくない領域でランドマークの一覧を埋めたりします。各領域が正しいランドマークに入っているか、入れ子の header がサイトのものか記事のものかは、ページと見比べて人が判断する必要があります。
修正方法
ページのすべての領域をランドマークに入れ、ヘッダー、main、フッターを最上位で横に並べます。
- 1各ページに main ランドマークを最上位に1つ置き、本文だけを入れる。
- 2サイトのヘッダーとフッターは、main の外にあるバナーとコンテンツ情報のランドマークにし、それぞれ1つにする。
- 3ヘッダーの上の帯やフッターの後のお知らせも含め、ページのすべてをランドマークに入れる。
Div だけで作られたページ
<div class="top-bar">$30以上のご注文で送料無料</div><div class="header"> <a href="/" class="logo">Harbour Books</a> <div class="menu"> <a href="/fiction">小説</a> <a href="/non-fiction">ノンフィクション</a> <a href="/children">児童書</a> <a href="/events">イベント</a> </div></div><div id="content"> <h1>新刊</h1> <ul class="books">…</ul></div><div class="footer"> <a href="/contact">お問い合わせ</a> <a href="/returns">返品</a></div>Header、nav、main、footer 要素
<div class="layout"> <header> <div class="top-bar">$30以上のご注文で送料無料</div> <a href="/" class="logo">Harbour Books</a> <nav> <a href="/fiction">小説</a> <a href="/non-fiction">ノンフィクション</a> <a href="/children">児童書</a> <a href="/events">イベント</a> </nav> </header> <main id="content"> <h1>新刊</h1> <ul class="books">…</ul> </main> <footer> <a href="/contact">お問い合わせ</a> <a href="/returns">返品</a> </footer></div>この方法を選ぶ理由:まずHTMLの要素を使う
すべての領域が div のため、ページにはランドマークがありません。ランドマークの一覧は空で、ページのすべてがランドマークの外にあります。
ヘッダー、本文、フッターは、main を囲んでもよい div の中に横に並び、main は1つだけです。帯はヘッダーの中に移り、バナーの一部になります。ランドマークの一覧はページの順に「バナー」「ナビゲーション」「メイン」「コンテンツ情報」と読み、ランドマークの外に残るものはありません。
どちらの方法でも、スクリーンリーダーには同じ4つのランドマークが伝わり、1.3.1を満たします。テンプレートを変えられるなら、要素を使ってください。属性を合わせ続ける手間なしに同じことができ、後で main の中に入ってしまった header や footer は、誤った場所のランドマークになるのではなく、ランドマークでなくなるだけで済みます。アクセシビリティツリーではなくHTMLを読むスクリプトやツールにも伝わります。ロールは、スタイルやスクリプトが div.header を指定しているテーマのように、要素を変えられないテンプレートに使い、変えられるようになったら要素に切り替えます。
ページの骨組みは、1つのレイアウトに持たせます。ルートのレイアウトがヘッダー、1つの main、フッターを横に並べて出力し、各ページは本文をその main の中に、自分の div や section で出力します。別の main は加えません。シングルページアプリケーションでは、画面遷移のときも main は残し、中身だけを入れ替えます。hidden 属性のある main は数えられないため、ページ内に複数の画面を持つアプリは、一度に1つだけを表示するなら、画面ごとに main を持てます。
レイアウトが本文の周りに加えるものにも、すべてランドマークを用意します。種類ごとに置き場所があります。
- サイトのヘッダーの上の帯やキャンペーンの告知は、
headerの中に入れ、バナーの一部にします。 - フッターの後に加わるクッキーのお知らせやニュースレターの帯は、名前のある
section(<section aria-label="クッキーのお知らせ">)にして region にするか、ダイアログならダイアログにします。 - 外部のチャットやフィードバックのボタンは、たいてい
bodyの最後に自分のマークアップを加えます。どこに入るかを確認し、どのランドマークの外にもあるなら、提供元に相談するか、読み込む先の入れ物を囲みます。
スキップリンクは、ヘッダーの前に、どのランドマークにも入れずに置いたままでかまいません。利用者が期待する場所であり、axe もそこでは問題にしません。
記事自身の header と footer は、その中にあるのが正しい形です。商品カード、ブログ記事、レビューには、タイトルのある header や日付のある footer があってもかまいません。article や main の中ではバナーにはならず、なるべきでもありません。role="banner" や role="contentinfo" は付けないでください。
ランドマークに名前を付けるのは、必要なときだけです。バナー、メイン、コンテンツ情報が1つずつなら名前は要りません。2つの nav のように同じロールが2回以上現れるときは、区別できない複数のナビゲーションランドマークで説明しているように、それぞれに名前が必要です。section は名前があるときだけ region ランドマークになるため、移動したくなる少数の領域にだけ名前を付け、残りは見出しで区切ります。
現在のブラウザーはこれらの要素をそれぞれのロールに対応させるため、<main role="main"> や <nav role="navigation"> は要素がすでに伝えていることの繰り返しです。余分なロールは付けません。
AI コーディングアシスタントで修正しますか? このガイドを Markdown で取得、または全ガイドをコーディングエージェントで使う。
修正の確認
マウスを使わない4つの確認
確認方法: スクリーンリーダー
OS、ブラウザーと支援技術のバージョン、ビルド、実施日、各手順の実際の結果を記録してください。レイアウトや外部のウィジェットを変更した際は、再度確認します。
制限
このサンプルは、どのアプリケーションでも同じ結果になることを保証するものではありません。パス、クラス名、リストの中の … は仮のものです。ランドマークの一覧の言い回しはスクリーンリーダーによって違い(「コンテンツ情報」「コンテンツインフォ」、後に「ランドマーク」や「領域」が付くもの、付かないもの)、言い回しではなく領域を聞いてください。ランドマークはスクリーンリーダー利用者にヘッダーを飛ばす手段を与え、WCAG 2.4.1もそれを手段の一つとして認めています。しかし、目で見てキーボードで操作する人にはランドマークのキーがないため、その人たちのために繰り返すナビゲーションを飛ばせないスキップリンクで説明しているスキップリンクも必要です。このガイドは、ページに適切なランドマークが適切な場所にあるかを扱います。繰り返すランドマークの名前は区別できない複数のナビゲーションランドマークを、ランドマークの中の見出しは大きさで選ばれ、構造と合わない見出しを参照してください。実際に使用する支援技術で、操作全体を確認してください。
よくある問題を再現した学習用のサンプルです。実在のクライアントの診断結果ではありません。コードは出発点となる実装例のため、実際の製品でも確認してください。ここでは支援技術でのテスト結果は報告していません。
参考資料
- WCAG Understanding: info-and-relationships(新しいタブで開きます)
- WCAG Technique H101(新しいタブで開きます)
- WCAG Technique ARIA11(新しいタブで開きます)
- ARIA APG: landmark-regions(新しいタブで開きます)
- html.spec.whatwg.org: grouping-content(新しいタブで開きます)
- w3.org: html-aam-1.0(新しいタブで開きます)
- developer.mozilla.org: header(新しいタブで開きます)
- dequeuniversity.com: region(新しいタブで開きます)
- dequeuniversity.com: landmark-one-main(新しいタブで開きます)
コードを更新しても、使いやすさを保つために
ガイドの内容を、コーディングエージェントやCIで使える開発ルールにまとめます。更新後は、キーボードとスクリーンリーダーで再テストし、問題が再発していないか確認します。