ナビゲーションと情報設計のアクセシビリティ完全ガイド:ランドマーク・見出し・スキップリンク・メガメニュー・パンくず・検索まで
概要サマリー(先に要点)
- **情報設計(IA)**を“読み順と移動の地図”として整え、ランドマーク・見出し・スキップリンクで最短到達を実現。
- グローバルナビ/メガメニュー/パンくず/検索/サイトマップ/ページ内目次をネイティブHTML+最小ARIAで堅牢に。
- キーボード操作・フォーカス可視・レスポンシブを前提に、色・形・テキストの重複伝達で迷子を防止。
- 404/メンテ中/結果0件の“迷子ページ”にも、帰還導線・言語トーン・代替手段を用意。
- 実装サンプル(HTML/CSS/JS)・運用チェックリスト・テスト手順(5分スモーク)まで収録。
対象読者(具体):UI/UXデザイナー、フロントエンドエンジニア、情報アーキテクト、編集・コンテンツデザイナー、PM/Webディレクター、QA/アクセシビリティ担当
アクセシビリティレベル:WCAG 2.1 AA 準拠(可能箇所は 2.2 のターゲットサイズ等も推奨)
1. はじめに:ナビゲーションは“地図”であり“ショートカット”
Webのアクセシビリティは、色やコントラスト、ラベルだけでは完結しません。目的地にすばやく着くための地図とショートカット、つまり情報設計(IA)とナビゲーションの作り込みが欠かせませんの。
利用者は多様です。スクリーンリーダー・拡大鏡・キーボード・音声入力、そしてモバイルの片手操作。ランドマーク(header/nav/main/aside/footer
)と見出し構造(h1–h6
)が整っていると、誰もが最短経路で目的の情報にたどり着けます。さらに、スキップリンクがあれば繰り返しのメニューを飛ばして本文へ直行できます。
本ガイドでは、グローバルナビ/メガメニュー/パンくず/検索/ページ内目次/サイトマップまで、設計と実装の“型”をお届けしますね。
2. 骨格をつくる:ランドマーク+見出し+スキップリンク
2.1 ランドマークの基本
- ページの主な領域を
header
/nav
/main
/aside
/footer
で明示。 - 複数ある
nav
やaside
にはaria-label
で役割名を付与(例:<nav aria-label="グローバル">
)。
<a class="skip" href="#content">本文へスキップ</a>
<header>…ロゴ/検索…</header>
<nav aria-label="グローバル">…主要ナビ…</nav>
<main id="content">…ページ固有の本文…</main>
<aside aria-label="関連情報">…関連記事…</aside>
<footer>…フッターリンク…</footer>
.skip { position:absolute; left:-9999px; top:auto; }
.skip:focus { left:1rem; top:1rem; background:#111; color:#fff; padding:.5rem .75rem; border-radius:.5rem; }
2.2 見出しの“階段”を崩さない
- ページに**
h1
は1つ**。以降、内容の論理に沿って**h2 → h3 …
**。 - 視覚の大きさではなく意味の階層で決め、スタイルはCSSで調整。
2.3 スキップリンクの目的
- キーボード利用者の繰り返し操作を削減。最初の
Tab
で現れるのが理想。 main
側にtabindex="-1"
を置き、フォーカス移動を確実に。
<main id="content" tabindex="-1">…</main>
3. グローバルナビゲーション:最小ARIAで堅牢に
3.1 シンプルなナビ(推奨)
- まずは
<nav><ul><li><a>
のネイティブ構造。 - 現在地は
aria-current="page"
で重複伝達(色+テキスト+属性)。
<nav aria-label="グローバル">
<ul>
<li><a href="/" aria-current="page">ホーム</a></li>
<li><a href="/products">製品</a></li>
<li><a href="/pricing">価格</a></li>
<li><a href="/docs">ドキュメント</a></li>
</ul>
</nav>
3.2 ドロップダウン(ディスクロージャ)
- トリガは
<button>
。開閉状態はaria-expanded
、対象にaria-controls
。 - フォーカストラップは不要(メニュー内巡回に閉じない)。
Esc
で閉じ、トリガへ復帰。
<nav aria-label="グローバル">
<ul>
<li class="has-sub">
<button aria-expanded="false" aria-controls="p1" id="b1">製品</button>
<div id="p1" role="region" aria-labelledby="b1" hidden>
<ul>
<li><a href="/products/a">A</a></li>
<li><a href="/products/b">B</a></li>
</ul>
</div>
</li>
</ul>
</nav>
<script>
const btn = document.getElementById('b1'), panel = document.getElementById('p1');
btn.addEventListener('click', () => {
const open = btn.getAttribute('aria-expanded')==='true';
btn.setAttribute('aria-expanded', String(!open));
panel.hidden = open;
});
document.addEventListener('keydown', e=>{
if(e.key==='Escape' && btn.getAttribute('aria-expanded')==='true'){
btn.click(); btn.focus();
}
});
</script>
注意:Webのサイトナビに
role="menu"
は原則不要です。アプリケーションメニューを意味し、矢印キー移動など別の期待挙動を生み混乱します。
4. メガメニュー:情報量を“圧縮して届ける”型
4.1 設計の原則
- 列見出しを
h3
相当の可視テキストで、アイコンは補助。 - 最大3列程度、各列に5〜7リンク。“全部見せない”勇気が可読性を上げます。
- 開閉はホバーではなくクリックを既定に(モバイル・キーボードで安定)。
4.2 実装骨格(最小)
<li class="mega">
<button aria-expanded="false" aria-controls="mega-products" id="megaBtn">製品</button>
<div id="mega-products" role="region" aria-labelledby="megaBtn" hidden>
<div class="col">
<h3>はじめての方へ</h3>
<ul>
<li><a href="/getting-started">導入ガイド</a></li>
<li><a href="/tutorials">チュートリアル</a></li>
</ul>
</div>
<div class="col">
<h3>製品ライン</h3>
<ul>
<li><a href="/products/a">A</a></li>
<li><a href="/products/b">B</a></li>
</ul>
</div>
<div class="col">
<h3>サポート</h3>
<ul>
<li><a href="/docs">ドキュメント</a></li>
<li><a href="/contact">お問い合わせ</a></li>
</ul>
</div>
</div>
</li>
.mega [role="region"] { display:grid; grid-template-columns: repeat(3, minmax(10rem, 1fr)); gap:1rem; }
.mega [role="region"][hidden] { display:none; }
.mega h3 { font-size:1rem; margin:.5rem 0; }
5. パンくずリスト:現在地の“短い経路”
nav[aria-label="パンくず"]
内で<ol>
を使用、階層・順序を明示。- 最後の項目は
aria-current="page"
を付与、リンクは不要(非リンク可)。
<nav aria-label="パンくず">
<ol>
<li><a href="/">ホーム</a></li>
<li><a href="/products">製品</a></li>
<li aria-current="page">Aの詳細</li>
</ol>
</nav>
6. サイト内検索:フォームと結果のアクセシビリティ
6.1 検索フォーム
- 可視ラベル(プレースホルダー代用は不可)。
type="search"
+autocomplete="on"
、送信ボタンを明示。- 結果ページへの**スキップリンク(“検索結果へ”)**を用意。
<form role="search" action="/search">
<label for="q">サイト内検索</label>
<input id="q" name="q" type="search" autocomplete="on">
<button>検索</button>
</form>
6.2 結果リスト
- 結果数を見出し近くに提示(例:「125件 見つかりました」)。
- ハイライトは色だけに頼らず、太字/下線も併用。
- ページネーションは
nav[aria-label="ページネーション"]
、現在ページはaria-current="page"
。
<nav aria-label="ページネーション">
<ul>
<li><a href="?page=1">1</a></li>
<li><a aria-current="page">2</a></li>
<li><a href="?page=3">3</a></li>
</ul>
</nav>
7. ページ内目次(ToC)とセクションジャンプ
- 長文ページでは冒頭に目次(
<nav aria-label="ページ内目次">
)。 - 各見出しにIDを付け、リンクはスムーズスクロール+フォーカス移動で迷子を防止。
<nav aria-label="ページ内目次">
<ol>
<li><a href="#sec-1">1. はじめに</a></li>
<li><a href="#sec-2">2. 設計原則</a></li>
</ol>
</nav>
<h2 id="sec-1" tabindex="-1">はじめに</h2>
:target { scroll-margin-top: 6rem; } /* 固定ヘッダー分の余白確保 */
8. フッターとサイトマップ:最後の安全網
- フッターは主要カテゴリーの要約と連絡先・アクセシビリティ方針を含めます。
- サイトマップは
nav[aria-label="サイトマップ"]
で、2階層程度に留め視覚密度を抑える。
9. モバイルのナビゲーション:タッチ・ズーム・レスポンシブ
- ターゲットサイズ 44–48px を目安に、隣接間隔も確保。
user-scalable=no
は使わずズーム許可。- ドロワー開閉は
<button aria-expanded>
、ラベルは**「メニューを開く/閉じる」**。 - 縦横の強制を避ける(Orientation)。
- メガメニューはアコーディオン化し、1段ずつ開閉で負荷を軽減。
10. コントラスト・フォーカス・状態表示:非テキストも見えるように
- テキスト 4.5:1、非テキスト(アイコン・境界)3:1 を目安に。
- フォーカス指標は 太さ+色+アウトラインオフセットで見失わない。
- 現在地は 色+下線+
aria-current
で重複伝達。
a[aria-current="page"] { font-weight:700; text-decoration:underline; }
:focus-visible { outline:3px solid #FF9900; outline-offset:3px; }
11. “迷子”ページの設計:404/メンテ中/0件
- 404:
- やさしい文体で何が起きたかと次に取れる行動(検索、トップ、人気ページ)を提示。
- スクリーンリーダー向けに
<h1>ページが見つかりません
を明示。
- メンテ中:
- 再開見込み・影響範囲・緊急連絡先をテキストで。
- 検索0件:
- 代替案(スペル・関連語・人気クエリ)を提示、カテゴリから探す導線を併置。
12. “やってはいけない”パターンと回避策
アンチパターン | 問題 | 回避策 |
---|---|---|
グロナビに role="menu" |
期待挙動が変わり混乱 | ネイティブ nav/ul/li/a +最小ARIA |
プレースホルダー=ラベル | ラベルが消え意味不明 | 可視ラベル必須、例示はヒントへ |
ホバーだけで展開 | モバイル・キーボード不可 | ボタンで開閉、aria-expanded |
現在地が色だけ | 色覚多様性で不明瞭 | aria-current +下線等の重複 |
スキップリンク欠如 | 繰り返し操作が負担 | 最初のTabで表示、main へ移動 |
固定ヘッダーでアンカー隠れ | 見出しが隠れて迷子 | :target { scroll-margin-top } |
0件に何もなし | 行き止まり | 代替案・人気リンク・問い合わせ |
13. テンプレ:ミニマルなヘッダー&ナビ(コピペOK)
<header class="site-header">
<a class="logo" href="/">Brand</a>
<button id="menuBtn" aria-expanded="false" aria-controls="gNav">メニュー</button>
<nav id="gNav" aria-label="グローバル" hidden>
<ul>
<li><a href="/" aria-current="page">ホーム</a></li>
<li><a href="/products">製品</a></li>
<li><a href="/pricing">価格</a></li>
<li><a href="/docs">ドキュメント</a></li>
</ul>
</nav>
<form role="search" action="/search" class="search">
<label for="q" class="sr-only">サイト内検索</label>
<input id="q" name="q" type="search" placeholder="キーワードを入力">
<button>検索</button>
</form>
</header>
<script>
const b = document.getElementById('menuBtn'), nav = document.getElementById('gNav');
b.addEventListener('click', ()=>{
const open = b.getAttribute('aria-expanded')==='true';
b.setAttribute('aria-expanded', String(!open));
nav.hidden = open;
if(!open) nav.querySelector('a')?.focus();
});
document.addEventListener('keydown', e=>{
if(e.key==='Escape' && b.getAttribute('aria-expanded')==='true'){ b.click(); b.focus(); }
});
</script>
.sr-only{ position:absolute; left:-9999px; }
.site-header{ display:grid; grid-template-columns:auto 1fr auto; gap:1rem; align-items:center; }
#gNav ul{ display:flex; gap:1rem; list-style:none; padding:0; margin:0; }
@media (max-width:48rem){
#gNav[hidden]{ display:none; }
#gNav ul{ display:grid; gap:.5rem; }
}
:focus-visible{ outline:3px solid #FF9900; outline-offset:2px; }
14. ページタイプ別の情報設計:トップ/一覧/詳細/フォーム
- トップ:主要導線は3〜5個に絞り、“はじめて”の方の最短路を明示。
- 一覧(検索・カテゴリ):結果数→条件変更→リストの順。並び替えや絞り込みはボタン+ラベルで。
- 詳細:ページ内目次、関連リンク(前後/上位カテゴリ)、パンくずを三位一体で。
- フォーム:グロナビを短縮(または**「フォームを終了」導線**)し、集中を妨げない。
15. 手動テスト(5分スモーク)
- Tabだけで、スキップリンク→本文→主要リンク→フッターに論理順で到達できる。
- スクリーンリーダーでランドマーク一覧と見出し一覧が意味を成している。
- 現在地が色以外(下線・太字・
aria-current
)でも伝わる。 - ドロップダウン/メガメニューがボタンで開閉し、Escで閉じてトリガに復帰する。
- ページ内目次からジャンプ後、見出しが隠れず読み始められる。
- モバイルでターゲットサイズ・間隔が十分、固定ヘッダーで内容が隠れない。
16. 組織運用:デザインシステムに“地図のルール”を収録
- コンポーネント仕様:
- 名前・役割・値(NRV):
aria-expanded
/aria-current
等を明文化。 - キー操作:Tab/Esc/矢印の扱い。
- コントラスト:リンク・フォーカス・アイコンの最小比。
- 名前・役割・値(NRV):
- コンテンツ規約:
- リンクテキストは目的語で(「こちら」は不可)。
- パンくず・タイトルの命名一貫性。
- 運用チェックリストをPRテンプレに組み込み、CIで自動検査+5分手動を定例化。
17. ケーススタディ:メガメニュー縮減で“決断疲れ”を軽減
Before
- 5列×10リンク=50リンクのメガメニュー。ホバーで即時展開、モバイルでは詰み。
- 現在地表示が色のみで、読み上げでは判別不能。
- 検索0件時の代替導線なし。
After
- 3列×6リンク=18リンクに要約、上位3件は**“おすすめ”**として直下に昇格。
- 開閉はボタン、
aria-expanded
と Esc 対応。 - 現在地を
aria-current
+太字+下線 に統一。 - 0件時に候補キーワードとカテゴリ導線を提示。
- 結果:一回のセッションでの目的到達時間 −23%、モバイルでの誤タップ −41%。
18. チェックリスト(貼り付け用・完成基準)
- [ ]
header/nav/main/aside/footer
が適切、複数nav
はaria-label
付き - [ ] 見出し構造が論理的(
h1
は1つ) - [ ] スキップリンクが最初の
Tab
で現れ、main
へ移動 - [ ] グロナビはネイティブHTML+最小ARIA、ドロップダウンはボタンで開閉
- [ ] 現在地は
aria-current
+視覚的手掛かり(太字/下線) - [ ] 検索フォームは可視ラベル、結果数表示とページネーションがアクセシブル
- [ ] ページ内目次→ジャンプ後、見出しが隠れない(
scroll-margin-top
) - [ ] モバイル:ターゲットサイズ44–48px、ズーム許可、横スクロール強要なし
- [ ] 0件/404/メンテに代替導線と言語トーン
- [ ] 5分スモークテストを通過(§15)
19. 対象読者別の導入メリット(具体)
- UI/UXデザイナー:IAの原則とナビの型が明確になり、迷いのない導線設計に。
- フロントエンドエンジニア:ネイティブ+最小ARIAの雛形で、回帰に強いコードに。
- 情報アーキテクト/編集:タイトル・パンくず・リンク文の命名一貫性で検索・再利用が向上。
- PM/ディレクター:AA準拠の受け入れ基準が明文化され、リリース判定が容易。
- QA/A11y担当:ランドマーク・見出し・スキップリンク・現在地の定型観点で安定検証。
- 利用者(支援技術・キーボード・モバイル):最短で目的地へ。迷いや疲労が減少。
20. まとめ:最短で、やさしく、同じ理解へ
- ランドマーク・見出し・スキップリンクで“地図”を整える。
- ネイティブHTML+最小ARIAで、ナビは堅牢に。
- 現在地と状態は色だけに頼らず、重複伝達で迷子を防ぐ。
- 検索・パンくず・ページ内目次を“別ルート”として常設。
- モバイル前提でターゲットサイズ・ズーム・開閉を丁寧に。
- 迷子ページの救済(404/0件/メンテ)を用意し、やさしい言葉で導く。
- テストの型(5分スモーク)とチェックリストで品質を継続的に守る。
ナビゲーションは、利用者に寄り添う静かな案内役。あなたのサイトが、誰にとっても迷わず・疲れず・同じ理解にたどり着ける場所になるよう、心を込めてお手伝いしますね。