HTML Living Standard  第1部 HTML 4 文書を形作る基本要素


 

4 文書を形作る基本要素

見出しや段落、改行など文書を形作る基本的な要素について説明します。

4.1 見出し (h1 h2 h3 h4 h5 h6)

ある程度の長さの文章を書くときは、本文の大きな内容のまとまりを分かりやすく示すために見出しをつけます。さらに長い文章の場合は、内容を細分化して大見出し、中見出し、小見出しといった具合に、段階に応じた階層的な見出しをつけていきます。

この階層的な見出しを表現するために、HTMLでは <h1> から <h6> まで6段階の見出し(Heading)要素が用意されています。<h1> がもっとも重要な見出しで、数字の順に階層が大見出しから中見出し、小見出しといった具合に移行します。文章の構造に合わせ、<h1> から順番に使用していきます。

したがって、<h2> から <h6> は何回出現してもかまいませんが、<h1> は最上位のただ1回にすべきです。

h1 h2 h3 h4 h5 h6 要素

セクションの見出しを指定する。<h1> に近いほど見出しのランクが高くなり、<h6> に近いほど低くなる。

表示される文字の大きさや上下のマージンは、<h1>~<h6> によって異なる。

属性

なし

記述例
<body>
  <section>
    <h1>第1巻</h1>
    <section>
      <h2>第1章</h2>
      <section>
        <h3>第1節</h3></section>
      <section>
        <h3>第2節</h3></section></section>
    <section>
      <h2>第2章</h2></section></section>
</body>

ただし、文書の構造は <h1> や <h2> などの見出しで決まるのではなく、section 要素などの包含関係で決定します。したがって、第2章が <h4> であったとしても、第1章第1節に含まれてしまうということはありません。つまり、セクション分けが行われてさえすれば、<h1> と書こうが <h6> と書こうがまったく一緒だということです。

記述例
    <section>
      <h2>第1章</h2>            1 第1章
      <section>
        <h3>第1節</h3>            1.1 第1節
      </section>
    </section>
    <section>
      <h4>第2章</h4>            2 第2章
    </section>

よって、section 要素で包含関係を記述した場合、すべて <h1> で記述するよう推奨されたこともありましたが、最新の勧告では包含関係に合わせた <h1>~<h6> を記述することが推奨されています。

記述例
    <section>
      <h2>第1章</h2>            1 第1章
      <section>
        <h3>第1節</h3>            1.1 第1節
      </section>
    </section>
    <section>
      <h2>第2章</h2>            2 第2章
    </section>

しかし、<section> などが省略してしまうと、 <h1> ~ <h6> のレベルに合わせた階層構造が暗黙的に想定されてしまうので、注意が必要です。

記述例
      <h2>第1章</h2>              1 第1章
        <h3>第1節</h3>              1.1 第1節
      <h4>第2章</h4>                  1.1.1 第2章



HTMLを書いてみよう 1-4-1

h1~H6 タグを使って見出しを表示しなさい。

  <h1>h1 タグは大見出しに使います。例えば、部などです。</h1>
  <h2>h2 タグは中見出しに使います。例えば、章などです。</h2>
  <h3>h3 タグは小見出しです。例えば、節などです。</h3>
  <h4>h4 タグはさらに細かい見出しです。例えば、項などです。</h4>
  <h5>h5 タグはもっと細かい見出しです。例えば、段落などです。</h5>
  <h6>h6 タグはもっともっと細かい見出しです。例えば、小段落などです。</h6>

解答例 (別ウィンドウで開きます)

4.2 段落 (p)

一般に文章はいくつかの段落(Paragraph)の集まりとして構成されています。段落は文書の内容的なまとまりを示す基本的な「要素」です。

HTML 文書における段落は、p 要素を用いて表します。

p 要素

ひとつの段落(パラグラフ)であることを表す。

上下にマージンがとられるので、続けて記述した場合は段落の間に1行分の余白が取られる。

