coding script
Photo by Markus Spiske on Pexels.com
目次

ナビゲーションと情報設計のアクセシビリティ完全ガイド:ランドマーク・見出し・スキップリンク・メガメニュー・パンくず・検索まで

概要サマリー(先に要点)

  • **情報設計(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 で明示。
  • 複数ある navaside には 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分スモーク)

  1. Tabだけで、スキップリンク→本文→主要リンク→フッターに論理順で到達できる。
  2. スクリーンリーダーでランドマーク一覧見出し一覧が意味を成している。
  3. 現在地が色以外(下線・太字・aria-current)でも伝わる。
  4. ドロップダウン/メガメニューがボタンで開閉し、Escで閉じてトリガに復帰する。
  5. ページ内目次からジャンプ後、見出しが隠れず読み始められる。
  6. モバイルでターゲットサイズ・間隔が十分、固定ヘッダーで内容が隠れない。

16. 組織運用:デザインシステムに“地図のルール”を収録

  • コンポーネント仕様
    • 名前・役割・値(NRV)aria-expanded/aria-current 等を明文化。
    • キー操作:Tab/Esc/矢印の扱い。
    • コントラスト:リンク・フォーカス・アイコンの最小比。
  • コンテンツ規約
    • リンクテキスト目的語で(「こちら」は不可)。
    • パンくず・タイトルの命名一貫性
  • 運用チェックリストをPRテンプレに組み込み、CIで自動検査+5分手動を定例化。

17. ケーススタディ:メガメニュー縮減で“決断疲れ”を軽減

Before

  • 5列×10リンク=50リンクのメガメニュー。ホバーで即時展開、モバイルでは詰み。
  • 現在地表示が色のみで、読み上げでは判別不能。
  • 検索0件時の代替導線なし。

After

  • 3列×6リンク=18リンクに要約、上位3件は**“おすすめ”**として直下に昇格。
  • 開閉はボタンaria-expandedEsc 対応。
  • 現在地を aria-current+太字+下線 に統一。
  • 0件時に候補キーワードカテゴリ導線を提示。
  • 結果:一回のセッションでの目的到達時間 −23%、モバイルでの誤タップ −41%

18. チェックリスト(貼り付け用・完成基準)

  • [ ] header/nav/main/aside/footer が適切、複数 navaria-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. まとめ:最短で、やさしく、同じ理解へ

  1. ランドマーク・見出し・スキップリンクで“地図”を整える。
  2. ネイティブHTML+最小ARIAで、ナビは堅牢に。
  3. 現在地と状態は色だけに頼らず、重複伝達で迷子を防ぐ。
  4. 検索・パンくず・ページ内目次を“別ルート”として常設。
  5. モバイル前提でターゲットサイズ・ズーム・開閉を丁寧に。
  6. 迷子ページの救済(404/0件/メンテ)を用意し、やさしい言葉で導く。
  7. テストの型(5分スモーク)チェックリストで品質を継続的に守る。

ナビゲーションは、利用者に寄り添う静かな案内役。あなたのサイトが、誰にとっても迷わず・疲れず・同じ理解にたどり着ける場所になるよう、心を込めてお手伝いしますね。


投稿者 greeden

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)