HTML の仕様について
まずは現在のHTMLの仕様について理解する必要があります。
今現在、HTML はWHATWGが策定している「HTML Living Standard」という唯一のルールに基づき使われています。
以前はW3Cという別の団体が作成していた「HTML4」や「HTML5」が使われていて、一時期「HTML5」と「HTML Living Standard」という別々の2つのルールが存在する状態になっていました。
そして、2021年1月、W3CのHTML関連の仕様はすべて廃止され、WHATWG の HTML Living Standard に完全統一されました。
それまで全世界的に使われていたW3CのHTML関連の仕様がすべて廃止されたのが2021年という事もあり、2023年現在でもW3Cの策定したルールと「HTML Living Standard」のルールがごちゃごちゃになってしまっています。その代表例がHTMLのインライン要素とブロック要素です。
HTML4における「ブロックレベル要素」と「インライン要素」
HTML4では、HTMLの要素は「ブロックレベル要素」「インライン要素」のどちらかに定義されていて、ある要素の中にどの要素を入れることができるのかという定義は、この「ブロックレベル要素」「インライン要素」という定義を使って決めていました。
一番判りやすい例として「インライン要素」の中に「ブロックレベル要素」は入れられない、というものでした。
HTML4でNGな例
HTML4でOKな例
HTML Living Standardにおける「ブロックレベル要素」と「インライン要素」
HTML Living Standardでは、HTML4の仕様である「ブロックレベル要素」と「インライン要素」は廃止されたので、今現在HTMLに「ブロックレベル要素」と「インライン要素」というものはありません。
代わりとなるものにコンテンツモデルというものが出て来ました。
コンテンツカテゴリー
ほとんどの HTML 要素は 1 つ以上のコンテンツカテゴリーに属していて、カテゴリーごとに共通した特徴を持つ要素を分類しています。これは緩やかなグループ分けです。例えば「h1」はフローコンテンツと見出しコンテンツに属します。
コンテンツモデル
ある要素の中にどの要素を入れることが出来るか、どうかはこのコンテンツモデルで決まります。
フローコンテンツの中にフローコンテンツを入れる事は可能ですが、記述コンテンツ (phrasing content) の中にフローコンテンツを入れる事は出来ません。