WWW Watch

tfoot に関するエントリーの補足

前のエントリー、「tfoot は tbody の前に書いた方がいいよ」では、行グループ、tfoot 要素の記述位置に関して hxxk.jp さんのエントリーに乗...

前のエントリー、「tfoot は tbody の前に書いた方がいいよ」では、行グループ、tfoot 要素の記述位置に関して hxxk.jp さんのエントリーに乗っからせて頂く形で書きましたが、該当エントリーのタイトルに突っ込みをいくつか頂いたので補足エントリー上げます。

突っ込みの内容としては、「書いた方がいいよ」 というタイトルの書き方だと、「書いても書かなくても自由だけど、書いたほうが吉」 と受け取る人がいて、ミスリードじゃないのということなんですが、確かにおっしゃる通りなのでその辺を補足したいと思います。

で、いきなり言い訳からなんですが、該当エントリーのタイトルを 「書いたほうがいいよ」 としたのは、 hxxk.jp さんのエントリーに対する突っ込みが主な内容だったので、hxxk.jp さんに向けて語りかける形で書いたからなんですね。なので、エントリー本文では 「仕様書には tfoot は tbody より前に書けって書いてある」 → 「だから正しくはこう書きましょうね」 という内容になっていると思います。が、指摘されてタイトルだけ見返すと思いっきり誤解を与えてるってことに気がつきました。ごめんなさい。今は反省している。

と、言い訳はここまで。本題に入ります。

行グループの各要素は、HTML 4.01 Strict DTD では下記のように定義されています。

<!ELEMENT TABLE - -
     (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)>
<!ELEMENT THEAD    - O (TR)+           -- table header -->
<!ELEMENT TFOOT    - O (TR)+           -- table footer -->
<!ELEMENT TBODY    O O (TR)+           -- table body -->

XHTML 1.0 Strict DTD だと、こんな感じ。

<!ELEMENT table
     (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>
<!ELEMENT thead    (tr)+>
<!ELEMENT tfoot    (tr)+>
<!ELEMENT tbody    (tr)+>

行グループの各要素は、最低 1つ以上の tr 要素を含まないといけないというのが両者に共通した必須条件で、テーブル内での要素の記述順は記載のとおり。HTML 4.01 の場合は、thead、tfoot は終了タグが省略可能。tbody は基本的に必須ですが、開始タグ、終了タグともに省略可能 (一定の条件下のみ・後述) となっています。

XHTML 1.0 の場合は、tbody が必須にはなっていません。よって、tbody の記述を省略した場合、ソース的は同じに見えても、HTML 4.01 と XHTML 1.0 では実は扱いが違います。

HTML 4.01 の場合、条件を満たして tbody の開始タグ、終了タグともに記述を省略した場合、「tbody 要素は存在するが、記述を省略された」 と解釈します。しかし、XHTML 1.0 において、tbody の記述を省略した場合、「tbody 要素は存在しない」 と解釈されます。細かいことですが違いがあります。

さらに、HTML 4.01 の仕様書内、「11.2.3 Row groups: the THEAD, TFOOT, and TBODY elements」 を見ていきましょう。

Table rows may be grouped into a table head, table foot, and one or more table body sections, using the THEAD, TFOOT and TBODY elements, respectively. This division enables user agents to support scrolling of table bodies independently of the table head and foot. When long tables are printed, the table head and foot information may be repeated on each page that contains table data.

「テーブル内の各行は、ヘッダ (thead) と フッタ (tfoot) 、それに1つ以上の ボディ (tbody) に分類することができる。こうしておくと、ユーザーエージェントによっては、複数ページにわたる長いテーブルを印刷する時に、各ページにヘッダとフッタを配置したり、ボディ部分だけをスクロール表示したりといったことをするかもしれない。」

さらに、

TFOOT must appear before TBODY within a TABLE definition so that user agents can render the foot before receiving all of the (potentially numerous) rows of data. The following summarizes which tags are required and which may be omitted:

tfoot は、テーブル内で、tbody よりも前に出現しなければならない。こうしておくと、表データが大きい場合などに、表内のデータをすべて取得するまで待たずにユーザーエージェントがフッタのレンダリングが行える。」

ここが問題のところですね。はっきりと 「しなければならない (must)」 と書かれています。覚えておきましょう。

その次で省略可能なタグについての説明が書かれています。なお、タグの省略が可能なのは HTML だけなので、XHTML の場合は当てはまりません。

  • The TBODY start tag is always required except when the table contains only one table body and no table head or foot sections. The TBODY end tag may always be safely omitted.
  • The start tags for THEAD and TFOOT are required when the table head and foot sections are present respectively, but the corresponding end tags may always be safely omitted.

「tbody の開始タグは、テーブル内にボディ (tbodyにあたる部分) が 1つだけで、ヘッダもフッタも存在しない場合以外は省略してはいけない。tbody の終了タグはいつでも省略可能。」

ここが先に書いた、「一定の条件下では省略可能」 の根拠です。また、

「thead、tfoot の開始タグは、ヘッダやフッタが存在する場合は必須。終了タグはいつでも省略可能。」

と説明されています。

ちなみに、ISO-HTML (ISO/IEC 15445:2000(E)) では、下記のように、

<!ELEMENT TABLE       - -  (CAPTION?, (COL*|COLGROUP*), 
                              THEAD?, TFOOT?, TBODY+) >
<!ELEMENT (THEAD,TFOOT,TBODY) - O  (TR)+ >

と定義されていますので、tbody の開始タグはいかなる時も省略不可です。

さて、HTML 4.01 の仕様書に戻って、最後。

The THEAD, TFOOT, and TBODY sections must contain the same number of columns.

「thead、tfoot、tbody はそれぞれ同じ数の列を含んでいないといけない」 ので注意しましょう。

それでは今回はこの辺で。補足エントリーのつもりが、長くなった......

Recent Entry

全ての記事一覧を見る

Hot Entry

逆引きおすすめエントリー