[1] [[要素]]は、[DFN[[RUBYB[カテゴリー]@en[category]]]] [SRC[>>4]]
に属すると定義されることがあります。
複数の[[カテゴリー]]に属することもあります。

* 仕様書

[REFS[
- [4] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2017-09-16 15:17:26 +09:00]]) <https://html.spec.whatwg.org/#kinds-of-content>
- [7] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2017-09-16 15:17:26 +09:00]]) <https://html.spec.whatwg.org/#concept-element-categories>
- [9] [CITE@en-US[ARIA in HTML]] ([TIME[2017-09-10 07:44:56 +09:00]]) <https://w3c.github.io/html-aria/#allowed-aria-roles-states-and-properties>
]REFS]

* 一覧

[FIG(short list)[ [2] [[要素のカテゴリー]]
- [[メタデータ内容]]
- [[フロー内容]]
- [[章節付け内容]]
- [[見出し内容]]
- [[語句内容]]
- [[被埋込内容]]
- [[対話的内容]]
- [[触知可能内容]]
- [[スクリプト支援要素]]
- [[章節付け根]]
- [[フォーム被関連付け要素]]
- [[リスト化要素]]
- [[提出可能要素]]
- [[ラベル可能要素]]
- [[再設定可能要素]]
]FIG]

[5] どの[[カテゴリー][要素のカテゴリー]]に属するかは、[[要素]]の[F[名前空間]]と[F[局所名]]のみならず、
[[属性値]]や[[祖先]]、[[子孫]]にも影響されます。

[6] [[要素]]のみならず、[[テキスト]]もいくつかの[[カテゴリー][要素のカテゴリー]]には属しています。

[8] ここに示した[[要素のカテゴリー]]は、 [CITE[HTML Standard]] で定義されています。
どの[[要素]]がどの[[カテゴリー][要素のカテゴリー]]に属するかも、
[CITE[HTML Standard]] で定義されていますし、他の[[仕様書]]が定義する場合もあります。
(それぞれの項を参照。)

;; [67] 
[CITE[HTML Standard]] は [[Hixie]] がいなくなってから[[内容モデル]]の規定の記述を適正に運用できなくなったようで、
その後改変があった部分はそれ以前からの部分ほど一貫した記述になっていません。
仕様書の解釈を利用したいときは慎重に読む必要があります。



[10] [[ARIA]] は [CODE[role]] [[属性値]]に基づく 
[[HTML要素]]の[[カテゴリー][要素のカテゴリー]]を追加で規定しています [SRC[>>4]]。

[11] これはおおむね [CITE[HTML Standard]] による[[要素のカテゴリー]]により定められる[[内容モデル]]の制約と矛盾しませんが、
本来[[フロー内容]]ではない次の[[要素]]が、 [CODE[role]] [[属性値]]次第で[[フロー内容]]とみなされ得ることになります。
[[ARIA]] の規定をそのまま文字通り採用すると[[内容モデル]]の検査は破綻します。

[FIG(short list)[
- [CODE[li]]
- [CODE[dt]]
- [CODE[dd]]
- [CODE[td]]
- [CODE[th]]
- [CODE[figcaption]]
- [CODE[legend]]
- [CODE[optgroup]]
- [CODE[body]]
- [CODE[link]] (場合による)
- [CODE[rt]]
- [CODE[rp]]
]FIG]

同じく [CODE[role=heading]] も[[見出し内容]]となることになっていますが、
そのまま従うと [CODE[summary]] [[要素]]や [CODE[hgroup]] 
[[要素]]の[[内容モデル]]の検査に影響がありますし、
[[outline algorithm]] の動作まで変わってしまいます。

;; [[内容モデル]]も参照。

[12] 現実的には、本来の[[要素]]の制約を更に厳しく限定する場合のみ [CODE[role]]
[[属性値]]による分類を適用するべきでしょう。

* 文脈

[3] [[内容モデル]]の記述に使われます。具体例やその他の用法は、各[[カテゴリー][要素のカテゴリー]]の項を参照。

* 歴史

[13] [[内容モデル]]の概念の歴史は[[内容モデル]]を参照。

** SGML 時代

[14] [[HTML]] が [[SGML]] であると[[信じられていた][裸の王様]]時代、
[[HTML]] の [[SGML DTD]] の[[内容モデル]]の記述では、
便宜のため似たような制約を持つ[[要素型]]が[[引数実体]]としてまとめられていました。
[CODE[%inline]] や [CODE[%flow]] のような分類はここから生まれていきました。

[15] [[HTML4]] は[[行内要素]]や[[ブロック水準要素]]といった[[仕様書]]本文の用語としてもこの分類を活用し、
各[[要素]]の制約を規定していました。

[16] 以前から [[DTD]] 内の[[引数実体]]として存在していた「厳密」モードと非「厳密」モードの違いは、
[[HTML4]] により[[厳密DTD]]と[[移行用DTD]]として明確に区別されるようになりました。
両者の大きな違いの1つとして、各[[要素]]の[[内容モデル]]の違いがありました。
特に[[移行用DTD]]で [CODE[%flow]] を[[子供]]として認めていた[[要素]]の多くが[[厳密DTD]]
では [CODE[%block]] のみしか認められない ([CODE[%inline]] が認められない)
点が際立っていました。

** HTML5 時代前期

[17] 当初の [[HTML5]] ([CITE[Web Applications 1.0]]) は、
[[HTML4]] や [[XHTML 1.0]] の[[厳密DTD]]や [[XHTML 1.1]]
の流れを汲んだ、比較的厳格な[[内容モデル]]の制約を定めていました。
[[HTML4]] が曖昧だった点を明確化したり、
[[SGML DTD]] の技術的制約のため記述できなかった細部を改めたりといった変更を加え、
どちらかといえばより厳格化する方向の規定が含まれていました。

** HTML5 時代後期以降

[18] その後の [[HTML5]] の改訂により、
[[要素の分類]]と[[内容モデル]]の規定は大きく改められました。
この変更は、
厳しい基準を設けて世の中の大量の[[文書]]と[[著者]]に変更を強いる (そして無視される)
という10年以上続いてきた [[HTML]] の標準化の方針を転換し、
特別有害と考えられる場合を除き制約を緩和するもので、
[[HTML4]] の[[移行用DTD]]と比較しても更に緩い制限しか課さないものでした。
この方針は現在の [CITE[HTML Standard]] にも引き継がれています。