属性

なし

記述例
<p>そら雲が出た     まっ黒な大きい雲だ</p>
<p>だんだん空に広がってきた
今日は雨が降るぞ</p>

上の HTML 文書は、一般的なブラウザでは次のように表示されます。

表示例

HTML 文書に書かれたタグではない文字列は、ブラウザで表示されます。ただし、連続する空白、タブ、改行はひとつの空白に置き換えられます。しかし、全角の空白はそのまま表示されます。

また、p 要素間には、1行分の余白が入ります。


p 要素は、よりふさわしい要素がある場合には使用するべきではありません。 例えば、次の p 要素は書かれている位置にもよりますが ...

記述例
  <p>Last updated: April 26, 2023</p>

下のようにした方がよいでしょう。

記述例
  <footer>Last updated: April 26, 2023</footer>

4.3 改行 (br)

「4.2 段落」で書いたように、改行はひとつの空白に置き換えられてしまいます。そのため、ブラウザで表示されたときに改行したい場合は、<br> タグで、明示的に改行を記述する必要があります。

なお、<br> には、終了タグはありません。

br 要素

改行を表す。終了タグはない。

本来なら段落を分けるべきところでは使用すべきではない。

属性

なし

記述例
<p>春雨や<br>暮れなむとして<br>けふもあり</p>

上の HTML 文書は、一般的なブラウザでは次のように表示されます。

表示例

ただし、本来段落を分けるべきところには使用すべきではありません。

記述例
<p>行く川のながれは絶えずして、しかも本の水にあらず。<br>よどみに浮ぶうたかたは、かつ消えかつ結びて久しくとゞまることなし。</p>

それぞれを p 要素として記述すべきです。

記述例
<p>行く川のながれは絶えずして、しかも本の水にあらず。</p>
<p>よどみに浮ぶうたかたは、かつ消えかつ結びて久しくとゞまることなし。</p>

4.4 改行可能位置 (wbr)

wbr 要素は、改行位置の候補を表します。例えば、スペースを入れずに英単語を連続させた場合、通常は右端で折り返されずに領域をはみ出してしまいます。しかし、<wbr> が記述されていると、必要に応じて折り返されるようになります。<br> とは異なり、強制的に改行されるのではなく、改行すべきだったらこの位置で改行してほしいという指示です。

なお、<wbr> には、<br> と同様終了タグはありません。

wbr 要素

改行位置の候補を表す。終了タグはない。

単語の字数が長くて本来なら折返しが出来ない場合、折返しを許可する箇所に入れる。ただし、日本語では機能しない。

属性

なし

記述例
<p>ランヴァイル<wbr>プルグウィンギル<wbr>ゴゲリフウィルンドロブル<wbr>ランティシリオゴゴゴホ</p>
<p>Llanfair<wbr>pwllgwyngyll<wbr>gogerychwyrndrobwll<wbr>llantysiliogogogoch</p>

上の HTML 文書の改行されている場所は、wbr 要素のところです(wbr 要素のところで必ず改行されるわけではありません)。ただし、wbr 要素は、日本語では機能しないようです。

なお、文字列が折り返すように表示枠を狭めています。

表示例

4.5 区切り (hr)

hr 要素は、段落レベルのテーマの区切り、セクション内における、セクションを分けるほどでもない話題の区切りを表す際に使用します。

セクション同士の区切りとなる </section><section> の間については、すでにそれ自体でテーマの区切りを表しているので、 <hr> を挿入する必要はありません。

なお、<hr> には、<br> と同様終了タグはありません。

hr 要素

段落レベルのテーマの区切り、セクション内における、セクションを分けるほどでもない話題の区切りを表す際に使用する。

hr 要素は、セクションを分けることはしないので、hr 要素で区切られた前後は同じセクションに属する事となる。

終了タグはない。

属性

なし

