table

1. 基本情報

説明 テーブルを示す
語源 TABLE
所属モジュール Tables
所属コンテントセット Block
内容 caption, colgroup, col, thead, tfoot, tbody, tr
内容の書式 caption?, ( colgroup* | col* ), ( ( thead?, tfoot?, tbody+ ) | ( tr+ ) )
関連項目 なし
公式な実装 DTD

2. 属性

2-1. 一般属性

属性 属性値の型 説明
Common [属性コレクション]

XHTMLの要素が大抵持っている、一般的な属性を集めたコレクションです。

2-2. 固有属性

属性 属性値の型 説明
summary Text (CDATA)

テーブルの要約を記述します。

width Length (CDATA)

要素の幅を指定します。

border Pixels (CDATA)

ボーダーの太さを指定します。

frame [選択]

テーブルのボーダーを表示させる部分を指定します。border属性が1以上なら、既定値はborderになります。

  • void [既定値] - 表示しません。
  • above - 上端を表示します。
  • below - 下端を表示します。
  • hsides - 上下両端表示します。
  • lhs - 左端を表示します。
  • rhs - 右端を表示します。
  • vsides - 左右両端表示します。
  • box - 全て表示します。
  • border - 全て表示します。
rules [選択]

セルのボーダーを表示させる部分を指定します。border属性が1以上なら、既定値はallになります。

  • none [既定値] - 表示しません。
  • groups - 行、列グループの境目のボーダーを表示します。
  • rows - 行の境目のボーダーを表示します。
  • cols - 列の境目のボーダーを表示します。
  • all - 全ての境目のボーダーを表示します。
cellpadding Length (CDATA)

各セルの、外枠と内容の隙間の長さを指定します。

cellspacing Length (CDATA)

セル同士の間隔を指定します。

3. 解説

3-1. 概要

table要素は、2次元の表(テーブル)を作ります。ul要素ol要素を1次元リストと呼ぶなら、table要素は2次元リストです。概念的にはカテゴライズする事で多次元の表を作れますが、表示の制約上、3次元以上の表は見づらいので、2次元の表だけを考えても構いません。

テーブルはform要素とそのコントロール要素程複雑ではありませんが、少々厄介です。ですから、ここでは最も望ましい形式からではなく、最も簡単な形式から説明していきます。

3-2. 最も単純なテーブル

まず、用語を確認しておきます。

テーブル

Table。表の事。table要素で実現される。2次元に限らず、1次元でもテーブルと呼ぶ事がある。例えば本の目次はTable of Contentsである(Indexは索引)。

Row。テーブルを構成する実際の単位tr要素で作られる。幾つかのセルを子に持ち、普通横に長い。行自体は縦に連なる。

Column。テーブルを構成する概念上の単位col要素で表される。行と同様幾つかのセルが属するが、セルを子に持つ訳ではない。普通縦に長く、横に連なる。

セル

Cell。テーブルを構成する最小単位。行を親に持ち、列に属する。具体的な内容(文字列など)を包含するのはセルで、ヘッダ情報用のth要素とデータ用のtd要素がある。

行(tr要素)を幾つか持ち、tr要素には幾つかセル(th要素td要素)を持たせれば、文法的に正しいテーブルになります。

[プログラムコード開始]

<table>
<tr>
<td>支部</td><td>1月</td><td>2月</td><td>3月</td>
</tr>
<tr>
<td>東京</td><td>1304</td><td>1545</td><td>1443</td>
</tr>
<tr>
<td>大阪</td><td>1527</td><td>1694</td><td>1335</td>
</tr>
<tr>
<td>福岡</td><td>1434</td><td>1665</td><td>1419</td>
</tr>
</table>

[プログラムコード終了]

支部 1月 2月 3月
東京 1304 1545 1443
大阪 1527 1694 1335
福岡 1434 1665 1419

上の例を見れば判るように、テーブルは行を単位として書きます。行の中のセルは左から右へ流れ、全ての行が同じ数のセルを持つようにします。数が同じであればth要素td要素かは問われないので、意味に合わせて使い分けます。数が足りない行がある場合、足りない部分は空になってしまいますが、無様なだけであって、文法ミスにはなりません。しかしまあ、揃えた方が綺麗でしょう。

3-3. ヘッダセルとスコープ

表の中でヘッダ的な情報を表すセルは、th要素でマークアップします。td要素データセルと呼ばれるのに対して、ヘッダセルと呼ばれます。

[プログラムコード開始]

<table>
<tr>
<th scope="col">支部</th><th scope="col">1月</th><th scope="col">2月</th><th scope="col">3月</th>
</tr>
<tr>
<td scope="row">東京</td><td>1304</td><td>1545</td><td>1443</td>
</tr>
<tr>
<td scope="row">大阪</td><td>1527</td><td>1694</td><td>1335</td>
</tr>
<tr>
<td scope="row">福岡</td><td>1434</td><td>1665</td><td>1419</td>
</tr>
</table>

