このページでは、HTML4.01 の要素の包含関係について説明します。HTML5 では概念ががらりと変わっているので、そちらを参照してください。
HTML4.01 の仕様書では、HTML の各要素は次のような包含関係を持つと定義されています。
□ html │ │ <!-- ヘッダ --> ├□ head │├○ base | meta | link │├○ isindex(strict では不可) │├□ title | script | style ││└◇ 文字 │└□ object │ └○ param │ │ <!-- ボディ --> ├□ body │├◇ ブロック要素 │├◇ インライン要素(strict では不可) │├□ script ││└◇ 文字 │└□ ins | del(孫要素として登場してよい) │ └◇ ブロック要素 | インライン要素 │ │ <!-- フレーム --> └□ frameset(frameset の場合のみ) ├□ frameset ├○ frame └□ noframes └□ body(noframes を含んではならない)
これは、html要素(<html>~</html>)はその中に head要素(<head>~</head>)、body要素(<body>~</body>)や frameset要素(<frameset>~</frameset>)を包含することができることを意味します。正確には、head要素は1回のみ先頭に、body と frameset はどちらか一方のみなど、細かな規定があるのですが、ここでは省略します。
aaa | bbb は 「aaa または bbb」 を意味します。□ は子要素や内容を含むことができる要素、○ は終了タグの無い要素、◇ はその他を示しています。
ブロック要素は通常、前後が改行された形式で表示されます。
◇ ブロック要素 │ ├○ hr ├□ h1 | h2 | h3 | h4 | h5 | h6 | p │└◇ インライン要素 ├□ div │└◇ ブロック要素 | インライン要素 ├□ center(strict では不可) │└◇ ブロック要素 | インライン要素 ├□ pre │└◇ インライン要素(img|object|applet|big|small| │ sub|sup|font|basefont を含んではならない) ├□ blockquote │├□ script ││└◇ 文字 │├◇ インライン要素(strict では不可) │└◇ ブロック要素 ├□ address │├□ p(strict では不可) ││└◇ インライン要素 │└◇ インライン要素 ├□ noscript │├◇ インライン要素(strict では不可) │└◇ ブロック要素 ├□ noframes(strict では不可) │└◇ ブロック要素 | インライン要素 │ │<!-- リスト系 --> ├□ ul | ol │└□ li │ └◇ ブロック要素 | インライン要素 ├□ dir | menu(strict では不可) │└□ li │ └◇ インライン要素 ├□ dl │├□ dt ││└◇ インライン要素 │└□ dd │ └◇ ブロック要素 | インライン要素 │ │<!-- テーブル系 --> ├□ table │├□ caption ││└◇ インライン要素 │├○ col │├□ colgroup ││└○ col │└□ thead | tbody | tfoot │ └□ tr │ └□ th | td │ └◇ ブロック要素 | インライン要素 │ │<!-- フォーム系 --> ├□ form │├□ script ││└◇ 文字 │├◇ インライン要素(strict では不可) │└◇ ブロック要素(form を含んではならない) └□ fieldset ├◇ 文字 ├□ legend(必須) │└◇ インライン要素 └◇ ブロック要素 | インライン要素
インライン要素は通常、前後に改行がはいることなく表示されます。
◇ インライン要素 ├○ br | img ├□ iframe(strict では不可) │└◇ ブロック要素 | インライン要素 ├□ a │└◇ インライン要素(a を含んではならない) ├□ map │├◇ ブロック要素 │└○ area │ │<!-- 文字・フォント系 --> ├◇ 文字 ├□ font(strict では不可) │└◇ インライン要素 ├○ basefont(strict では不可) ├□ tt | i | b | big | small | ││ em | string | dfn | code | samp | kbd | ││ var | cite | abbr | acronym | ││ sub | sup | span | bdo | q │└◇ インライン要素 │ │<!-- 埋めこみ系 --> ├□ script │└◇ 文字 ├□ applet(strict では不可) │├○ param │└◇ ブロック要素 | インライン要素 ├□ object │├○ param │└◇ ブロック要素 | インライン要素 │ │<!-- フォーム系 --> ├□ label │└◇ インライン要素(label を含んではならない) ├○ input ├□ select │├□ optgroup ││└□ option ││ └◇ #pcdata │└□ option │ └◇ #pcdata ├□ textarea │└◇ #pcdata └□ button └◇ ブロック要素 | インライン要素 (a|form|fieldset|input|select|textarea|label|button| isindex|iframe を含んではならない)
HTML4.01 Strict の仕様に従う場合、body要素の直下にインライン要素を記述することができません。従って、文字や、画像などのインライン要素を記述する場合は、必ず何かのブロック要素で囲って記述する必要があります。html4.01 transitional の場合は、インライン要素を直接記述することができます。
table の直下には tr を包含できません。ただし、tbody は開始タグも終了タグも省略可能なので、直下に tr を記述した場合は <tbody>~</tbody> が省略されていると見なされます。
ins と del は body の子要素や孫要素としてどこでも記述することができます。ある時はブロック要素として、ある時はインライン要素として振舞います。ただし、インライン要素としてふるまっている時は、内部にブロック要素を包含することができません。