記述例
<section>
<p>今日は朝 6時に起きなければならなかった。</p>
<p>目が覚めたら10時だった。</p>
<hr>
<p>終わった。</p>
</section>

上の HTML 文書は、一般的なブラウザでは次のように表示されます。

表示例

4.6 整形済みテキスト (pre)

pre 要素は、整形済みテキストを表します。この要素内の空白文字や改行はそのままで等幅フォントで表示されます。

そのため、HTML ソースやプログラムのソースコードをそのまま表示したり、 アスキーアートを表示する場合などに使用されます。

ただし、<pre>~</pre> の中でもタグは解釈されるため、 HTML ソースをそのまま表示したい場合には、< と > を、&lt; と &gt; に置き換える必要があります。

pre 要素

整形済みテキストを表す。

この要素内の空白文字や改行はそのままで等幅フォントで表示される。

属性

なし

記述例
<pre>
&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;文書のタイトル&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;pre要素の使用例&lt;/h1&gt;
    &lt;p&gt;空白も          そのまま&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>

上の HTML 文書は、一般的なブラウザでは次のように表示されます。

表示例

4.7 グループ化 (div)

div 要素は、フロー・コンテンツを1つのグループとしてまとめます。フロー・コンテンツとは、子孫としてテキストを持つ要素で、ほとんどの要素がこれに当たります。

また、ほとんどのブラウザで、div 要素の前後で改行が入ります。

div 要素

フロー・コンテンツを1つのグループとしてまとめる。

属性

なし


次の例は、div 要素に含まれる要素をまとめて、色を指定してします。

記述例
<div style="color:red;">
<span>one</span>
<span>two</span>
</div>
<div style="color:blue;">three</div>
表示例

4.8 範囲指定 (span)

span 要素は、フレージング・コンテンツを1つのグループとしてまとめます。フレージング・コンテンツとは、段落内で使用するようなコンテンツです。フレージング・コンテンツに属する要素は、同時にフロー・コンテンツにも属しています。

また、ほとんどのブラウザで、div 要素の前後に改行が入るのに対して、span 要素では改行が入りません。

span 要素

フレージング・コンテンツを1つのグループとしてまとめる。

属性

なし


次の例は、内部のテキストがフランス語、ドイツ語、スペイン語で記述されていることを示しています。また、マウスを重ねるとそれぞれの言語が表示されます。

記述例
<p>赤は、<span lang="fr" title="フランス語">Rouge</span><span lang="de" title="ドイツ語">Rot</span>
<span lang="es" title="スペイン語">Rojo</span> だ。</p>

表示例

4.9 見出しのグループ化 (hgroup)

hgroup 要素は、見出し(h1 h2 h3 h4 h5 h6)と1つ以上の段落要素(p)をグループ化します。主題とともに、副題、代替の見出し、キャッチフレーズなどを表現することができます。

hgroup 要素

見出し(h1 h2 h3 h4 h5 h6)と 1 つ以上の段落要素(p)を1つのグループとしてまとめる。

ただし、見出し(h1 h2 h3 h4 h5 h6)が複数あっても、段落要素(p)でなくても問題なく表示される。

属性

なし


次の例は、主題として h3、副題として p を指定して表示しています。

記述例
<hgroup>
  <h3>hgroup とは</h3>
  <p>主題と副題を表現</p>
</hgroup>
<p>hgroup は W3C の HTML5 から削除されていましたが、WHATWG では存続していました。</p>

表示例

4.10 テンプレート (template)

定型の要素構造を提供します。Javascript でテンプレートとなる要素構造を複製して表示します。

template 要素

テンプレートとして要素構造を提供する。Javascript などでテンプレートを利用して、定型の要素構造を複製する。

template 要素自体は表示されないが、未対応のブラウザでは表示されることもある。

属性

なし


選択された都県の都市名のリストを表示します。

テンプレートのコンテンツを複製して、id が list の div 要素内に追加しています。