[プログラムコード終了]

支部 1月 2月 3月
東京 1304 1545 1443
大阪 1527 1694 1335
福岡 1434 1665 1419

ヘッダ情報に当たる部分をth要素に置き換え、scope属性を付けました。scope属性はセルの適用範囲を簡単に指定するもので、colで列方向に、rowで行方向に、colgroupで列グループに、rowgroupで行グループに適用します。上の例では東京、大阪、福岡のセルにも使われています。これは、一行目のセルほどヘッダ情報としての意味は強くないけれども、それぞれの行の中ではヘッダ情報の役割を果たしていると考えられる為に付けたものです。勿論、scope属性td要素にもあります。

3-4. キャプションとサマリ

テーブルには、短い要約をキャプションとして、長めの説明をサマリとしてつける事が強く望まれます。特にグラフィカルブラウザではない場合、自分にとって必要の無いテーブルを飛ばしたり、構造を説明的文章から理解できる為、これらは大いに役に立つ事でしょう。それぞれcaption要素summary属性で指定します。

[プログラムコード開始]

<table summary="東京、大阪、福岡の各支部における、1月から3月までの売り上げ実績。">
<caption>各支部の売り上げ実績</caption>
<tr>
<th scope="col">支部</th><th scope="col">1月</th><th scope="col">2月</th><th scope="col">3月</th>
</tr>
<tr>
<td scope="row">東京</td><td>1304</td><td>1545</td><td>1443</td>
</tr>
<tr>
<td scope="row">大阪</td><td>1527</td><td>1694</td><td>1335</td>
</tr>
<tr>
<td scope="row">福岡</td><td>1434</td><td>1665</td><td>1419</td>
</tr>
</table>

[プログラムコード終了]

各支部の売り上げ実績
支部 1月 2月 3月
東京 1304 1545 1443
大阪 1527 1694 1335
福岡 1434 1665 1419

summary属性を書くのは勿論table要素ですが、caption要素tableの第1の子でなければなりません。また、caption要素はまだしも、summary属性は(特にグラフィカルブラウザにおいて)非常に冷遇されているので、全てのテーブルにsummary属性を持たせるのはちょっと大変かも知れません。

3-5. 列と列グループ

前述の通り、セルは列には含まれませんが、列に属しています。幅や背景など、列毎に共通のスタイルを適用したい時もあるでしょう。そんな時はcol要素を使うと便利です。また、列に意味上の繋がりがある場合、colgroup要素を使ってグループ化する事ができます。

[プログラムコード開始]

<table summary="東京、大阪、福岡の各支部における、1月から3月までの売り上げ実績。">
<caption>各支部の売り上げ実績</caption>
<colgroup class="branch-office"></colgroup>
<colgroup class="sales" span="3"></colgroup>
<tr>
<th scope="col">支部</th><th scope="col">1月</th><th scope="col">2月</th><th scope="col">3月</th>
</tr>
<tr>
<td scope="row">東京</td><td>1304</td><td>1545</td><td>1443</td>
</tr>
<tr>
<td scope="row">大阪</td><td>1527</td><td>1694</td><td>1335</td>
</tr>
<tr>
<td scope="row">福岡</td><td>1434</td><td>1665</td><td>1419</td>
</tr>
</table>
 
/* これに適用するCSS */
colgroup.branch-office {
background-color : #dfe;
width : 40%;
}
colgroup.sales {
width : 20%;
}

[プログラムコード終了]

各支部の売り上げ実績
支部 1月 2月 3月
東京 1304 1545 1443
大阪 1527 1694 1335
福岡 1434 1665 1419

col要素を使ったらcolgroup要素は使えませんし、colgroup要素を使えばcol要素はその子としてしか現れ得ません。何れの場合でも、列の指定は(あれば)caption要素tr要素などの間で行います。なお、colgroup要素col要素を子に持つ事ができますが、一つでも持った場合はそのcolgroup要素span属性は無視されます。

col要素colgroup要素は、span属性で適用する列の数を指定する事ができます。今回は4列しか無いので大した事は無いですが、数が増えてくるとこの属性が本領を発揮します。

ちなみに、CSSでcol要素colgroup要素に対して有効なプロパティは、background系、border系、width、visibilityです。

3-6. 行と行グループ

これまでのテーブルではtr要素を直接table要素の子にしてきましたが、行を論理的にグループ化できる場合は、thead要素tfoot要素tbody要素を用います。これらの要素(行グループ)を使った場合はtr要素をtable要素の子にする事はできなくなり、孫として(つまりthead要素tfoot要素tbody要素の子として)tr要素を書いていく事になります。

