セマンティック HTML とは
セマンティック HTML とは、内容が何であるかで各タグを選ぶことです。ナビゲーションは <nav> に、メインの内容は <main> に、ブログ記事は <article> に入れます。タグ自体は普通の箱に見えますが、ページの各部分が何をするものかをブラウザ、スクリーンリーダー、検索エンジンに伝えます。下は、セマンティックなレイアウト用タグで組み立てたページ全体で、各タグに枠線とラベルを付けています。
<style> 要素を消すとページは普通のテキストのように見えますが、構造はそのまま残っています。コードを読む人にも、画面を見ずにコードを読むソフトウェアにも伝わります。
セマンティックなレイアウト用タグ
| タグ | 用途 | スクリーンリーダーのランドマーク |
|---|---|---|
<header> | ページや記事の導入部: ロゴ、タイトル、著者名 | banner (article、aside、main、nav、section の中にない場合のみ) |
<nav> | 主要なナビゲーションリンクのまとまり | navigation |
<main> | そのページ固有の内容。1 ページに 1 つ | main |
<article> | それだけで意味が通じる完結した内容: 記事、コメント、商品カード | 初期状態ではなし |
<section> | 独自の見出しを持つ、テーマでまとめた内容 | region (アクセシブルな名前がある場合のみ) |
<aside> | メインの流れの横にある関連内容: サイドバー、注釈 | complementary |
<footer> | ページや記事の締めくくりの情報: 著作権、著者、リンク | contentinfo (ページの階層の場合のみ) |
各タグには詳しく解説した個別のページがあります: header、nav、section、footer。このページでは、それらの組み合わせ方を扱います。
なぜ div だけではだめなのか
<div> 要素だけで作ったページも、セマンティックなページとまったく同じ見た目にできます。違いはマークアップが伝える内容です。ボタンを押して、それぞれのバージョンで意味を持つ要素に枠線を付けてみてください。
div のバージョンでは 0 個、セマンティックなバージョンでは 4 個見つかります。これが支援技術に見えているものです。セマンティックなページなら、スクリーンリーダーのユーザーはナビゲーションやメインの内容に直接移動できますが、div のページではすべてを順に読むしかありません。class="nav" のようなクラス名は、ブラウザにとって何の意味もありません。
最初の例の .cols のような flex の入れ物など、スタイルやレイアウトのためだけにある箱には、今でも <div> が適しています。
main、article、aside
<main> はそのページ固有の内容を囲み、1 回だけ使います。その中で、<article> は単独で別のサイトにコピーしても意味が通じる内容を、<aside> は関連はあるけれど取り除いても記事が壊れない内容を示します。
記事は独自の <header> と <footer> を持っています。これらはページの階層だけのものではなく、それぞれがいちばん近い記事やセクションの導入や締めくくりになります。<time datetime> 要素は、人が読める形で日付を表示しつつ、機械が読める形でも日付を伝えます。
見出しのアウトラインを確認する
見出しは構造のもう半分です。スクリーンリーダーのユーザーは見出しから見出しへとページを移動することが多いので、レベルは目次のように読め、飛ばしがないようにしましょう。このスクリプトは、実行されたページのアウトラインを出力します。
「Brewing」の下の h4 はレベルを 1 つ飛ばしています。h3 に変えるとアウトラインがきれいに読めます。見出しのレベルは構造で選び、大きさを変えたいなら CSS で変えましょう。
ほかのセマンティックなタグ
セマンティクスはレイアウトだけの話ではありません。次のテキストレベルのタグも意味を持っています。
| タグ | 意味 |
|---|---|
<strong> | 重要なテキスト (初期状態では太字) |
<em> | 強調 (初期状態では斜体) |
<figure> と <figcaption> | キャプション付きの画像、グラフ、コード例 |
<time datetime="..."> | 機械が読める形の日付や時刻 |
<address> | ページや記事の著者の連絡先 |
<mark> | 検索で一致した部分のような、ハイライトしたテキスト |
<abbr title="..."> | 正式名称付きの略語 |
<button> | 操作を実行するもの |
略語「W3C」にマウスを乗せると、ツールチップに正式名称が表示されます。
よくある間違い
- 見た目のためにタグを使う。
<blockquote>は引用のためのもので、インデントのためではありません。<h3>は見出しのレベルで、中くらいの太字のテキストのためではありません。見た目は CSS で整えましょう。 - 何でも
<section>で囲む。 セクションには見出しとテーマが必要です。スタイルのための箱なら<div>を使いましょう。 - 表示される
<main>が複数ある。 1 ページに 1 つにし、<article>、<aside>、<header>、<nav>、<footer>の中には置かないようにしましょう。 - リンクのリストをすべて
<nav>に入れる。 サイトのメニューや目次のような主要なナビゲーションのまとまりに使いましょう。フッターにある数個のリンクには不要です。 - クリックできる
<div>要素。<div onclick>にはキーボードでたどり着けません。操作には<button>、移動には<a href>を使いましょう。
よくある質問
セマンティック HTML とは何ですか?
各タグが内容の意味を表すマークアップのことです。ナビゲーションには <nav>、それだけで完結する内容には <article>、ボタンには <button> を使います。そうすればブラウザ、スクリーンリーダー、検索エンジンは、クラス名やスタイルから推測しなくてもページを理解できます。
HTML のセマンティックタグにはどんなものがありますか?
レイアウト用のタグは <header>、<nav>、<main>、<article>、<section>、<aside>、<footer> です。ほかによく使うセマンティックなタグに <figure>、<figcaption>、<time>、<address>、<strong>、<em>、見出しの <h1> から <h6> があります。
div はセマンティックな要素ですか?
いいえ。<div> はそれ自体に意味がなく、スタイルやレイアウトのための汎用の箱です。合うセマンティックなタグがないときに使い、あるときは <header>、<main>、<nav> などを使いましょう。
aside タグは何に使いますか?
<aside> には、メインの内容に関連はあるけれど流れの一部ではない内容を入れます。サイドバー、関連リンクの箱、用語の注釈、引用の抜き出しなどです。ページの階層では、スクリーンリーダーはこれを complementary ランドマークとして一覧に出します。
main 要素は 1 ページにいくつ置けますか?
表示される <main> は 1 ページに 1 つです。そのページ固有の内容を囲み、<header>、<nav>、<article>、<aside>、<footer> の中に置いてはいけません。
セマンティック HTML は SEO に役立ちますか?
ページのどこがメインの内容で、どこがナビゲーションか、見出し同士がどう関係するかを検索エンジンが理解する助けになります。それだけで順位が上がる近道ではありませんが、推測の余地をなくし、アクセシビリティも改善するので、いずれにしてもやる価値があります。