ナビゲーションメニュー

nav

<nav> はサイト内の主要なナビゲーションリンクをグループ化するセマンティックな要素。 スクリーンリーダーはランドマークとして認識し、ユーザーがナビゲーションへ素早くジャンプできる。

デモ:水平ナビゲーション(ヘッダー型)

「ホーム」に 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="/contact">お問い合わせ</a></li>
  </ul>
</nav>

デモ:垂直ナビゲーション(サイドバー型)

メインコンテンツエリア。サイドバーの「ダッシュボード」が現在のページです。

<nav aria-label="サイドバーナビゲーション">
  <ul>
    <li><a href="/dashboard" aria-current="page">ダッシュボード</a></li>
    <li><a href="/profile">プロフィール</a></li>
    <li><a href="/settings">設定</a></li>
    <li><a href="/notifications">通知</a></li>
  </ul>
</nav>

デモ:パンくずナビゲーション

<!-- パンくずには aria-label="パンくず" と ol を使う -->
<nav aria-label="パンくず">
  <ol>
    <li><a href="/">ホーム</a></li>
    <li aria-hidden="true">›</li>
    <li><a href="/categories">カテゴリ</a></li>
    <li aria-hidden="true">›</li>
    <!-- 現在のページには aria-current="page" -->
    <li><a href="/current" aria-current="page">現在のページ</a></li>
  </ol>
</nav>

区切り文字()にはaria-hidden="true" を付けて スクリーンリーダーから隠します。CSS の ::before で区切り文字を追加する方法も一般的です。

NEWaria-current="page" — 現在のページを示す

ナビゲーション内で現在表示しているページのリンクにはaria-current="page" を付けます。 スクリーンリーダーが「現在のページ」として読み上げ、視覚的なスタイルと同等の情報をユーザーに伝えます。

<!-- aria-current="page" で現在ページを示す -->
<nav aria-label="メインナビゲーション">
  <ul>
    <li><a href="/" aria-current="page">ホーム</a></li>
    <li><a href="/about">概要</a></li>
  </ul>
</nav>

/* CSS で aria-current="page" のスタイルを当てる */
[aria-current="page"] {
  font-weight: bold;
  color: #1d4ed8;
  border-bottom: 2px solid currentColor;
}

/* aria-current は "page" 以外の値も使える */
/* "step"  : ウィザードの現在ステップ    */
/* "date"  : カレンダーの選択日          */
/* "true"  : その他の文脈での「現在」    */

比較:nav vs div(セマンティックな要素 vs 汎用要素)

視覚的には <div> で同じレイアウトを作れますが、<nav> を使うことでセマンティックな意味が加わります。

項目<nav><div>
ARIAランドマーク✅ navigation ロールを持つ❌ ランドマークなし
スクリーンリーダーナビゲーションとして認識・ジャンプ可能認識されない
SEOナビゲーションとして解釈される可能性意味を持たない
スタイリングdiv と同様(ブロック要素)同上
適切な用途主要なナビゲーションリンク群意味のないグループ化
<!-- ❌ div を使った場合(セマンティクスなし) -->
<div class="nav">
  <a href="/">ホーム</a>
  <a href="/about">概要</a>
</div>

<!-- ✅ nav を使った場合(スクリーンリーダーがランドマークとして認識) -->
<nav aria-label="メインナビゲーション">
  <ul>
    <li><a href="/">ホーム</a></li>
    <li><a href="/about">概要</a></li>
  </ul>
</nav>

<!-- ⚠️ nav はすべてのリンクに使うわけではない -->
<!-- フッターの著作権リンクや、記事内のリンクには使わない -->
<!-- 「主要なナビゲーション」にのみ使う -->

Tips複数の nav 要素には aria-label が必須

1ページに複数の <nav> 要素を使う場合(例:ヘッダーナビ+サイドバーナビ+パンくず)、 それぞれに aria-label を付けて区別します。 付けないと、スクリーンリーダーが「ナビゲーション、ナビゲーション、ナビゲーション」と読み上げてしまいます。

<!-- 複数の nav には aria-label で名前を付ける -->

<header>
  <nav aria-label="メインナビゲーション">
    <!-- グローバルメニュー -->
  </nav>
</header>

<aside>
  <nav aria-label="サイドバーナビゲーション">
    <!-- カテゴリ一覧など -->
  </nav>
</aside>

<main>
  <!-- 記事内の目次 -->
  <nav aria-label="目次">
    <ol>...</ol>
  </nav>
</main>

<footer>
  <nav aria-label="パンくず">
    <ol>...</ol>
  </nav>
</footer>

<!-- aria-labelledby で見出しを参照する方法も使える -->
<nav aria-labelledby="sidebar-heading">
  <h2 id="sidebar-heading">カテゴリ</h2>
  <ul>...</ul>
</nav>

まとめ

ポイント詳細
セマンティクス主要なナビには <nav> を使う(div ではなく)
複数 nav の区別<nav>aria-label を付ける
現在ページ現在のページのリンクに aria-current="page"
パンくずaria-label="パンくず" + <ol> を使う
区切り文字パンくずの区切り文字に aria-hidden="true"

🤖 AIプロンプトテンプレート

以下について、AIへの質問プロンプト例を示します。

- `<nav>` と `<div>` の違いを、アクセシビリティ・SEO の観点から教えてください。
- 1 ページに複数の `<nav>` を使う場合、`aria-label` を付けるべき理由と具体的な例を教えてください。
- `<ul>` と `<ol>` のどちらを使うべきか、ナビゲーションメニューとパンくずリストで考え方は違いますか?
- `aria-current="page"` を付けることで、スクリーンリーダーにどんな情報が伝わりますか?
- パンくずリストのマークアップで区切り文字(›)に `aria-hidden="true"` を付ける理由を教えてください。

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。