HTMLではタグを入れ子構造にしますが、それは本当に入れ子になっていますか? 入れ子になっていない場合、HTMLの規格で定められている“閉じタグの省略”とみなされて、ブラウザが勝手に補正して表示します。意図した表示になっていない場合、あるタグの内側に入れることのできないタグを途中から使っている可能性があります。そんなわけで、ブラウザが勝手に、閉じタグを省略していると見なす場合について、今回はご紹介します。
長ったらしい前置き
人間にも扱いやすいHTMLから、機械可読性は向上したものの厳密に書かなければならないXHTMLへの移行は、当初の思惑ほどすんなりとはいきませんでした。XHTMLの普及には大変時間がかかり、HTML 4.01という幹から枝分かれして、そして枝の先が行き止まりになることが決定しました。XHTMLの次期バージョンは策定しないことが決定していて、HTMLが4.01から5に、大幅なバージョンアップをしようとしています。
さて、HTMLに対してXHTMLは、機械に対してフレンドリーな仕様になっています。HTMLにおいて認められていた閉じタグの省略が不可になり、空タグにもスラッシュを書くことになりました。またタグにも小文字しか使えなくなりました。
一方で、HTMLでは閉じタグを省略することが規格上認められているとはいえ、そのようなコードはきれいなコードではなく、きちんとタグを閉じるのが普通です。今では閉じタグを省略する人は普通はいないでしょう。
今のことではなく昔のことですが、閉じタグの省略で有名だった例として、Yahoo!オークションがあります。出品情報の記入で、ブログと同じようにHTMLのタグを使うことができます。そして入力が終わって「プレビュー」し、さらに書き換えようとして入力フォームを見ると、省略することが許容されている閉じタグが、自動的に省略される仕様でした。コードをきっちり書きたいユーザーから嫌われる仕様だったのは、言うまでもありません。
どんなときに閉じタグの省略とみなされるの?
さて前置きが長くなりましたが、どんな時に閉じタグが省略されるのかを、具体的な例を出しながら説明していきます。
あるタグの内側に入れることのできない開始タグが途中にあった場合、その直前に閉じタグがあるものと見なすことになっているタグがます。このことは、「HTMLが文法をマークアップする形式である。」という観点から見ると、大変わかりやすくなります。
段落中に入れることのできないタグ <p>タグについて
さて、皆さんがよく使うタグである、 <p> タグは、文法上何を意味するタグかご存知でしょうか。この「p」は、英語の「paragraph」の頭文字です。パラグラフ、日本語で言うと段落です。つまり、文法上段落の中に入れられないタグが途中で登場したら、その直前で段落が終わりであると見なす、つまり </p> があるものと見なす。こう覚えておくといいでしょう。
ではどんなタグがあると段落が終了すると見なされるか、つまり段落中に入れることのできないタグは何か、という話になります。代表的なものとしては、以下のものがあります。
- 段落 <p>
- 見出し <hx>
- 箇条書き <ol> 番号付きリスト
- 箇条書き <ul> 番号無しリスト
- 定義リスト <dl> 用語と説明
- 表 <table>
よくありがちなのは、このくらいでしょうか。それぞれのタグが文法上何を意味するタグなのかを知っていれば、段落の中に入れることができないことは、すんなりと理解できるでしょう。そしてこれらのタグは、全て“ブロックレベル”要素であることも重要なことです。“インライン要素なら段落の中に入れても大丈夫”と覚えておくといいかもしれません。例えば、 <a>タグなんかです。
見出しタグの中に入れられるタグ <hx>
さて、見出しは、見出しです。見出しの中に段落が来ることも、箇条書きが来ることも、表が来ることもありません。もちろん見出しが来ることもありません。例えば、 こんなときです。
<h1> ああああ <h2> いいいい </h2> うううう </h1>
このようなときは、「 <h2> の直前に、 </h1> があるものと見なす。」というのがHTMLの規格です。規格なのですから、ブラウザは規格に従って表示します。ブラウザがどう見なすかというと、こんな感じです。
<h1> ああああ </h1><h2> いいいい </h2> うううう </h1>
<h2> の前に </h1> があって、</h2> の後ろは特にタグの内側に入っていない“うううう”が続いて、最後によくわからない記述として、 </h1>がある。といったところです。
さて、何を入れてよくて何を入れたらいけないかについては、「見出しの <hx> タグの中には“インライン要素”しか入らない。」と、覚えておくといいかもしれません。
おわりに
さてここまで書いたら、もう概念的にはどういうお話か、わかったと思います。他にもいろんなタグで、省略と見なされる例があります。表中で使われる <tr> や <td> 、 <th> も省略が可能ですし、リストの <li> なんかもそうです。意図していない表示になって困っている場合には、今回紹介した「閉じタグの省略」によって変な表示になっていることもあるかもしれません。頭の片隅にでも入れておくといいかもしれませんし、文法エラーのチェック機能がある「Crescent Eve」といったエディタを使うのも手でしょう。(ただし、このディタではブロックレベルの <ins> と <del> には対応していないので、その点は注意してください。)