記述例
都道府県:
<select name="code" onchange="makeList(this.value);">
 <option value="" label=""></option>
 <option value="13" label="東京都"></option>
 <option value="14" label="神奈川県"></option>
 <option value="11" label="埼玉県"></option>
</select>

<template id="template">
<div><img src="images/mark.png"><span></span></div>
</template>

<div id="list">
</div>

<script>
var data = [
  ["国立","13"],
  ["三浦","14"],
  ["茅ヶ崎","14"],
  ["深谷","11"],
  ["相模原","14"],
  ["秩父","11"],
  ["府中","13"],
];

function makeList(value) {
  let list = document.getElementById("list");
  let contents = list.getElementsByTagName("div");
  while (contents.length > 0) {        // 前に追加した list 内の要素を削除する
    list.removeChild(contents[0]);
  }
  let template = document.getElementById("template");
  for (let i = 0 ; i < data.length ; i++) {
    if (value == data[i][1]) {
      let clone = template.content.cloneNode(true);  // ディープコピー(子孫を含めてすべて複製される)
      clone.querySelector("span").textContent = data[i][0];
      list.appendChild(clone);        // list 内に追加する
    }
  }
}
</script>

都道府県を選択してください。都市名が表示されます。

表示例

4.11 スロット (slot)

定型の要素構造を提供する template 要素のコンテンツの書き換えを可能にします。

slot 要素

template 要素内の slot 要素の name 属性の値と一致する slot 属性を持つ要素のコンテンツを、slot 要素のコンテンツに挿入する。

属性

属性属性値説明必須
nameスロットの名前他の要素の slot 属性と一致するとき、その要素のコンテンツを挿入する×

記述例
<template id="template">
<div><slot name="mark">不明</slot> <slot name="city"><img src="images/question.png"></slot></div>
</template>

<div>
  <span slot="city">鶴ヶ島</span>
  <img slot="mark" src="images/saitama.png">
</div>
<div>
  <span>館山</span>     <!-- slot がないので、値の挿入が行われない -->
  <img src="images/chiba.png">
</div>
<div>
  <span slot="city">立川</span>
  <img slot="mark" src="images/tokyo.png">
</div>
<div>
  <span slot="city">茅ヶ崎</span>
  <img slot="mark" src="images/kanagawa.png">
</div>

<script>
let templete = document.getElementById("template");
let data = document.getElementsByTagName("div") ;
for (let i = 0 ; i < data.length ; i++) {
  let clone = templete.content.cloneNode(true);
  let rootElement = data[i].attachShadow({mode: "open"}) ;
  rootElement.appendChild(clone);
}
</script>

2つ目の館山は slot 属性がないため、テンプレートに値の挿入が行われません。そのため、テンプレートの規定値がそのまま表示されます。

表示例


name 属性のない slot 要素の場合は、slot 属性のない要素のコンテンツがまとめて1つ目の slot に挿入されます。

記述例
<template id="template">     <!-- name 属性がない slot -->
<div><slot>不明</slot> <slot><img src="images/question.png"></slot></div>
</template>

<div>
  <span slot="city">鶴ヶ島</span>     <!-- slot があるので挿入されない -->
  <img slot="mark" src="images/saitama.png">
</div>
<div>
  <span>館山</span>     <!-- slot がないので、まとめて1つ目の slot に挿入される -->
  <img src="images/chiba.png">
</div>
<div>
</div>

<script>
let templete = document.getElementById("template");
let data = document.getElementsByTagName("div") ;
for (let i = 0 ; i < data.length ; i++) {
  let clone = templete.content.cloneNode(true);
  let rootElement = data[i].attachShadow({mode: "open"}) ;
  rootElement.appendChild(clone);
}
</script>

1つ目の鶴ヶ島は、slot 属性があるため、name のない slot 要素に挿入されません。

2つ目の館山は、span 要素と img 要素とも slot 属性がないため、name のない最初の slot 要素にいっしょに挿入されます。

表示例