Menu

HTML の nav タグ: ナビゲーションバー、メニュー、パンくずリスト

<nav> 要素は主要なナビゲーションリンクのまとまりを示します。<nav> とリストでナビゲーションバーを作る方法、現在のページの示し方、1 ページにある複数の nav へのラベル付け、モバイルメニューの開閉ボタンを解説します。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

メニューを <nav> で囲み、リンクをリストに入れます。flexbox でリストを横並びのバーにします。

list-style: none と padding: 0 で行頭記号とインデントを消しています。各リンクに display: block を指定すると padding がバーの中で実際の場所を取るので、padding を含む箱全体がクリックできる範囲になります。display: flex の行を消すと、同じメニューがサイドバーのメニューのような縦のリストになります。

<nav> 自体には見た目がありません。その役割は意味にあります。スクリーンリーダーは nav を navigation ランドマークとして扱うので、ユーザーはキー 1 つでメニューに移動したり、メニューを飛ばしたりできます。

現在のページを示す

表示中のページへのリンクに aria-current="page" を付けます。スクリーンリーダーに「ここにいます」と伝え、CSS でリンクを強調するための手がかりにもなります。

aria-current="page" を別のリンクに移すと、強調もそれについていきます。.active クラスではなくこの属性にスタイルを付ければ、見た目とアクセシビリティが常に一致します。片方だけになることはありません。

1 ページに複数の nav: ラベルとパンくずリスト

1 つのページにメインメニュー、パンくずリスト、目次があり、それぞれが独自の <nav> に入ることがあります。それぞれに aria-label を付ければ、スクリーンリーダーは同じ「navigation」を 3 つ並べる代わりに「Breadcrumb navigation」のように読み上げます。

パンくずリストは順番に意味があるので、番号付きリストの <ol> を使います。スラッシュは CSS の ::before で付けているので、スクリーンリーダーが項目ごとに「スラッシュ」と読み上げることはありません。最後の項目は現在のページなので、リンクにしていません。

目次

同じページの各セクションへのリンクのリストもナビゲーションです。#id のリンクはその id を持つ要素に移動します。プレビューで試してみてください。

ここではラベルを aria-labelledby で見える見出しから取っています。見出しがすでに画面にあるなら、aria-label よりこちらのほうが適しています。

モバイルメニューの開閉ボタン

狭い画面では、メニューはたいていボタンの後ろに隠れています。aria-expanded を付けた本物の <button> を使い、リンクは <nav> の中に置いたままにします。

aria-expanded はメニューが開いているかどうかをスクリーンリーダーに伝え、hidden 属性は閉じている間、リストを画面からもアクセシビリティツリーからも取り除きます。広い画面では、メディアクエリでリストを表示してボタンを隠します。

よくある間違い

  • リンクのまとまりをすべて <nav> で囲む。 メインメニュー、パンくずリスト、ページ送り、目次に使いましょう。本文中のリンクはナビゲーションのまとまりではありません。
  • <div> で作ったメニューボタン。 キーボードでフォーカスも押すこともできません。<button> を使いましょう。
  • ラベルのない複数の nav。 区別できるよう、それぞれに aria-label か aria-labelledby を付けましょう。
  • 現在のリンクに色を付けるだけ。 aria-current="page" を付けましょう。色だけでは読み上げられず、すべての人に見えるとも限りません。
  • 本番で href="#" のリンクを使う。 デモなら問題ありませんが、新しいタブで開いても動くよう、実際のメニュー項目には本当の URL が必要です。href の値の仕組みは HTML のリンク のページで解説しています。

よくある質問

HTML の nav タグとは何ですか?

<nav> は、サイトのメニュー、目次、パンくずリストなど、主要なナビゲーションリンクのまとまりを囲むセマンティックな要素です。スクリーンリーダーはこれを navigation ランドマークとして一覧に出すので、ユーザーは直接そこへ移動できます。

nav の中のリンクはリストにするべきですか?

よく使われるパターンで、よい方法です。<li> を並べた <ul> にすると、メニューにリンクがいくつあるかをスクリーンリーダーが読み上げられます。横に並んだ 2、3 個のリンクなど、<nav> の直下に普通のリンクを置くのも正しい書き方です。

リンクのまとまりにはすべて nav 要素が必要ですか?

いいえ。<nav> は主要なナビゲーションのまとまりにだけ使いましょう。段落の中の数個のリンクや、フッターにある法的なページへの短いリンクのリストには不要です。nav のランドマークが多すぎると、それぞれが見つけにくくなります。

横並びのナビゲーションバーを作るには?

リンクを <nav> の中の <ul> に入れ、リストに display: flex; list-style: none; padding: 0; と gap を指定します。flexbox が項目を横一列に並べます。

ナビゲーションバーで現在のページを示すには?

ユーザーが今いるページへのリンクに aria-current="page" を付け、[aria-current="page"] セレクターでスタイルを付けます。スクリーンリーダーもそれを現在のページとして読み上げます。

1 ページに nav を複数置けますか?

置けます。たとえばメインメニュー、パンくずリスト、目次です。スクリーンリーダーのユーザーが区別できるよう、それぞれに「Main」や「Breadcrumb」のような別々の aria-label を付けましょう。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める