いきなりですが、以下の質問に答えられますか?
- Q1.ul要素の子要素として、p要素を入れれますか。
- 例えば以下のコードは正しいでしょうか
-
<ul> <p>テキスト</p> <li>テキスト</li> </ul>
- Q2.dd要素の子要素として、dl要素を入れれますか。
- 例えば以下のコードは正しいでしょうか
-
<dl> <dt>テキスト</dt> <dd> <dl> <dt>テキスト</dt> <dd>テキスト</dd> </dl> </dd> </dl>
- Q1.ul要素の子要素として、p要素を入れれますか?
- NO
- Q2.dd要素の子要素として、dl要素を入れれますか?
- YES
それぞれの要素には、子要素として入れて良い要素と入れてはいけない要素があります。
この記事で詳しくみていきます。
記事で取り上げる内容
- 入れてもいい子要素を決めるルール「コンテンツモデル」の解説
- 要素を分類する「カテゴリー」の主要7分類の解説
- コンテンツモデルの調べ方
記事を読むメリット
- コンテンツモデルとカテゴリーについて理解できる
- 「どの要素を子要素として入れていいか」の調べ方がしっかりと身に付く
- HTMLの標準仕様書「HTML Living Standard」の見方がわかり、HTML中級者へステップアップできる
それではさっそくみていきましょう。
コンテンツモデル
「コンテンツモデル」とは、ある要素の子要素として入れれる要素の集まりのことです。
要素ごとにそれぞれのコンテンツモデルを持っています。
例えば、ul要素のコンテンツモデルは、li要素です。(厳密に言えばあと数個特殊な要素を子要素として入れれますが、ここでは言及しません)
なので、ul要素の子要素として、li要素を入れれます。
逆に、ul要素の子要素として、li要素以外のp要素やa要素などは入れれません。
あとで要素ごとのコンテンツモデルの調べ方を紹介します。
ですが、その前にコンテンツモデルと関わる「カテゴリー」について説明します。
カテゴリー
カテゴリーとは、要素を特徴により分類したものです。
なので、同じカテゴリーに属する要素は似た特徴を持ちます。
ほとんどの要素は一つ以上のカテゴリーに属しています。(中にはどのカテゴリーにも属していない要素(html要素、li要素など)もあります)
カテゴリーの図
主要な7つのカテゴリーは以下です。
メタデータコンテンツ(metadata content)
- メタデータコンテンツに属する要素
-
- link
- meta
- style
- などの要素
- 特徴
- 主にHTMLのヘッダに記載する要素群。他の文書とのリンクを伝えたり、本文外の情報を伝えます。
フローコンテンツ(Flow content)
- フローコンテンツに属する要素
-
- div
- dl
- ul
- 他多数の要素
- 特徴
body
要素の中に入れることができるほとんどの要素がこのカテゴリーに属します。このカテゴリーに属していない要素はtitle、liなど。
フレージングコンテンツ(Phrasing content)
- 記述コンテンツに属する要素
-
- a
- span
- small
- q
- 他多数の要素
- 特徴
- フローコンテンツの中で、特に文章中に出現する要素群です。
セクショニングコンテンツ(Sectioning content)
- セクショニングコンテンツに属する要素
-
- article
- aside
- nav
- section
- 特徴
- 文書構造・セクションを定める要素群です。
ヘッディングコンテンツ(Heading content)
- ヘッディングコンテンツに属する要素
-
- h1~h6
- hgroup
- 特徴
- ページやセクションなどの見出しを示す要素群です。
エンベデッドコンテンツ(Embedded content)
- エンベデッドコンテンツに属する要素
-
- audio
- img
- iframe
- picture
- などの要素
- 特徴
- 画像とか数式などの埋め込み系の要素群です。
インタラクティブコンテンツ(interactive content)
- インタラクティブコンテンツに属する要素
-
- button
- details
- input(type属性がhidden以外の時のみ)
- a(href属性がある時のみ)
- などの要素
- 特徴
- クリック操作可能など、インタラクティブな機能を持つ要素群
主要カテゴリーを見てきました。しかし、全て覚える必要はありません。
覚えて欲しいのは、
ことです。- 補足
-
ある要素を子要素として入れれるかどうかは、ある要素がどのカテゴリーに属しているかにより決まることが多いです。
例えば、p要素の子要素として、フレージングコンテンツに属する要素を入れれます。
具体的に何を言っているかはまだ理解できないと思いますが、ニュアンスだけでも感じてください。
コンテンツモデル(ある要素に入れても良い子要素の集まり)の調べ方
ではコンテンツモデルの調べ方を解説します。ですがその前に一旦おさらいです。
- コンテンツモデルとは、「ある要素の子要素として、入れていい要素の集まり」です。
- カテゴリーとは、「要素を特徴により分類したもの」です。
この二つだけ覚えておいてください。
コンテンツモデルを調べるために、以下のサイトを使用します。
英語:HTML Living Standard
日本語:HTML Living Standard
英語に抵抗がない方は、最新の情報が掲載されている英語版をご参照ください。
以降、この記事では英語版で解説していきます。
(日本語版でも手順は同じなので、適宜読み替えてください)
それでは調べていきます。
div要素のコンテンツモデルを調べる
以下がコンテンツモデルの調べ方です。手順に沿って進めてください
-
以下のリンク先を開く
英語:HTML Living Standard -
このページの「4.4.16 The div element」リンクをクリックします。(見つけにくい場合は「The div element」で検索するとヒットします)
-
div要素の解説が表示されます。
div要素のコンテンツモデルは「Content model」に書かれています。内容は以下です。
If the element is a child of a dl element: one or more dt elements followed by one or more dd elements, optionally intermixed with script-supporting elements. If the element is not a child of a dl element: flow content.
- 和訳すると、div要素のコンテンツモデルは以下になります
- ・div要素がdlの子要素の時は、dt要素でなおかつ一個以上のdd要素が続くもの
- ・div要素がdlの子要素ではない時は、フローコンテンツに属する要素
-
フローコンテンツに属する要素を確認するため、「flow content」をクリックします。
-
フローコンテンツに属する要素の一覧が表示されます
- div要素のコンテンツモデル
- ・div要素がdl要素の子要素の時は、dt要素でなおかつ一個以上のdd要素が続くもの
- ・div要素がdl要素の子要素ではない時は、フローコンテンツ
- フローコンテンツの要素一覧
コンテンツモデルに則したコーディング、則していないコーディングの具体例
調べた情報をもとに、div
要素を用いた具体的なコーディングのNG例、OK例を挙げると以下になります。
- OK(理由:
a
要素はフローコンテンツに属するので、div
要素の子要素として入れれる) -
<div> <a href="#">リンク</a> </div>
- OK(理由:
div
要素自身もフローコンテンツに属するので、div
要素の子要素として入れれる) -
<div> <div>テキスト</div> </div>
- NG(理由:
title
要素はフローコンテンツに属さないので、div
要素の子要素として入れれない) -
<div> <title>テキスト</title> </div>
- OK(理由:
div
要素がdl
要素の子要素の時、dt
要素でなおかつdd
要素が続くものを子要素として入れれる) -
<dl> <div> <dt>タイトル</dt> <dd>説明</dd> </div> </dl>
- NG(理由:div要素がdl要素の子要素の時、dt要素とdd要素以外は子要素として入れれない)
-
<dl> <div> <p>説明</p> </div> </dl>
おさらい
ざっと調べ方をおさらいします。
-
以下のページを開く
英語:HTML Living Standard
- 調べたい要素の「◯.◯.◯ The [要素名] element」をクリックする。見つけにくい場合は「The [要素名] element」で検索する
-
要素の解説が表示される。
- 「Content model」で、要素のコンテンツモデルを確認する。
-
もしカテゴリーにどの要素が属するかわからない時は、カテゴリーリンクをクリックして、要素一覧を確認する
以上でコンテンツモデルの調べ方を学びました。
最初は面倒に感じるかも知れませんが、慣れるまでの辛抱です。
最後に実践用として、いくつかの設問を用意しました。
コンテンツモデルの調べ方を定着させるために、ぜひ挑戦してみてください。
- 補足
-
ついでに要素の解説の他の項目について触れておきます。
- Categories
- 要素が属するカテゴリー
- Contexts in which this element can be used
- 要素が使用可能なコンテキスト
div要素の「Contexts in which this element can be used」の内容は以下です。Where flow content is expected. As a child of a dl element.
- 和訳すると、div要素が使用可能なコンテキストは以下です。
- ・フローコンテンツが期待されるところ
- ・dlの子要素
実践!いろいろな要素のコンテンツモデルを調べる
それぞれの要素のコンテンツモデルを調べて、設問に解答してください。
Q1-1.h1要素の子要素として、p要素を入れれる?
Q1-2.h1要素の子要素として、a要素を入れれる?
Q2-1.p要素の子要素として、img要素を入れれる?
Q2-2.p要素の子要素として、p要素を入れれる?
Q3.table要素の子要素として、div要素を入れれる?
コンテンツモデルの調べ方↓
-
以下のページを開く
英語:HTML Living Standard
- 調べたい要素の「◯.◯.◯ The [要素名] element」をクリックする。見つけにくい場合は「The [要素名] element」で検索する
-
要素の解説が表示される。
- 「Content model」で、要素のコンテンツモデルを確認する。
-
もしカテゴリーにどの要素が属するかわからない時は、カテゴリーリンクをクリックして、要素一覧を確認する
解答↓
- Q1-1の回答
- h1要素の子要素として、p要素を入れれない
- Q1-2の解答
- h1要素の子要素として、a要素を入れれる。
-
<解説>
h1の子要素として入れれるのは、フレージングコンテンツに属する要素のみ。
p要素はフレージングコンテンツに属さない。なのでh1の子要素としてp要素は入れれない。
a要素はフレージングコンテンツに属する。なのでh1の子要素としてa要素は入れれない。h1要素を用いたコーディングでのOK例とNG例は以下
- NG(理由:h1要素の子要素として、p要素を入れれない)
-
<h1> <p>テキスト</p> </h1>
- OK(理由:h1要素の子要素として、a要素を入れれる)
-
<h1> <a href="https://developer.mozilla.org/ja/docs/Web/HTML/Element/table">テキスト</a> </h1>
- Q2-1の解答
- p要素の子要素として、img要素を入れれる
- Q2-2の解答
- p要素の子要素として、p要素を入れれない
-
<解説>
p要素の子要素として入れれるのは、フレージングコンテンツに属する要素のみ
img要素はフレージングコンテンツに属する。なのでp要素の子要素として入れれる
p要素はフレージングコンテンツに属さない。なのでp要素の子要素として入れれないp要素を用いたコーディングでのOK例とNG例は以下
- OK(理由:p要素の子要素として、img要素を入れれる)
-
<p> <img src="https://developer.mozilla.org/ja/docs/Web/HTML/Element/table"> </p>
- NG(理由:p要素の子要素として、p要素を入れれない)
-
<p> <p>テキスト</p> </p>
- Q3の解答
- table要素の子要素として、div要素を入れれない
-
<解説>
table要素は子要素として、以下の要素を入れれる
・caption要素
・colgroup要素
・thead要素
・tbody要素
・tr要素
・tfoot要素
・スクリプト対応要素(script要素とtemplate要素)
div要素は上記のいずれでもない。なのでtable要素の子要素として入れれない。table要素を用いたコーディングでのOK例とNG例は以下
- OK(理由:table要素の子要素として、tr要素を入れれる)
-
<table> <tr> <td>テキスト</td> </tr> </table>
- NG(理由:table要素の子要素として、div要素を入れれない)
-
<table> <div>テキスト</div> </table>
まとめ
最初はコンテンツモデルとカテゴリーを調べることを面倒と感じるかも知れません。
しかし、この調べ方を身につければ、「入れれる子要素を確認するために、サイトを何件もハシゴする」といった手間を省けます。
また、HTML Living Standard は信頼できる情報源です。ここから得た知識を持つことでより正確なコーディングができることでしょう。
HTML5 入れ子チートシート
調べたい要素をクリックすると、親と子それぞれで使用できる要素がハイライトされます。
コメント