thead要素はテーブルのヘッダを、tfoot要素はフッタを、tbody要素は中身を内包します。順序に気を付けて下さい。 tbody要素tfoot要素よりも後です。これは、フッタも役割としてはヘッダに近く、テーブルの内容が長大な場合、先にユーザーエージェントに知らせた方が良いものだからです。

ちなみに、Mozilla Firefox 2など一部のブラウザでは、印刷する際にテーブルが複数ページにまたがった場合、thead要素tfoot要素の内容は毎ページ上下に複製してくれます。

[プログラムコード開始]

<table>
<col class="name"/>
<col class="description"/>
<thead>
<tr><th scope="col">要素</th><th scope="col">説明</th></tr>
</thead>
<tbody>
<tr><td scope="row">html</td><td>XHTMLのルートエレメントになる</td></tr>
<tr><td scope="row">head</td><td>文書自身についての情報を記述する</td></tr>
<tr><td scope="row">title </td><td>文書のタイトルを示す</td></tr>
<tr><td scope="row">body</td><td>文書の本文を記述する</td></tr>
</tbody>
<tbody>
<tr><td scope="row">a</td><td>ハイパーリンクの目印になる</td></tr>
</tbody>
<tbody>
<tr><td scope="row">dl</td><td>定義語リストを示す</td></tr>
<tr><td scope="row">dt</td><td>定義語を示す</td></tr>
<tr><td scope="row">dd</td><td>定義語の説明を記述する</td></tr>
<tr><td scope="row">ol</td><td>順序付きリストを示す</td></tr>
<tr><td scope="row">ul</td><td>箇条書きリストを示す</td></tr>
<tr><td scope="row">li</td><td>リスト項目を示す</td></tr>
</tbody>
</table>

[プログラムコード終了]

要素 説明
html XHTMLのルートエレメントになる
head 文書自身についての情報を記述する
title 文書のタイトルを示す
body 文書の本文を記述する
a ハイパーリンクの目印になる
dl 定義語リストを示す
dt 定義語を示す
dd 定義語の説明を記述する
ol 順序付きリストを示す
ul 箇条書きリストを示す
li リスト項目を示す

thead要素tfoot要素は省略可能ですが、tbody要素は省略できません。また、tbody要素は複数現れる事ができます。上の例では、XHTML 1.1の要素をモジュール別にtbody要素で括って並べてみました。

この辺りまで理解していれば、普通のテーブルは思い通りに作る事ができるでしょう。

3-7. セルのまたがり

時に、セルを幾つかの行や列にまたがらせたくなる事があります。複数の行や列にまたがったセルを「各行、各列のヘッダセル」のヘッダ情報にしたい時などです。行をまたぐにはrowspan属性を、列をまたぐにはcolspan属性を使います。

[プログラムコード開始]

<table>
<caption>C++における継承とアクセス指定子</caption>
<colgroup class="base-class">
<col class="member-of-base-class"/>
<col class="access-specifier-of-member"/>
</colgroup>
<colgroup class="base-specifier">
<col class="access-specifier-of-base-specifier" span="3"/>
</colgroup>
<thead>
<tr>
<td rowspan="2" colspan="2"></td>
<th scope="colgroup" colspan="3" abbr="アクセス指定子">基底クラス指定子のアクセス指定子</th>
</tr>
<tr>
<th scope="col">public</th>
<th scope="col">protected</th>
<th scope="col">private</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="rowgroup" rowspan="3" abbr="基底メンバ">基底クラスのメンバ</th>
<th scope="row">public</th>
<td class="public">public</td>
<td class="protected">protected</td>
<td class="private">private</td>
</tr>
<tr>
<th scope="row">protected</th>
<td class="protected">protected</td>
<td class="protected">protected</td>
<td class="private">private</td>
</tr>
<tr>
<th scope="row">private</th>
<td class="private">private</td>
<td class="private">private</td>
<td class="private">private</td>
</tr>
</tbody>
</table>

[プログラムコード終了]

C++における継承とアクセス指定子
基底クラス指定子のアクセス指定子
public protected private
基底クラスのメンバ public public protected private
protected protected protected private
private private private private

他のセルがまたいで来た所には、改めてセルを置く必要が無い事に気を付けて下さい。colspan属性rowspan属性を含めて考えると、全ての行で5列になるようにしてあります。また、二つ以上のセルが同じ場所にまたいで来るとエラーになり、その扱いは未定義になります。

3-8. 明示的なヘッダ情報の指定

ヘッダ情報を持つセルが、適用されるデータセルに対して適切な位置(同じ行、あるいは同じ列)にあれば、scope属性で十分でした。しかし、scope属性では適用できない位置にデータセルがあるような場合、代わりにid属性headers属性を使います。

まず、ヘッダ情報を持つセル──th要素とは限りません──にid属性を持たせます。次に、ヘッダ情報の必要なデータセル全てにheaders属性を持たせ、そのセルのヘッダとなるセルのid属性値をIDREFSデータタイプで書き連ねます。

