【保存版】HTMLでやってはいけない入れ子構造とは?タグの正しい使い方とNG例を徹底解説

HTML を“なんとなく”書いていると、知らないうちに 「絶対に親子にしてはいけない関係」 を作ってしまうことがあります。
代表例は、<table> 直下に <div> を置くパターン。今回は 「入れ子にできないタグ」の代表例と、なぜダメなのか/どう直すべきか をまとめました。

そもそも何が起きるのか?

症状内容
レンダリングずれブラウザが強制的にタグを閉じたり自動補完するため、意図しない位置に要素が移動する。
アクセシビリティ低下スクリーンリーダーが正しいツリーを前提に読み上げるため、意味が崩れると情報が飛ぶ。
CSS/JS バグセレクタが想定の DOM 構造を前提にしていると、スタイル・スクリプトが効かない。
SEO への影響クローラも DOM を解析する。構造が壊れると重要な情報が抜け落ちる可能性。
バリデータ警告・エラーW3C Markup Validation Service 等でエラーが出て公開前の自動チェックでエラーになることも。

代表的な「親子禁止」リストと理由

親タグ許可される 直接 子要素NG 例ダメな理由
tablecaption, colgroup, thead, tbody, tfoot, tr<div>, <p>仕様外。ブラウザは勝手に <tbody> を挿入→要素を外側へ追い出す。
trth, td, template<div>, テキストノードセルとみなされず、行が崩れる。
ul / olli, script, template<div>, <p>リストマーカーが付かない/自動的に要素を囲むため意図しないマークアップに。
selectoption, optgroup, script, template<div>一部ブラウザで完全に無視→選択肢が表示されない。
dldt, dd, script, template<p>, <div>定義リストが壊れ、正しく対を認識できない。
pPhrasing content(インライン系)<div>, h1 などブロック要素ブラウザが自動で <p> を閉じ、予期せぬタグ分割が発生。
aフローコンテンツ(ただし別の abutton は不可<a> ネストインタラクティブ要素の重複禁止。リンクが分割され挙動があいまいに。
buttonフレージング(a, button, input, select, textarea などインタラクティブ要素は不可)<button> ネストフォーム API が混乱し、スクリーンリーダーで誤認識。
labelフレージング(label は不可)<label> ネスト対象フォーム要素が特定できず、クリックでフォーカスが移動しない。
空 (void) 要素img, br, hr, input, meta子要素を持てない子タグを追加完全に無視されるか、ブラウザが自動的に切り離す。

💡 ポイント
「許可される 直接 子要素」 を覚えると安全。ネスト可否は 孫世代 ではなく 親子関係が対象 になるため、<ul><li><div> のように一段挟めば OK になる場合もあります。

正しいマークアップ例

NG 例(テーブルに
直書き)

<table class="price">
  <div class="attention">※価格は税込</div>
  <tr><th>商品</th><td>1,000円</td></tr>
</table>

OK 例(キャプションまたは外側へ移動)

<table class="price">
  <caption class="attention">※価格は税込</caption>
  <tr><th>商品</th><td>1,000円</td></tr>
</table>

もしくは

<div class="attention">※価格は税込</div>
<table class="price">
  <tr><th>商品</th><td>1,000円</td></tr>
</table>

なぜ“仕様準拠”が大切なのか

  1. 長期保守コストの削減
    適切な DOM 構造は CSS リファクタリングや JS 置き換え時のバグを激減させます。
  2. アクセシビリティ & 法規制対応
    日本でも JIS X 8341-3(WCAG 準拠)への配慮が求められるケースが増加。
  3. SEO
    検索エンジンは「文書の意味」を解析して順位を決めます。だから文書構造化が大切
  4. 将来のフロントエンド刷新に強い
    React/Vue などへ置き換える際、HTML が正しいとマイグレーションが楽。

事故を防ぐチェックリスト

タイミング施策
コーディング中エディタ拡張(VS Code HTML Hint, Emmet lint 等)でリアルタイム警告を出す。
CI/CDGitHub Actions で html-validatenuxt build --fail-on-warnings などを実行。
リリース前Lighthouse/axe DevTools でアクセシビリティ監査。
運用定期的に W3C バリデータにかけ、ブログ担当者全員で結果を共有。

まとめ

HTML は「文書の構造」を表す言語。構造が壊れると、見えないところで UX と信頼を下げます。

  • 「直接子要素ルール」を把握
  • ツールで自動検出
  • エラーは 放置せず すぐ修正

これだけで、保守性・アクセシビリティ・SEO の三拍子がそろったサイト運営になります。
次に記事を公開する前に一度バリデータを走らせてみてください。誤った入れ子がゼロになれば、エンジニアチームからも「わかってるね!」と喝采が上がるはずです

AI活用をもっと学びたい方へ

「AIって便利そうだけど、使いこなせるか不安…」 「他の業務にもAIを活用してみたいけど、何から始めればいいかわからない」 そんな方のために、 あなたの業務やスキルレベルに合わせた【無料の個別相談】を実施しています。

あなたの作業に合ったAIツールの選定、ChatGPTやGeminiの具体的な使い方サポート、業務効率アップのためのプロンプトテンプレート提供

まずは気軽にご相談ください!

無料相談はこちらから