HTMLタグ(HTML要素)とは、文書のその部分が何であるかをブラウザ・支援技術・検索エンジンに伝えるための印です。見た目を決めるものではありません。
この記事は「どのタグがあるか」を並べた索引ではなく、いま自分が書いた要素の選択がHTML Living Standardに適合しているか、非適合の要素を踏んでいないかを、この記事の中だけで判定できるリファレンスとして作っています。全13分類・114要素の表に「使いどころ(○使う/×避ける)」の列を置き、末尾には仕様が「作者は使ってはならない」と明記した非適合要素29個の一覧と代替を載せました。
規範(何が適合で何が非適合か)はWHATWG HTML Living Standardを正とし、日本語の解説とブラウザ実装状況(Baseline)はMDN Web Docs の HTML 要素リファレンスを併用しています。本記事の仕様の記述は、2026年7月20日更新版のHTML Living Standardを直接参照して確認したものです。
最後に、書いたタグが実際に効いているかをブラウザだけで判定する手順を用意しました。表を読むだけで終わらせず、自分のページで1回動かしてみてください。
この一覧の使い方|「廃止」ではなく「適合/非適合」で見る
タグ一覧を読むときにいちばん事故が起きるのは、「このタグはHTML5で廃止された」という説明を鵜呑みにすることです。まずこの前提から整理します。
「HTML5で廃止」という言い方をこの記事が使わない理由
HTMLには「HTML5」で止まったバージョン番号がありません。現在のHTMLはWHATWGが継続的に更新するLiving Standard(生きた標準)で、版番号ではなく更新日で管理されています。そのため「HTML5で廃止された」という表現は、指している対象も時点も曖昧になります。
仕様が実際に書いているのは「廃止」ではなく、非適合(non-conforming)です。HTML Living Standard §16.2 は該当する要素を列挙したうえで、「完全に旧式であり、作者は使用してはならない(entirely obsolete, and must not be used by authors)」と規定しています。対象は29個です。
そして重要なのは、「作者は使ってはならない」と「ブラウザから消える」は別の話だということです。同じ仕様の§16.3は、ブラウザ側に対して marquee の動作や frameset のインターフェイスを実装するよう求めていますし、§15(描画)には center や big の既定スタイルが今も書かれています。互換性のために動き続けるだけで、書いてよい根拠にはなりません。
この記事では、この2つを混ぜないために「廃止」という語を使わず、「非適合(作者は使用禁止)」と「ブラウザ実装は残る」を分けて表記します。
規範はWHATWG、実装状況はMDNで確認する
HTMLの情報源は複数あり、書いてあることが食い違って見えることがあります。役割が違うだけなので、次のように使い分けると迷いません。
| 情報源 | 何の答えが載っているか | この記事での扱い |
|---|---|---|
| WHATWG HTML Living Standard | その書き方が適合か非適合か。要素の意味、コンテンツモデル、非適合要素の一覧 | 規範(正)として採用 |
| MDN Web Docs | 日本語の解説、属性の使い方、Baseline(どのブラウザでいつから使えるか) | 解説と実装状況の情報源 |
| W3C ARIA in HTML | 各要素の暗黙のARIAロール(アクセシビリティツリーへの出方) | 後半の検証手順の根拠 |
「仕様では適合だが、まだ全ブラウザには届いていない」という要素もあります。適合かどうかはWHATWG、いま実戦投入してよいかはMDNのBaseline、と二段で確認するのが安全です。
文書の骨格をつくるタグ
ページの外枠と、ページを意味のある区画に分けるためのタグです。ここを間違えると、後半の検証で扱うランドマーク(支援技術がページを移動するための目印)が1つも生成されません。
文書構造・メタデータ
HTML文書の基本構造と、ブラウザや検索エンジンへ情報を渡すタグです。
| タグ | 意味・用途 | 使用例 | 使いどころ(○使う/×避ける) |
|---|---|---|---|
<!DOCTYPE html> | HTML文書であることの宣言(要素ではなく文書型宣言) | <!DOCTYPE html> | ○ 全ページの1行目に必ず置く/× 省略するとブラウザが互換モードになり、CSSの解釈が変わる |
<html> | 文書のルート要素 | <html lang=”ja”>…</html> | ○ lang を必ず付ける/× lang の省略は読み上げ言語の誤判定を招く |
<head> | メタ情報・CSS・JSの読み込み領域 | <head><meta charset=”UTF-8″></head> | ○ 画面に出ない情報だけを置く/× 表示コンテンツを入れない |
<body> | 表示コンテンツの領域 | <body>…</body> | ○ 1文書に1つ/× 2つ書いてもパーサが1つに統合するだけで意図どおりにならない |
<title> | 文書のタイトル(タブ・検索結果に表示) | <title>ページタイトル</title> | ○ ページごとに固有の文言/× 見出しの代用にしない(仕様上 title は見出しではない) |
<meta> | 文字コード・viewport・descriptionなどの情報 | <meta name=”viewport” content=”width=device-width, initial-scale=1″> | ○ charsetは head の先頭付近/× keywords は検索順位に使われない |
<link> | 外部リソースの関連付け(CSS・canonical・favicon) | <link rel=”stylesheet” href=”style.css”> | ○ rel で関係を明示/× charset・rev 属性は非適合 |
<script> | JavaScriptの読み込み・実行 | <script src=”app.js” defer></script> | ○ defer / type="module"/× language 属性は非適合 |
<style> | 文書内に直接書くCSS | <style>body { margin: 0; }</style> | ○ 初期表示に必要な最小限のCSS/× 全CSSを毎ページ埋め込むとキャッシュが効かない |
<noscript> | JavaScript無効時の代替コンテンツ | <noscript>お問い合わせはメールで受け付けています</noscript> | ○ 代替の手段を実際に示す/× 「JavaScriptを有効にしてください」だけで終わらせない |
<base> | 相対URLの基準URLを指定 | <base href=”https://example.com/”> | ○ 1文書に1つまで/× 既存の相対リンク全部に影響するため、途中導入は避ける |
セクション・ページ構造
ページを意味のある区画に分けるタグです。この分類のタグは、正しく置かれるとアクセシビリティツリーにランドマークとして現れます。div で代用すると現れません。後半の検証はここを見ます。
| タグ | 意味・用途 | 使用例 | 使いどころ(○使う/×避ける) |
|---|---|---|---|
<header> | 導入部(ロゴ・サイト名・ナビゲーション等) | <header><nav>…</nav></header> | ○ ページ最上位に置くと banner ランドマークになる/× article・aside・main・nav・section の内側に入れると banner にならない |
<footer> | そのセクションの末尾情報(著作権・連絡先等) | <footer>© 2026 Example</footer> | ○ ページ最上位に置くと contentinfo ランドマークになる/× header と同じ入れ子の制約がある |
<main> | そのページの主要コンテンツ | <main>…</main> | ○ 1ページに1つ(表示中のものが1つ)/× 全ページ共通のヘッダー・フッターを含めない |
<nav> | 主要なナビゲーションリンクの集まり | <nav aria-label=”グローバル”><ul>…</ul></nav> | ○ 複数置くなら aria-label で呼び分ける/× ページ内のリンクを片っ端から囲まない |
<section> | 見出しを持つ、意味のあるまとまり | <section><h2>概要</h2><p>…</p></section> | ○ 見出しとセットで使う/× 見出しの無い section はランドマークにならず、div と変わらない |
<article> | それ単体で完結・再配信できるコンテンツ | <article><h2>ブログ記事</h2>…</article> | ○ 記事・投稿・コメント・商品カード/× 単なるレイアウトの箱にしない |
<aside> | 本文と関連はあるが、切り離せる補足 | <aside><h2>関連記事</h2>…</aside> | ○ サイドバー・注釈・広告枠/× 本文の続きを入れない |
<address> | 最も近い article または body 祖先の連絡先情報 | <address>連絡先: <a href=”mailto:info@example.com”>info@example.com</a></address> | ○ そのセクションの書き手への連絡手段/× 任意の住所(郵便の宛先など)には使わない。仕様は「一般の住所には p が適切」と明記 |
<search> | 検索・絞り込みのための領域 | <search><form action=”/search”><input type=”search” name=”q”><button>検索</button></form></search> | ○ 暗黙のロールが search なので role="search" の付与が不要になる/× 検索結果そのものを囲むのは用途外 |
<hgroup> | 見出しとサブタイトルのグループ化 | <hgroup><h1>タイトル</h1><p>サブタイトル</p></hgroup> | ○ 見出し1つ+補足の p/× 見出しを2つ並べる用途ではない |
<search> は比較的新しい要素ですが、MDNのBaselineは2023年10月から Widely available(広く利用可能)です。これまで <form role="search"> と書いていた箇所は、<search> で囲むだけで同じランドマークが得られます。
<address> の限定条件は見落とされがちです。仕様は「address 要素は任意の住所(例えば郵便の住所)を表すために使ってはならない。ただしその住所が実際に該当する連絡先情報である場合を除く」と書いています。会社概要ページの所在地は、多くの場合 p が正解です。
見出し(h1〜h6)
コンテンツの階層を示すタグです。ここは通説と仕様がずれている代表格なので、先に事実を置きます。
| タグ | 意味・用途 | 使用例 | 使いどころ(○使う/×避ける) |
|---|---|---|---|
<h1> | レベル1の見出し | <h1>記事タイトル</h1> | ○ 仕様は「文書に見出しが1つ以上あるなら、そのうち少なくとも1つはレベル1であるべき」と規定/× 「1ページに1つだけ」は仕様の要求ではない(後述) |
<h2> | レベル2の見出し | <h2>章の見出し</h2> | ○ 章の区切り/× 文字を大きくしたいだけの用途に使わない |
<h3> | レベル3の見出し | <h3>節の見出し</h3> | ○ h2の下位/× h2を飛ばしてh1直下に置くのは非適合 |
<h4> | レベル4の見出し | <h4>項の見出し</h4> | ○ h3の下位/× 装飾目的で使わない |
<h5> | レベル5の見出し | <h5>細目の見出し</h5> | ○ 深い階層が本当に必要なときだけ/× 階層が5段を超えたら構成を疑う |
<h6> | レベル6の見出し | <h6>最下位の見出し</h6> | ○ 最下位/× ここまで使う設計はまず情報整理から見直す |
「h1はページに1つ」は仕様の規定ではありません。HTML Living Standard §4.3.11 は「文書は複数のトップレベル見出しを含むことができる(A document can contain multiple top-level headings)」として、h1 を3つ並べた例を適合として示しています。仕様が求めているのは、①見出しが1つ以上あるなら、そのうち少なくとも1つはレベル1であること、②直前の見出しに対してレベルの飛び降りをしないこと(前の見出しより小さいか、同じか、1だけ大きいレベルであること)の2点です。
実務でh1を1つに絞る運用自体は妥当ですが、その根拠はSEOではなく、目次としての読みやすさと運用のしやすさにあります。この判断の裏付けはGoogle公式ドキュメントを含めて別記事で扱っています。
▶ h1の数・見出しの階層について、Google公式が実際に書いていることを確認する
文章を組み立てるタグ
本文の中身を作るタグです。ここは「見た目が同じでも意味が違う」ペアが多く、選択を間違えても画面上は気付けません。
テキスト・インライン
文章の一部に意味を与えるタグです。b と strong、i と em のように、表示は似ていて意味が異なる組み合わせに注意してください。
| タグ | 意味・用途 | 使用例 | 使いどころ(○使う/×避ける) |
|---|---|---|---|
<p> | 段落 | <p>これは段落です。</p> | ○ 文章のまとまり/× 空の p で余白を作らない |
<a> | ハイパーリンク | <a href=”https://example.com/guide/”>ガイドを読む</a> | ○ リンク文言だけで行き先が分かるようにする/× 「こちら」だけのリンクは避ける |
<strong> | 内容としての重要性 | <strong>重要</strong>な情報 | ○ 警告・注意など本当に重要な箇所/× 単に太字にしたいだけならCSSで |
<em> | 文としての強勢(読み上げの抑揚) | <em>特に</em>注意 | ○ 語を強く読ませたいとき/× 斜体にしたいだけなら使わない |
<b> | 重要性を伴わない注意喚起 | <b>キーワード</b> | ○ 記事中のキーワード・製品名/× 見出しの代用にしない |
<i> | 通常と異なる語(学名・専門用語・他言語) | <i>ad hoc</i> | ○ 種名・慣用外来語/× 斜体装飾の目的で使わない |
<u> | 非文字的な注記(スペルミスの指摘など) | <u>誤記箇所</u> | ○ 校正の指摘/× リンクと紛らわしいので装飾の下線には使わない |
<s> | もはや正確でない・関係がなくなった内容 | 定価 <s>¥5,000</s> → ¥3,980 | ○ 旧価格・取り消し済みの案内/× 編集履歴を示すなら del を使う |
<mark> | 参照目的でのハイライト | 検索結果: <mark>CSS</mark>プロパティ | ○ 検索語のハイライト・引用中の注目箇所/× 全文をマーカーで塗らない |
<small> | 細目・免責・注釈 | <small>※条件あり</small> | ○ 注意書き・著作権表記/× 文字を小さくする目的だけで使わない |
<sub> | 下付き文字 | H<sub>2</sub>O | ○ 化学式・添字/× レイアウト調整に使わない |
<sup> | 上付き文字 | E=mc<sup>2</sup> | ○ 指数・脚注番号/× 同上 |
<abbr> | 略語(title で正式名称) | <abbr title=”HyperText Markup Language”>HTML</abbr> | ○ 初出の略語/× title はタッチ端末で出ないため、本文にも正式名称を書く |
<time> | 日時を機械可読な形式で示す | <time datetime=”2026-08-02″>2026年8月2日</time> | ○ 公開日・イベント日時/× datetime の書式を崩さない |
<data> | テキストに機械可読な値を添える | <data value=”398″>商品A</data> | ○ 商品IDなど日時以外の値/× 日時は time を使う |
<br> | 意味のある改行 | 〒100-0001<br>東京都千代田区 | ○ 住所・詩など改行そのものが意味を持つ場合/× 余白づくりの <br><br> はCSSに置き換える |
<wbr> | 改行してよい位置のヒント | super<wbr>califragilistic | ○ 長いURL・長い英単語/× 通常の文章には不要 |
<hr> | 話題の区切り | <hr> | ○ 主題が切り替わる箇所/× 単なる横線の装飾はCSSのborderで |
ルビ・編集履歴・書字方向
日本語のページで必要になるのに、タグ一覧から抜け落ちやすい分類です。特にふりがな(ルビ)は日本語特有の要件で、CSSでは代替できません。
| タグ | 意味・用途 | 使用例 | 使いどころ(○使う/×避ける) |
|---|---|---|---|
<ruby> | ルビ(振り仮名)注釈の全体 | <ruby>漢字<rp>(</rp><rt>かんじ</rt><rp>)</rp></ruby> | ○ 読みが難しい語・人名・地名/× 全文にルビを振らない |
<rt> | ルビとして表示する読みの部分 | <rt>かんじ</rt> | ○ ruby の子として使う/× 単独で置かない |
<rp> | ルビ非対応環境で表示する括弧 | <rp>(</rp> | ○ 読みの前後に1つずつ/× 括弧以外の文言を入れない |
<del> | 削除された内容(編集履歴) | <del datetime=”2026-08-02″>旧価格 ¥5,000</del> | ○ 更新履歴を残す訂正/× 単なる取り消し線の表現には s |
<ins> | 追加された内容(編集履歴) | <ins datetime=”2026-08-02″>新価格 ¥3,980</ins> | ○ del と対で使う/× 下線装飾の目的で使わない |
<dfn> | 用語の定義箇所であることを示す | <p><dfn>ランドマーク</dfn>とは、支援技術がページ内を移動するための目印です。</p> | ○ 定義文と同じ段落・同じセクション内に定義を書く/× 用語が出てくるたびに付けない(定義箇所は1回) |
<bdi> | 周囲と書字方向を分離する | <li>ユーザー <bdi>محمد</bdi>: 12件</li> | ○ 方向が不明なユーザー入力を埋め込むとき/× 自前の日本語テキストには不要 |
<bdo> | 書字方向を明示的に上書きする | <bdo dir=”rtl”>この並びを反転</bdo> | ○ dir 属性の指定が必須/× dir="auto" は指定してはならない |
なお、ルビ関連で古い記事に出てくる <rb> と <rtc> は非適合です。仕様は「ルビのベーステキストは ruby 要素の中に直接置くか、ruby を入れ子にすれば足りる」としています。
引用・コード
他人の文章とプログラムコードを、地の文と区別するためのタグです。
| タグ | 意味・用途 | 使用例 | 使いどころ(○使う/×避ける) |
|---|---|---|---|
<blockquote> | ブロックレベルの引用 | <blockquote cite=”https://example.com/”><p>引用文</p></blockquote> | ○ 出典を cite 属性とリンクの両方で示す/× 字下げ目的のインデントに使わない |
<q> | 文中の短い引用 | <q>短い引用</q> | ○ 引用符はブラウザが付ける/× 自分で引用符を書き足さない |
<cite> | 作品名・出典の参照 | <cite>HTML Living Standard</cite>より | ○ 書名・記事名・仕様名/× 発言者の氏名を囲む用途ではない |
<pre> | 整形済みテキスト(空白と改行を保持) | <pre><code>const x = 1;</code></pre> | ○ code と組み合わせる/× ASCIIアートによる図解の代用にしない |
<code> | プログラムコードの断片 | <code>console.log()</code> | ○ 関数名・プロパティ名・ファイル名/× 強調のために使わない |
<kbd> | ユーザーのキー入力 | <kbd>Ctrl</kbd>+<kbd>C</kbd> | ○ ショートカットキーの説明/× 画面の表示文字列は samp |
<samp> | プログラムの出力例 | <samp>Error: file not found</samp> | ○ エラーメッセージ・実行結果/× 入力例には kbd |
<var> | 変数・引数の名前 | <var>x</var> = <var>y</var> + 1 | ○ 数式や擬似コードの変数/× 斜体にしたいだけなら使わない |
<output> | 計算結果・ユーザー操作の結果 | <output name=”result”>42</output> | ○ フォームの計算結果/× 静的なテキストには使わない |
リスト
並列・順序・定義の3種類を表すタグです。menu の位置づけがよく誤解されています。
| タグ | 意味・用途 | 使用例 | 使いどころ(○使う/×避ける) |
|---|---|---|---|
<ul> | 順序に意味のないリスト | <ul><li>項目1</li><li>項目2</li></ul> | ○ 並べ替えても意味が変わらないもの/× ナビゲーションを div の羅列で作らない |
<ol> | 順序に意味のあるリスト | <ol><li>手順1</li><li>手順2</li></ol> | ○ 手順・ランキング/× 番号を自分で本文に書き足さない |
<li> | リストの項目 | <li>リストアイテム</li> | ○ ul・ol・menu の直下/× それ以外の親の下に置かない |
<dl> | 用語と説明の組のリスト | <dl><dt>HTML</dt><dd>マークアップ言語</dd></dl> | ○ 用語集・仕様表/× 会話文の表現には使わない |
<dt> | 説明される語 | <dt>SEO</dt> | ○ dl の中/× 単独で使わない |
<dd> | 語の説明 | <dd>検索エンジン最適化</dd> | ○ dt の直後/× 1つの dt に複数の dd を付けるのは適合 |
<menu> | コマンド(ツールバー)の順序なしリスト | <menu><li><button>保存</button></li></menu> | ○ 使うなら「意味の上での ul の別名」と理解して使う/× 右クリックメニューを作る用途は非適合(menuitem と type・label 属性は削除済み) |
<menu> の実態は押さえておく価値があります。MDNは「仕様上は <ul> のセマンティックな代替として説明されているが、ブラウザからは(そしてアクセシビリティツリー上でも)<ul> と何ら変わらないものとして扱われる」と明記しています。つまり menu に置き換えても支援技術への伝わり方は1ミリも変わりません。かつての「コンテキストメニューを作るタグ」という用途は仕様から削除されており、その名残の menuitem は非適合要素29個のひとつです。
データと入力を扱うタグ
表とフォームです。どちらも「見た目を作る道具」として誤用されやすい分類で、誤用するとキーボード操作と読み上げが同時に壊れます。
テーブル
データを表形式で示すタグです。レイアウト目的での使用は仕様上も認められていません。
| タグ | 意味・用途 | 使用例 | 使いどころ(○使う/×避ける) |
|---|---|---|---|
<table> | 表全体 | <table>…</table> | ○ 行と列に意味があるデータ/× 段組みレイアウトにはCSS Grid・Flexbox |
<thead> | ヘッダー行のグループ | <thead><tr><th>見出し</th></tr></thead> | ○ 見出し行をまとめる/× 見た目の固定だけを目的にしない |
<tbody> | 本体行のグループ | <tbody><tr><td>データ</td></tr></tbody> | ○ 明示すると構造が読みやすい/× 省略してもパーサが補うが、書いたほうが安全 |
<tfoot> | 集計行などのグループ | <tfoot><tr><td>合計</td></tr></tfoot> | ○ 合計・注記/× 装飾目的で置かない |
<tr> | 行 | <tr><td>セル1</td><td>セル2</td></tr> | ○ 行の単位/× 行の中に行を入れない |
<th> | 見出しセル | <th scope=”col”>名前</th> | ○ scope を付けて対応関係を明示/× 見出しセルを td+太字で代用しない |
<td> | データセル | <td>値</td> | ○ データ/× 見出しには使わない(scope 属性は非適合) |
<caption> | 表のタイトル | <caption>料金表</caption> | ○ table の最初の子として置く/× summary 属性は非適合なので代わりに caption を使う |
<colgroup> | 列のグループ化 | <colgroup><col span=”2″></colgroup> | ○ 列単位のスタイル指定/× 意味づけの目的では使えない |
<col> | 列の指定 | <col style=”background:#f0f0f0″> | ○ colgroup の中/× 単独では使わない |
フォーム
ユーザー入力を受け取るタグです。label の関連付けだけは省略しないでください。
| タグ | 意味・用途 | 使用例 | 使いどころ(○使う/×避ける) |
|---|---|---|---|
<form> | フォーム全体 | <form action=”/submit” method=”post”>…</form> | ○ 送信単位で1つ/× フォームの入れ子は不可 |
<input> | 1行入力・チェックボックス等 | <input type=”email” name=”email” required> | ○ type を用途に合わせる(email・tel・date)/× 何でも type="text" にしない |
<textarea> | 複数行のテキスト入力 | <textarea name=”message” rows=”5″></textarea> | ○ 自由記述/× 初期値は属性でなく開始タグと終了タグの間に書く |
<select> | 選択肢からの選択 | <select name=”color”><option>赤</option></select> | ○ 選択肢が5つ以上/× 2択なら input type="radio" のほうが速い |
<option> | 選択肢 | <option value=”red”>赤</option> | ○ value を明示/× 表示文字と送信値を取り違えない |
<optgroup> | 選択肢のグループ化 | <optgroup label=”暖色”><option>赤</option></optgroup> | ○ 選択肢が多いとき/× 入れ子のグループは作れない |
<button> | ボタン | <button type=”submit”>送信</button> | ○ type を必ず指定/× div にクリックイベントを付けてボタン代わりにしない |
<label> | 入力欄のラベル | <label for=”email”>メール</label><input id=”email”> | ○ for と id を対にする(またはラベルで囲む)/× プレースホルダーでラベルを代用しない |
<fieldset> | 入力項目のグループ化 | <fieldset><legend>個人情報</legend>…</fieldset> | ○ ラジオボタン群・住所の一式/× 単なる枠線の装飾に使わない |
<legend> | fieldset のタイトル | <legend>お届け先</legend> | ○ fieldset の最初の子/× 単独で置かない |
<datalist> | 入力候補の一覧 | <input list=”colors”><datalist id=”colors”><option value=”赤”></datalist> | ○ 自由入力を許しつつ候補を出す/× 選択肢を強制したいなら select |
<progress> | 作業の進捗 | <progress value=”70″ max=”100″>70%</progress> | ○ アップロード進捗など「完了に向かう」もの/× 単なる割合の可視化には meter |
<meter> | 既知の範囲内における測定値 | <meter value=”0.7″>70%</meter> | ○ ディスク使用率・評価点/× 進捗の表現には使わない |
メディア・描画・対話のタグ
画像・動画・図形・対話UIのタグです。この分類はブラウザ側の実装状況が結果を左右するため、適合かどうかに加えてBaselineの確認が要ります。
画像・メディア
画像・動画・音声・外部コンテンツの埋め込みです。
| タグ | 意味・用途 | 使用例 | 使いどころ(○使う/×避ける) |
|---|---|---|---|
<img> | 画像の埋め込み | <img src=”photo.jpg” alt=”写真の説明” width=”800″ height=”600″ loading=”lazy”> | ○ alt と寸法を必ず書く/× 装飾画像以外で alt="" にしない |
<picture> | 条件による画像ソースの出し分け | <picture><source srcset=”img.webp” type=”image/webp”><img src=”img.jpg” alt=”説明”></picture> | ○ 形式・画面幅で切り替える/× img のフォールバックを省かない |
<source> | picture・video・audio のソース指定 | <source srcset=”img-sp.jpg” media=”(max-width: 768px)”> | ○ 親要素の中でのみ使う/× 単独では機能しない |
<figure> | 本文から参照される図表のまとまり | <figure><img src=”img.png” alt=”図”><figcaption>図1</figcaption></figure> | ○ 図・コード・引用+キャプション/× 単なる画像の置き場所にしない |
<figcaption> | figure の説明文 | <figcaption>デザイン構成図</figcaption> | ○ figure の最初か最後の子/× alt の代わりにはならない |
<video> | 動画の埋め込み | <video controls src=”movie.mp4″ poster=”thumb.jpg”></video> | ○ controls と字幕を付ける/× 自動再生+音声ありは避ける |
<audio> | 音声の埋め込み | <audio controls src=”audio.mp3″></audio> | ○ controls を付ける/× 背景で勝手に鳴らさない |
<track> | 字幕・キャプション | <track src=”sub.vtt” kind=”subtitles” srclang=”ja”> | ○ video には原則付ける/× kind の指定を省かない |
<iframe> | 別のHTML文書の埋め込み | <iframe src=”https://www.youtube.com/embed/…” title=”紹介動画” loading=”lazy”></iframe> | ○ title を必ず付ける/× 素性の分からない外部を sandbox なしで埋め込まない |
<embed> | 外部アプリケーション・プラグイン内容の埋め込み | <embed src=”file.pdf” type=”application/pdf”> | ○ 実質的に代替がない場合のみ/× 現代のブラウザの多くはプラグイン対応を廃止・削除済みで、embed に依存するのは賢明ではない(MDN) |
<object> | 外部リソースの埋め込み | <object data=”file.pdf” type=”application/pdf”></object> | ○ フォールバックを内側に書ける/× param 要素は非適合(data 属性を使う) |
<map> | イメージマップの定義 | <map name=”nav”>…</map> | ○ 図中の領域リンク/× レスポンシブでは座標がずれるため多用しない |
<area> | イメージマップ内のリンク領域 | <area shape=”rect” coords=”0,0,100,50″ href=”/” alt=”ホーム”> | ○ alt を必ず書く/× nohref・hreflang・type 属性は非適合 |
グラフィック・描画
図形と数式です。svg と math はHTMLとは別の仕様の要素ですが、HTML文書に直接書けます。
| タグ | 意味・用途 | 使用例 | 使いどころ(○使う/×避ける) |
|---|---|---|---|
<svg> | ベクター画像の描画 | <svg viewBox=”0 0 100 100″ role=”img” aria-label=”円”><circle cx=”50″ cy=”50″ r=”40″/></svg> | ○ アイコン・図・ロゴ/× 意味のある図には role と aria-label を付ける |
<canvas> | スクリプトで描くビットマップ領域 | <canvas id=”chart” width=”300″ height=”150″>グラフの説明</canvas> | ○ ゲーム・動的なグラフ/× 中身は支援技術に届かないので、代替テキストか併記の表を用意する |
<math> | MathMLによる数式 | <math><mfrac><mn>1</mn><mn>2</mn></mfrac></math> | ○ 数式を構造として表現/× 画像化した数式で代用すると読み上げできない |
インタラクティブ要素とWebコンポーネント
ユーザー操作に応答するタグと、カスタム要素のためのタグです。
| タグ | 意味・用途 | 使用例 | 使いどころ(○使う/×避ける) |
|---|---|---|---|
<details> | 折りたたみ可能なコンテンツ | <details><summary>もっと見る</summary><p>詳細</p></details> | ○ FAQ・補足の開閉/× 検索で見つけたい重要情報を初期状態で隠さない |
<summary> | details の見出し(クリックで開閉) | <summary>クリックして展開</summary> | ○ details の最初の子/× 中に見出しタグを入れる場合は階層に注意 |
<dialog> | ダイアログ・モーダル | <dialog id=”modal”><p>確認しますか?</p><form method=”dialog”><button>OK</button></form></dialog> | ○ form method="dialog" やインボーカーコマンドでJavaScriptなしの開閉もできる/× div の自作モーダルでフォーカス管理を再実装しない |
<template> | スクリプトで複製するための雛形 | <template id=”card”><div class=”card”></div></template> | ○ 動的に増える行・カード/× 中身は表示されないので初期表示に頼らない |
<slot> | Webコンポーネント内の差し込み位置 | <slot name=”title”></slot> | ○ シャドウDOMの中/× 通常のHTMLでは効果がない |
<dialog> は「JavaScriptと組み合わせて使うもの」と説明されることが多いのですが、現在は宣言的な開閉手段が用意されています。<form method="dialog"> による閉じる操作は当初からの機能で、加えてボタンの command・commandfor 属性(Invoker Commands API)で開閉を書けます。ただし後者のMDN Baselineは2025年12月からの Newly available(新しく利用可能)で、古い端末やブラウザでは動きません。2026年8月時点で本番投入するなら、JavaScriptのフォールバックを併記するのが安全です。
汎用コンテナ
意味を持たない箱です。これまでに挙げた分類のどれにも当てはまらないときにだけ使います。
| タグ | 意味・用途 | 使用例 | 使いどころ(○使う/×避ける) |
|---|---|---|---|
<div> | ブロックレベルの汎用コンテナ | <div class=”wrapper”>…</div> | ○ 純粋にレイアウト・スタイルのための箱/× header・main・nav・footer で表せるものを div で代用しない |
<span> | インラインの汎用コンテナ | <span class=”badge”>NEW</span> | ○ 文中の一部にスタイルや lang を当てる/× strong・em・code で表せる意味を span+CSSで代用しない |
使ってはいけない非適合要素29個
ここまでが適合する要素です。対して、仕様が「作者は使用してはならない」と名指ししている要素が29個あります。古い教材やテンプレートから紛れ込むのはほぼこの一覧の中からです。
非適合要素の一覧と代替
代替の欄は、HTML Living Standard §16.2 が示している置き換え先をそのまま日本語にしたものです。「ブラウザでの扱い」は、同じ仕様の §15(描画)または §16.3(実装要件)に規定が残っているかを示します。
| 要素 | かつての用途 | 仕様が示す代替 | ブラウザでの扱い |
|---|---|---|---|
<applet> | Javaアプレットの埋め込み | embed または object | 規定なし |
<acronym> | 頭字語 | abbr | 仕様に残る(abbr と同等に扱うことが実装に要求されている) |
<bgsound> | BGMの再生 | audio | 規定なし |
<basefont> | 文書全体の既定フォント指定 | 適切な要素またはCSS | 仕様に残る(非表示の既定スタイル) |
<big> | 文字を大きく表示 | 見出しなら h1、重要な文なら strong、参照目的なら mark | 仕様に残る(既定スタイル) |
<blink> | 文字の点滅 | 適切な要素またはCSS | 規定なし |
<center> | 中央揃え | CSS(text-align など) | 仕様に残る(既定スタイル) |
<dir> | ディレクトリ一覧 | ul | 仕様に残る(既定スタイル) |
<font> | 文字色・サイズ・書体の指定 | CSS | 仕様に残る(属性が描画のヒントとして規定) |
<frame> | フレームの1枚 | iframe+CSS、またはサーバー側の組み立て | 仕様に残る(§16.3で実装要件を規定) |
<frameset> | フレーム分割 | 同上 | 仕様に残る(§16.3で実装要件を規定) |
<noframes> | フレーム非対応時の代替 | 同上 | 仕様に残る(非表示の既定スタイル) |
<isindex> | 簡易検索欄の自動生成 | form とテキスト入力欄の組み合わせ | 規定なし |
<keygen> | 鍵ペアの生成 | 端末管理機能、または Web Cryptography API | 規定なし |
<listing> | 整形済みテキスト | pre+code | 仕様に残る(既定スタイル) |
<marquee> | 文字のスクロール | CSSのトランジション・アニメーション | 仕様に残る(§16.3で動作を規定) |
<menuitem> | コンテキストメニューの項目 | contextmenu イベントをスクリプトで処理する | 規定なし |
<multicol> | 段組み | 適切な要素またはCSS(段組みレイアウト) | 規定なし |
<nextid> | 識別子の自動採番 | GUID(一意な識別子) | 規定なし |
<nobr> | 改行の禁止 | 適切な要素またはCSS(white-space) | 仕様に残る(既定スタイル) |
<noembed> | embed 非対応時の代替 | フォールバックが要るなら embed ではなく object を使う | 仕様に残る(非表示の既定スタイル) |
<param> | object へのパラメータ | object の data 属性 | 仕様に残る(非表示の既定スタイル) |
<plaintext> | 以降を全てプレーンテキスト扱い | MIMEタイプ text/plain | 仕様に残る(既定スタイル) |
<rb> | ルビのベーステキスト | ruby の中に直接書くか、ruby を入れ子にする | 規定なし |
<rtc> | ルビ注釈のコンテナ | 同上 | 規定なし |
<spacer> | 余白の挿入 | 適切な要素またはCSS | 規定なし |
<strike> | 取り消し線 | 編集の記録なら del、そうでなければ s | 仕様に残る(既定スタイル) |
<tt> | 等幅フォント表示 | キー入力は kbd、変数は var、コードは code、出力は samp | 仕様に残る(既定スタイル) |
<xmp> | 整形済みテキスト | pre+code(< と & はエスケープする) | 仕様に残る(既定スタイル) |
「ブラウザで動く」は「使ってよい」ではない
上の表で「仕様に残る」となっている18個は、いま書いても画面上は動いてしまいます。これが混乱のもとです。仕様が実装側に互換動作を求めているのは、過去に公開された膨大なページを壊さないためであって、これから書くページのためではありません。
判断は単純です。29個のどれかを書いていたら、動いていても直す。逆に、この一覧に載っていない要素であれば、たとえ古めかしく見えても適合です(b・i・small・u は非適合ではなく、意味が再定義されて残っています)。
なお、非適合なのは要素だけではありません。table の border・cellpadding・bgcolor、img の align・hspace、a の rev など、属性側にも同じ「使用してはならない」の指定が並んでいます。原文の一覧はHTML Living Standard §16.2で確認できます。
よくあるタグ選びのミス
実務で頻出する誤用と、その置き換え先です。左の書き方を見つけたら、右の判断に従って直せます。
| よくある書き方 | 何が問題か | 正しい選択 |
|---|---|---|
| <div class=”header”> | ページ最上位の導入部が banner ランドマークにならない | header を使う |
| <div class=”main”> | 支援技術が本文へ直接ジャンプできない | main を1つ置く |
| <div class=”nav”> | ナビゲーションとして認識されない | nav を使う |
| <form role=”search”> | 属性で後付けする必要はもうない | search で囲む |
| <br><br> | 余白の調整に意味のない改行を使っている | CSSの margin・padding |
| <b>重要</b> | 重要性という意味が伝わらない | 重要なら strong、装飾だけならCSS |
| <s>削除済み</s> | 編集の記録なのか、単に無効なのかが区別できない | 編集履歴なら del |
| <table>でレイアウト | 読み上げ順が崩れ、モバイルで破綻する | CSS GridまたはFlexbox |
| h2の次にh4 | 見出しレベルの飛び降りは非適合 | h2 → h3 の順に置く |
| <address>東京都千代田区…</address> | 連絡先ではない一般の住所に使っている | 住所は p、連絡先だけ address |
| <div>にclickイベント | キーボード操作とフォーカスが失われる | button を使う |
| <span class=”code”> | コードであるという意味が伝わらない | code を使う |
この表の左側に心当たりがあるなら、次の検証で実際にどう出ているかを確かめてください。
検証|ランドマークの数で、タグ選択の正否を判定する
ここまでの表を読んでも、自分のページで選んだタグが効いているかどうかは分かりません。判定できる場所がひとつあります。アクセシビリティツリーのランドマークです。
header・main・nav・aside・footer・search は、正しい位置に置かれると暗黙のARIAロールを持ち、ランドマークとしてツリーに現れます。div で代用していると1つも現れません。つまりランドマークの数を数えれば、セクション系のタグ選択が効いているかを一発で判定できます。所要3分です。
手順|ページのランドマークを数える
対象のページをブラウザで開き、開発者ツールのコンソールに次のコードを貼り付けて実行します。要素と暗黙のロールの対応は W3C「ARIA in HTML」の定義に合わせています。
(() => {
const SCOPED = 'article, aside, main, nav, section';
const LANDMARKS = new Set(['banner','contentinfo','main','navigation','complementary','search','form','region']);
const named = (el) => !!(el.getAttribute('aria-label') || el.getAttribute('aria-labelledby'));
const implicitRole = (el) => {
const t = el.tagName.toLowerCase();
if (t === 'header') return el.closest(SCOPED) ? null : 'banner';
if (t === 'footer') return el.closest(SCOPED) ? null : 'contentinfo';
if (t === 'main') return 'main';
if (t === 'nav') return 'navigation';
if (t === 'aside') return 'complementary';
if (t === 'search') return 'search';
if (t === 'form') return named(el) ? 'form' : null;
if (t === 'section') return named(el) ? 'region' : null;
return null;
};
const rows = [];
document.querySelectorAll('header,footer,main,nav,aside,search,form,section,[role]').forEach((el) => {
const role = el.getAttribute('role') || implicitRole(el);
if (!role || !LANDMARKS.has(role)) return;
rows.push({ role, tag: el.tagName.toLowerCase(), name: el.getAttribute('aria-label') || '' });
});
const count = {};
rows.forEach((r) => { count[r.role] = (count[r.role] || 0) + 1; });
console.table(rows);
console.log(count);
})();実行すると、ランドマークの一覧と、ロールごとの個数が表示されます。参考までに、2026年8月時点のこのページで実行した実測値は banner: 1 / navigation: 3 / main: 1 / complementary: 1 / search: 1 / contentinfo: 1 でした。
同じことは開発者ツールのアクセシビリティ関連の表示からも確認できますが、パネルの名称と場所はブラウザのバージョンで変わります。ここではバージョンに依存しないコンソール実行を手順としました。
合否ライン
実行結果を次の表と突き合わせてください。すべての行が「合」であれば、セクション系のタグ選択は成立しています。
| ロール | 出るべき数 | 対応するタグ | 備考 |
|---|---|---|---|
banner | 1 | header(article・aside・main・nav・section の外側) | 0なら導入部が div になっている |
main | 1 | main | 2つ以上は非適合。表示中の main は1つだけ |
contentinfo | 1 | footer(banner と同じ入れ子の制約) | 0ならフッターが div になっている |
navigation | 1以上 | nav | 2つ以上あるなら aria-label で呼び分ける |
complementary | 補足領域があれば1以上 | aside | サイドバーが無いページは0でよい |
search | 検索欄があれば1 | search(または role="search") | 検索欄が無いページは0でよい |
ちなみに、2026年8月時点のこのページで実測したところ search ランドマークは <form role="search"> によって出ていました。<search> で囲めば、この role 属性は不要になります。表2で触れた話が、そのまま実測に現れる箇所です。
外れたときに見る場所
合否ラインを外れたときは、次の表で原因を切り分けてください。戻る先はこの記事の中にあります。
| 症状 | 直接の原因 | 戻る場所 |
|---|---|---|
| ランドマークが0件 | セクション系のタグを1つも使っていない | 「セクション・ページ構造」の表 |
banner・contentinfo が出ない | header・footer が article・aside・main・nav・section の内側にある | 同表の header・footer の行 |
main が2つ以上 | テンプレートとページ本体の両方で main を出力している | 同表の main の行 |
search が出ない | 検索フォームを div+form だけで組んでいる | 同表の search の行 |
navigation が多くて区別できない | 複数の nav に aria-label が無い | 同表の nav の行 |
complementary が本文に出る | 本文の続きを aside に入れている | 同表の aside の行 |
| ランドマークは正しいが読み上げの順序が意図と違う | 原因は見出しの階層側にある(別の論点) | 見出し構造の点検へ |
最後の1行だけはこの記事の範囲外です。ランドマークが揃っていて、それでも構造がおかしいと感じる場合は、見出しの並びを別に点検してください。ここで検証を止め、それ以上は追いません。
よくある質問(FAQ)
Q. HTMLタグは全部覚える必要がありますか?
暗記は不要です。この記事にまとめた適合要素は13分類・114個ありますが、1ページを組むのに実際に登場するのはそのうちのごく一部です。覚えておく価値があるのは個々のタグ名ではなく、「作者が使ってはならない要素が29個あり、それはHTML Living Standard §16.2 に列挙されている」という所在のほうです。判断に迷ったら、まず非適合の一覧に載っていないかを確認し、次にMDNでBaselineを見る、という順番が最短になります。
Q. 「HTML5で廃止されたタグ」とは結局どれのことですか?
HTMLにはバージョン番号がないため、正確には「廃止」ではなく「非適合(作者は使用してはならない)」です。対象は29個で、applet・acronym・bgsound・basefont・big・blink・center・dir・font・frame・frameset・isindex・keygen・listing・marquee・menuitem・multicol・nextid・nobr・noembed・noframes・param・plaintext・rb・rtc・spacer・strike・tt・xmp が該当します。このうち18個はブラウザ互換のために仕様側にも描画や動作の規定が残っており、書けば動いてしまいますが、それは使ってよい根拠にはなりません。
Q. セマンティックHTMLとは何ですか?なぜ重要ですか?
コンテンツの意味に合ったHTML要素を選ぶマークアップのことです。重要である理由は、効果が測定できる形で現れるからです。header・main・nav・aside・footer・search を正しく置くとアクセシビリティツリーにランドマークが生成され、支援技術の利用者はそこを目印にページ内を移動できます。div で代用するとランドマークは1つも生成されません。この記事の後半にある手順で、自分のページに実際にいくつ出ているかを数えられます。
Q. h1はページに1つだけにしなければいけませんか?
仕様上の要求ではありません。HTML Living Standard は「文書は複数のトップレベル見出しを含むことができる」として、h1 を3つ並べた例を適合として示しています。仕様が求めているのは、見出しが1つ以上あるならそのうち少なくとも1つがレベル1であること、そして直前の見出しに対してレベルを飛び降りないことの2点です。実務でh1を1つに絞る運用には別の合理性がありますが、それは仕様やSEOの規定ではなく設計上の判断です。
Q. menuタグはulと何が違いますか?
結論から言うと、支援技術への伝わり方は変わりません。MDNは menu について「仕様上は ul のセマンティックな代替として説明されているが、ブラウザからは、そしてアクセシビリティツリー上でも ul と何ら変わらないものとして扱われる」と明記しています。仕様上はツールバー(コマンドの並び)を表す意図がありますが、実効的な違いはありません。かつての「右クリックメニューを作る」用途は仕様から削除され、その名残の menuitem は非適合要素のひとつです。
Q. searchタグは今から使って大丈夫ですか?
問題ありません。MDNのBaselineでは2023年10月から Widely available(広く利用可能)です。最大の利点は、暗黙のARIAロールが search であるため、これまで <form role="search"> と書いていた role 属性の付与が不要になることです。検索欄と絞り込みUIをまとめて囲む用途に使い、検索結果そのものを囲む用途には使いません。
Q. ふりがな(ルビ)を付けるにはどのタグを使いますか?
ruby・rt・rp の3つです。ruby で全体を囲み、読みを rt に入れ、ルビ非対応環境のために括弧を rp で挟みます。仕様はこの用途を「日本語では振り仮名としても知られる」と明記しており、CSSでは代替できません。古い記事に出てくる rb と rtc は非適合で、ベーステキストは ruby の中に直接書くか ruby を入れ子にすれば足ります。
まとめ|迷ったら「非適合でないか」「ランドマークが出るか」の2点で見る
タグ選びで本当に判断が要るのは、次の2点だけです。
- 書こうとしている要素が非適合29個に入っていないか(入っていれば、動いていても直す)
- セクション系のタグがランドマークとして出ているか(出ていなければ
divで代用している)
残りは、この記事の表で「使いどころ」の列を見れば選べます。表を眺めて終わりにせず、いま作っているページで一度コンソールを開き、ランドマークを数えてみてください。banner・main・contentinfo の3つが1ずつ出ていれば、骨格は成立しています。
HTMLの規範は更新され続けます。この記事の内容は2026年8月2日時点でHTML Living StandardとMDNを直接参照して確認したものですが、判断に迷ったときは一次情報に当たってください。
- 仕様の原文(適合/非適合の判断): HTML Living Standard §16 Obsolete features
- 見出しとアウトラインの規定: HTML Living Standard §4.3 Sections
- 日本語の要素リファレンスとBaseline: MDN Web Docs|HTML 要素リファレンス
- 要素と暗黙のARIAロールの対応: W3C|ARIA in HTML
同じ形式のリファレンスと、手を動かして確認できる練習問題も用意しています。
▶ CSSプロパティ一覧【カテゴリ別・使用例付きリファレンス】
▶ WordPress関数一覧【テーマ・プラグイン開発向け使用例付きリファレンス】
コードの新旧を比べたいときは Diff Checker(コード比較ツール) も利用できます。ページのHTML構造やメタ情報をまとめて診断したい場合は、SEO診断ツールのDirebase(ディレベース)で1ページずつ確認できます。