容易に想像できるように、かなり面倒です。できる事なら、構造を明快にしてscope属性を使える所は使った方がいいでしょう。セルのカテゴライズで紹介する場合のように、3次元以上のテーブルを作る場合使う必要が出てきます。

3-9. セルのカテゴライズ

テーブルは普通、2次元の表です。つまり、下に伸びる軸と右に伸びる軸と、二つの軸を持ち(右から左に読む言語の場合はこの通りではないですが)、データセルはそれぞれの位置での値と考える事ができます。例えば、セルのまたがりで出した表で言えば、下に伸びる「基底クラスのメンバ」という軸が一つ、右側に伸びる「基底クラス指定子のアクセス指定子」という軸が一つ、合計二つ軸を持っています。それぞれの軸は、(たまたま同じ)public、protected、privateという位置を持っています。これを使うと、各データセルの内容は、派生クラスでのアクセス( 基底クラスのメンバ, 基底クラス指定子のアクセス指定子 )という2変数関数で表現できます。例えば派生クラスでのアクセス( public, public ) = publicですし、派生クラスでのアクセス( protected, private ) = privateです。

このテーブルに軸を導入し、ヘッダ情報も明示的にしてしてみましょう。ヘッダ情報が所属する軸はaxis属性で与えます。データセルが参照するヘッダ情報は、前述の通りheaders属性を使います。

[プログラムコード開始]

<table>
<caption>C++における継承とアクセス指定子</caption>
<colgroup class="base-class">
<col class="member-of-base-class"/>
<col class="access-specifier-of-member"/>
</colgroup>
<colgroup class="base-specifier">
<col class="access-specifier-of-base-specifier" span="3"/>
</colgroup>
<thead>
<tr>
<td rowspan="2" colspan="2"/>
<th colspan="3" abbr="アクセス指定子">基底クラス指定子のアクセス指定子</th>
</tr>
<tr>
<th axis="アクセス指定子" id="asobs-1">public</th>
<th axis="アクセス指定子" id="asobs-2">protected</th>
<th axis="アクセス指定子" id="asobs-3">private</th>
</tr>
</thead>
<tbody>
<tr>
<th rowspan="3" abbr="基底メンバ">基底クラスのメンバ</th>
<th axis="基底メンバ" id="asom-1">public</th>
<td headers="asom-1 asobs-1" class="public">public</td>
<td headers="asom-1 asobs-2" class="protected">protected</td>
<td headers="asom-1 asobs-3" class="private">private</td>
</tr>
<tr>
<th axis="基底メンバ" id="asom-2">protected</th>
<td headers="asom-2 asobs-1" class="protected">protected</td>
<td headers="asom-2 asobs-2" class="protected">protected</td>
<td headers="asom-2 asobs-3" class="private">private</td>
</tr>
<tr>
<th axis="基底メンバ" id="asom-3">private</th>
<td headers="asom-3 asobs-1" class="private">private</td>
<td headers="asom-3 asobs-2" class="private">private</td>
<td headers="asom-3 asobs-3" class="private">private</td>
</tr>
</tbody>
</table>

[プログラムコード終了]

先程、これらの軸はpublic、protected、privateの3つの位置を持っていると言いましたが、言葉を換えれば、これらのヘッダ情報を「アクセス指定子」「基底メンバ」というグループに分類したとも言えます。実際、axis属性はその程度の扱われ方しかしておらず、class属性と同じで、XSLTなどを使ってXHTML文書を再利用する時には役に立ちますが、HTMLとしては、仕様書でもaxis属性の扱いについて強制していない為、音声合成ユーザーエージェントなどでも、利用される事があるかも知れない程度です。

一方、headers属性はより実質的です。軸が二つまでなら全てscope属性で代用できますが、三つ以上になるとscope属性だけでは対応しきれない場合が出てきます。例えば、軸が「出張先」「日付」「用途」と三つあり、データセルがそれぞれの出費を持っている場合、データセルに適用すべきヘッダ情報も三つあり、最低一つの軸のヘッダ情報をheaders属性で与える必要があります(二つまではscope属性が使えます)。ヘッダとなるセルはaxis属性を使って「出張先」「日付」「用途」と、それぞれの軸に所属させますが、記述上(及び、グラフィカルブラウザとテキストブラウザでは表示上)の制約から、完全な3次元のテーブルは作れないので、やはりaxis属性は実質分類しかできません。

3-10. 使用例

解説を参照して下さい。

[table]
Published : 2006-03-26T09:00:00+09:00
Last Modified : 2007-03-10T01:19:13+09:00
Table of Contents : 要素目次
Index : 要素索引
Verified with : Valid XHTML 1.1
Copyright © 2006 - 2007  E+X.