コンテンツ・モデルやカテゴリーを理解できれば、HTML5のマークアップをスムーズに記述できます!
コンテンツ・モデルとは?
HTMLの記述では、例えば、『<p>本文の<a href=”sample.html”>テキスト</a>です。</p>』というように、要素(p要素)の中に要素(a要素)を含めて記述することができます。
つまり、親要素(例えば、p要素)の中に、子要素(例えば、a要素)を含めるように、記述することができます。
しかし、この「親要素と子要素との関係」について、どのような組み合わせでも良いというわけではなく、この「親要素と子要素との関係」には、ルールが設定されています。
そのため、このルールとして、HTMLの各要素にはそれぞれ、『コンテンツ・モデル』が設定されています。
例えば、p要素には、『コンテンツ・モデル』として「フレージング・コンテンツ」が設定されています。
これは、言い換えると、「p要素を親要素とする場合、そのp要素の中に、子要素として、フレージング・コンテンツしか含めることができません。」という意味になります。
具体的には、例えば、以下の記述内容になります。
<p>ここの内容は<strong>重要事項</strong>になります。</p>
つまり、p要素の『コンテンツ・モデル』は「フレージング・コンテンツ」が設定されているため、上記のソースコードの通り、親要素であるp要素の子要素として、『カテゴリー』が「フレージング・コンテンツ」であるstrong要素が記述されています。
このように、『コンテンツ・モデル』を理解することで、親要素と子要素との関係を適切に整理することができ、コードを適切に記述することができます。
なお、『(カテゴリーが)「フレージング・コンテンツ」であるstrong要素』の意味については、次の『カテゴリー』の項目で説明致します。
カテゴリーとは?
HTML5において、各要素は、主に以下の7つの要素に分類されています。そして、その分類された『カテゴリー』を踏まえ、『コンテンツ・モデル』に基づいた記述を行う必要があります。
メタデータ・コンテンツ
Webページのタイトルやメタデータ等、HTML文書の概要を記述するための要素です。HTML文書の中では、head要素の中で記述される要素が、メタデータ・コンテンツに属します。
<base>、<command>、<link>、<meta>、<noscript>、<script>、<style>、<title>
フロー・コンテンツ
HTML文書の本体(内容)を記述するための要素です。HTML文書の中では、body要素の中で記述される要素が、フロー・コンテンツに属します。
<a>、 <abbr>、 <address>、 <area>、 <article>、 <aside>、 <audio>、 <b>、 <bdi>、 <bdo>、 <blockquote>、 <br>、 <button>、 <canvas>、 <cite>、 <code>、 <data>、 <datalist>、 <del>、 <details>、 <dfn>、 <div>、 <dl>、 <em>、 <embed>、 <fieldset>、 <figure>、 <footer>、 <form>、 <h1>、 <h2>、 <h3>、 <h4>、 <h5>、 <h6>、 <header>、 <hr>、 <i>、 <iframe>、 <img>、 <input>、 <ins>、 <kbd>、 <keygen>、 <label>、 <main>、 <map>、 <mark>、 <math>、 <menu>、 <meter>、 <nav>、 <noscript>、 <object>、 <ol>、 <output>、 <p>、 <pre>、 <progress>、 <q>、 <ruby>、 <s>、 <samp>、 <script>、 <section>、 <select>、 <small>、 <span>、 <strong>、 <style>、 <sub>、 <sup>、 <svg>、 <table>、 <template>、 <textarea>、 <time>、 <u>、 <ul>、 <var>、 <video>、 <wbr>、 テキスト
セクショニング・コンテンツ
文章の区分や節等、コンテンツの固まりの階層構造(アウトライン)を定義する要素です。
<article>、 <aside>、 <nav>、 <section>
ヘディング・コンテンツ
文章の中で、見出しを表す要素です。
<h1>、 <h2>、 <h3>、 <h4>、 <h5>、 <h6>
フレージング・コンテンツ
文章内のテキスト、及び段落内のテキストをマークアップするための要素です。
<a>、 <abbr>、 <area>、 <audio>、 <b>、 <bdi>、 <bdo>、 <br>、 <button>、 <canvas>、 <cite>、 <code>、 <data>、 <datalist>、 <del>、 <dfn>、 <em>、 <embed>、 <i>、 <iframe>、 <img>、 <input>、 <ins>、 <kbd>、 <keygen>、 <label>、 <map>、 <mark>、 <math>、 <meter>、 <noscript>、 <object>、 <output>、 <progress>、 <q>、 <ruby>、 <s>、 <samp>、 <script>、 <select>、 <small>、 <span>、 <strong>、 <sub>、 <sup>、 <svg>、 <template>、 <textarea>、 <time>、 <u>、 <var>、 <video>、 <wbr>、 テキスト
エンベディッド・コンテンツ
HTML文書に、外部リソースを埋め込むための要素です。外部リソースは、画像、動画、音声等のコンテンツに相当します。
<audio>、 <canvas>、 <embed>、 <iframe>、 <img>、 <math>、 <object>、 <svg>、 <video>
インタラクティブ・コンテンツ
ユーザーが操作することができるコンテンツ(入力フォーム等)を表す要素です。
<a>、 <audio>、 <button>、 <datalist>、 <embed>、<iframe>、 <img>、 <input>、 <keygen>、 <label>、 <menu>、 <object>、 <select>、 <textarea>、 <video>
その他の特殊なマークアップルール
その他の特殊なマークアップのルールについても見ていきましょう。
トランスペアレント・コンテンツ(コンテンツ・モデル)
『コンテンツ・モデル』として「トランスペアレント・コンテンツ」に属する要素は、親要素のコンテンツ・モデルを引き継ぐ性質を持っています。このため、親要素によって、中に含めることができる要素が変わります。
例えば、トランスペアレント・コンテンツに基づく記述は、以下のようになります。
<div><a href=”sample.html”><p>この内容は重要です。</p></a></div>
サンプルのソースコードのうち、a要素のコンテンツ・モデルは、トランスペアレント・コンテンツです。そして、div要素のコンテンツ・モデルは、フローコンテンツになります。このため、a要素のコンテンツ・モデルもフロー・コンテンツとなり、a要素の中には、カテゴリーがフロー・コンテンツであるp要素を含めることができます。
なお、コンテンツ・モデルの観点から自由度の高いトランスペアレント・コンテンツですが、そのトランスペアレント・コンテンツの中に、カテゴリーがインタラクティブ・コンテンツである要素を含めることは禁止されています。
パルパブル・コンテンツ(カテゴリー)
『カテゴリー』として、「パルパブル・コンテンツ」に属する要素は、その中に、hidden属性が指定されていない要素を1つ以上含める必要があります。
<a>、 <abbr>、 <address>、 <article>、 <aside>、 <audio>、 <b>、 <bdi>、 <bdo>、 <blockquote>、 <button>、 <canvas>、 <cite>、 <code>、 <data>、 <dfn>、 <div>、 <dl>、 <em>、 <embed>、 <fieldset>、 <figure>、 <footer>、 <form>、 <h1>、 <h2>、 <h3>、 <h4>、 <h5>、 <h6>、 <header>、 <i>、 <iframe>、 <img>、 <input>、 <ins>、 <kbd>、 <keygen>、 <label>、 <main>、 <map>、 <mark>、 <math>、 <meter>、 <nav>、 <object>、 <ol>、 <output>、 <p>、 <pre>、 <progress>、 <q>、 <ruby>、 <s>、 <samp>、 <section>、 <select>、 <small>、 <span>、 <strong>、 <sub>、 <sup>、 <svg>、 <table>、 <textarea>、 <time>、 <u>、 <ul>、 <var>、 <video>、テキスト
ここで、hidden属性は、全ての要素に指定が可能なグローバル属性の一つです。そして、要素にhidden属性を指定することで、ブラウザ上において、その要素の非表示を可能にする属性です。
すなわち、パルパブル・コンテンツに属する要素は、「ブラウザ上において、非表示にしてはならない」ということになります。
しかしながら、実際のコーディングにおいては、パルパブル・コンテンツの中が空となるように記述した場合であっても、ブラウザ上の表示に問題が生じることもないため、過剰に注意する必要性は無い、とも解釈されています。
セクショニング・ルート(カテゴリー)
「カテゴリー」として、「セクショニング・ルート」に属する要素は、セクションのルートとして扱うことが可能な要素になります。つまり、セクショニング・ルートに属する要素は、独自のアウトライン(階層構造)を持つことができます。
<blockquote>、 <body>、 <details>、 <fieldset>、 <figure>、 <td>
例えば、セクショニング・ルートに基づく記述は、以下のようになります。
<section>
<h1>見出し</h1>
<p>テキスト</h>
<blockquote>
<h2>引用タイトル</h2>
<p>引用文の内容</p>
</blockquote>
</section>
上記のソースコードでは、親要素であるsection要素の中に、子要素であるblockquote要素が記述されています。そして、親要素(section要素)の中には見出しとしてh1要素が記述されており、子要素(blockquote要素)の中においても見出しとしてh2要素が記述されています。
ここで、blockquote要素は、セクショニング・ルートに属する要素であるため、独自のアウトラインを持つことになります。このため、blockquote要素の中の見出し(h2要素)は、section要素の中の見出し(h1要素)とは関係を持つことなく、独立した見出しとしてブラウザ上で認識されます。
以上、コンテンツ・モデルやカテゴリーについて、ご参考になさってください!