表(テーブル)
Updated / Published
HTML を使って、一覧表・数表・年表などのように表の形にまとめて提供する必要がある情報の場合には、table
要素, tr
要素, th
要素, td
要素などの表(テーブル)要素を使います。最近では HTMLエディタ等の普及により、視覚的操作(WYSIWYG)で容易に複雑な表を作成できることからレイアウト(ウェブページのデザイン・装飾)にまで表要素を使っている制作者の方も多くいます。レイアウトに表を使用すると次のようなアクセシビリティの低下を招くこともあるため、決して好ましい使い方とは言えません。
この場合のアクセシビリティの低下とは、主に音声出力や点字出力などの非視覚環境に対することを指します。レイアウトに表要素を使っている場合、表の入れ子やセルの結合が多用される傾向にあり、制作者の意図する情報の流れ通りに読み上げられなかったり、または正しく点字変換ができないことがあります。たとえば、音声出力環境においては、表を読み上げる場合、左上から右下に1セルずつ読み上げるため、行や列の関係が把握し難く、情報と読み上げ内容を一致させるのは困難になりがちです。このように制作者側の配慮や知識が至らない場合、結果として知らず知らずのうちに利用者を制限してしまっていることにもなりかねません。
表に関連する要素・属性は大量に存在しますが、それらの大半がアクセシビリティに関する要素・属性であることからも、表が複雑であることがわかります。そして、表はアクセシビリティにおける問題だけでなく、表は全体の構造を読み取ってからレンダリングを開始するため表示に時間がかかるといったユーザビリティ面も欠落させ、またフィーチャフォンの携帯電話端末(UA)の中には表をうまく表示できないものもあります。このため、表要素をレイアウトとして使用することは避けるべきであり、また特定の情報を参照するにあたって一覧表や年表、数表など表を組む必要がある場合にのみ、その必要性に応じて使用するようにしましょう。
表(テーブル)の作成
<table>
<tr><th>見出し内容</th><th>見出し内容</th></tr>
<tr><td>セル内容</td><td>セル内容</td></tr>
<tr><td>セル内容</td><td>セル内容</td></tr>
</table>
table
要素は表(テーブル)を定義する基本となるブロックレベル要素です。表を作成するには、ひとつひとつのセル(枡目)や、なかに入れる項目の指定が必要になります。tr
要素は table
要素の中で使用して表の行(横の区切り)を定義します。さらに、td
要素は tr
要素の中で使用して表の各セル(内容)となる表の列(縦の区切り)を定義します。"<td>セル内容</td>
" のセット数だけ横にセルが並んでいきます。つまり、"<td>セル内容</td>
の繰り返し全体を tr
要素で囲むことによって、1つの行として定義され、行が改められるので、"<tr><td>セル内容</td>...</tr>
" のセット数が表の行数ということになります。
なお、th
要素は td
要素と同じように tr
要素の中で使用して、表内の列(縦の区切り)の見出しセルを定義します。td
要素と違うのは th
要素は見出しに該当する項目のセルを設定する場合に使用します。UA の多くは th
要素をセル内容の水平(左右)方向が中央揃えでテキストは太字で表示します。
表のオプション
table
要素はさまざまな属性と組み合わせることで、 細かい指定が行えます。指定できる属性には次のようなものがあります。
表の外枠を表示
<table border="3"><tr><td>セル内容</td></tr></table>
border
属性は表の外枠の罫線の太さを指定する属性です。値には外枠の太さを整数(ピクセル数で解釈)で指定します。一部の古いUAでborder
属性の指定がない場合に、罫線がない区別し難い表の表示になります。なお、border
属性は非推奨属性ではありませんが、CSS の border-width
プロパティで代替することもできます。
表の外枠の罫線の表示方法を指定
<table frame="vsides" border="3"><tr><td>セル内容</td></tr></table>
frame
属性は表の外枠の罫線のうち上下左右のどの部分を表示させるかを指定します。値には次の9つのキーワードがあります。
- void
- 枠線を表示しない(初期値)
- above
- 上端の枠線のみ表示
- below
- 下端の枠線のみ表示
- lhs
- 左端の枠線のみ表示
- rhs
- 右端の枠線のみ表示
- hsides
- 上端と下端の枠線のみ表示
- vsides
- 左端と右端の枠線のみ表示
- box
- 上下左右全て(周囲)の枠線を表示
- border
- 上下左右全て(周囲)の枠線を表示
初期値は "void
" のため指定がない場合は罫線を表示しません。ただし、border
属性の値が "1
" 以上の時は自動的に frame="border"
を補って解釈します。なお、frame
属性は非推奨ではありませんが、CSS の border-width
プロパティ, border-style
プロパティで同様の表現に代替できます。
表の各セル間の間隔を指定
<table cellspacing="15" border="3">
<tr><td>セル内容</td><td>セル内容</td></tr></table>
cellspacing
属性は、表のセルを区切る罫線(内罫線)のサイズを指定します。つまり、表の個々のセル同士の間隔を指定します。border
属性の指定がない、もしくは値が "0
" の場合は、セル同士を区切る内罫線は表示されません。内罫線を表示させる場合は、table
要素に cellspacing
属性と border
属性をいっしょに指定します。cellspacing
属性の値には内罫線のサイズを整数(ピクセル数で解釈)で指定します。cellspacing
属性の指定がない場合、UA の多くは初期値が "2
" に設定されています。なお、cellspacing
属性は非推奨属性ではありませんが、CSS の border-spacing
プロパティで代替が可能です。
表のセル内の余白を指定
<table cellpadding="15" border="3">
<tr><td>セル内容</td></tr></table>
cellpadding
属性は表のセル内に余白を指定する属性で、セル同士を区切る内罫線とセル内のテキストやイメージなどの内容との間に詰め物をして設ける余白のサイズを指定します。cellpadding
属性の値にはセル内の余白のサイズを整数(ピクセル数で解釈)で指定します。border
属性の指定がない、もしくは値が "0
" の場合はセル同士を区切る内罫線は表示されませんが、cellpadding
属性で指定された余白のサイズは表示に反映されます。cellpadding
属性の指定がない場合、UA の多くは初期値が "1
" に設定されています。なお、cellpadding
属性は非推奨属性ではありませんが、CSS で th
要素, td
要素をセレクタとする padding
プロパティで代替が可能です。
各セル同士を区切る内罫線の表示方法を指定
<table rules="cols" cellspacing="5" border="3">
<tr><td>セル内容</td><td>セル内容</td></tr></table>
rules
属性は各セルの内罫線の表示方法を指定します。値には次の5つのキーワードがあります。
- none
- 枠線を表示しない(初期値)
- groups
- 列グループ・行グループの間の枠線のみ表示
- rows
- 行の間の枠線のみ表示
- cols
- 列の間の枠線のみ表示
- all
- すべて表示
初期値は "none
" のため指定がない場合は罫線を表示しませんが、border
属性の値が "1
" 以上の時は自動的にrules="all"
を補って解釈します。なお、rules
属性は非推奨属性ではありませんが、CSS で tbody
要素, thead
要素, tfoot
要素, col
要素, colgroup
要素をセレクタとする border-width
プロパティ, border-style
プロパティで同様の表現に代替できます。
表全体のサイズを指定
<table width="200" height="150">
<tr><td>セル内容</td></tr></table>
width
属性, height
属性は表全体のサイズを指定します。width
属性は横幅、height
属性は高さを指定する属性で、値は表のサイズを整数によるピクセル数で固定するか、または表示域の横幅、縦幅に対する パーセンテージ値(%
)で指定します。ただし、指定されたサイズが各セルの内容となっているものの大きさ、間隔などを足したサイズよりも小さい場合は、このサイズ指定は無効です(無視されます)。パーセンテージ値(%
)でサイズを指定した場合、ユーザ側の表示域のサイズ変動にあわせて表組全体のサイズも自動的に伸縮します。
なお、height
属性はブラウザの独自機能で HTML の仕様で正式に定義されているわけではありませんが、主要視覚ブラウザはすべて対応しています。width
属性は非推奨属性ではありませんが、height
属性もあわせて、CSS の height
プロパティ, width
プロパティでそれぞれ代替が可能です。
表の表示位置(水平方向の揃え方)の指定
<table align="center">
<tr><td>セル内容</td></tr></table>
align
属性は表の配置とその後に続くテキストの揃え方を指定します。値には次の3つのキーワードを指定できます。
- left
- 表は左に配置、その右にテキスト(複数行)が回り込む
- center
- 表を中央揃えに表示する
- right
- 表は右に配置、その左にテキスト(複数行)が回り込む
なお、align
属性は非推奨属性のため、CSS の float
プロパティで左右の配置とその後に続くテキストの揃え方を、margin
プロパティ( "table { margin-right : auto ; margin-left : auto ; }
")で中央揃えをそれぞれ代替指定することが推奨されています(CSS によるブロックレベル要素の左右中央揃えを参照)。また、回り込んだテキストを途中で解除したい場合には、br
要素に clear
属性を指定すれば良いのですが、clear
属性も非推奨属性のため、表の後に続く要素に clear
プロパティを指定するか、回り込みが指定されている要素の親要素にclearfixを用いるようにしましょう。
キャプション(表題)の指定
<table border="3" align="center">
<caption align="top">表のタイトル</caption>
<tr><td>セル内容</td></tr></table>
caption
要素は table
要素の中で一番最初に記述して、その表にキャプション(表題)を指定します。また、caption
要素の align
属性はキャプションの表示位置を指定する属性で、値には上下左右の位置を指定する4つのキーワードがあります。
- top
- 表組の上、テキストは中央揃えで表示
- bottom
- 表組の下、テキストは中央揃えで表示
- left
- 表組の上(デフォルト)、テキストは左揃えで表示
- right
- 表組の上(デフォルト)、テキストは右揃えで表示
上記の通りの表示になるのはInternet Explorer のみです(旧Presto版Operaも対応していた)。"left
", "right
" はもともと Internet Explorer が独自に採用した機能であるため、UA によって対応が大きく異なります。
さらに、デフォルトではキャプションは表の上部に表示されますが、Internet Explorer にはキャプションの上下位置を指定する valign
属性の独自機能があります。caption
要素の align
属性に "left
"、または "right
" が指定されている場合に、上下の位置を指定する次の2つのキーワードを valign
属性の値に指定できます。
- top
- 表組の上、テキストは
align
属性で指定された揃え方に従って表示 - bottom
- 表組の下、テキストは
align
属性で指定された揃え方に従って表示
- 関連
セルのオプション
表を構成するための tr
要素, th
要素, td
要素にもさまざまな属性を組み合わせることで、表示に関する細かい指定が行えます。
個々のセルのサイズを指定
<table border="1"><tr>
<th width="250" height="150">見出セル</th>
<td width="250" height="150">セル内容</td>
</tr></table>
th
要素, td
要素の width
属性, height
属性は個々のセルの表示サイズを指定します。width
属性がセルの横幅, height
属性がセルの高さを設定する属性で、値はセルのサイズを整数によるピクセル数で固定するか、または表示域の横幅、縦幅に対するパーセンテージ値(%
)で指定します。サイズの指定は個々のセルに対して指定できますが、列・行それぞれの横幅・高さの表示サイズは、その列、行内でもっとも大きなサイズを指定したセルのサイズが適用されることになります。なお、height
属性, width
属性ともに非推奨属性のため、CSS の height
プロパティ, width
プロパティで代替することが推奨されています。
セル内のテキストの折り返しを禁止
<table border="1"><tr>
<th nowrap>見出セル</TH>
<td nowrap>セル内容</TD>
</tr></table>
th
要素, td
要素の nowrap
属性はセル内のテキストを折り返しさせないで表示させる属性です。通常、表示域のサイズに応じて、または表やセルのサイズが指定されている場合はセル内に配置されたテキストはそのサイズに応じて自動的に折り返して表示されます。nowrap
属性はその折り返しを禁止する属性で、これが追加されたセル内のテキストは表示域のサイズが縮小されても、テキストの折り返しが行われず、表示域からはみ出して横スクロールを表示することもあります。これは nobr
要素と同じ機能です。なお、nowrap
属性は非推奨属性のため、CSS の white-space
プロパティで代替することが推奨されています。
セル内容の水平(左右)方向の揃え方の指定
<table border="1" align="center">
<tr align="center"><th>見出しセル</th><td>セル内容</td></tr>
<tr><th align="center">見出しセル</th>
<td align="center">セル内容</td></tr></table>
align
属性は表のセル内のテキストやイメージなどの内容の水平(左右)方向の揃え方を指定します。tr
要素に対して align
属性を指定した場合は、その行内に含まれるセル全てを対象に位置揃えを指定することができます。align
属性の値には次の5つのキーワードがあります。
- left
- 内容とテキストを左揃えで表示する
- right
- 内容とテキストを右揃えにする
- center
- 内容とテキストを中央揃えにする
- justify
- 文字を均等に配置し、テキストを両端揃えで表示する
- char
char
属性で指定した特定の文字を基準に揃えて表示する
align
属性を指定しない場合、セル内容の位置揃えは、使用する言語の書字方向に応じて表示されます。使用する言語は lang
属性に指定されている言語コードにより決定されます。日本語(ja
)であれば初期値は左揃えの状態(left
)で表示されます。ただし、見出しにあたるセルを定義する th
要素の内容は使用する言語に関係なく多くの場合、中央揃えで表示されます。なお、align
属性は非推奨属性のため、CSS の text-align
プロパティでテキストや画像などのセル内容の水平(左右)方向の揃え方を代替することが推奨されています。
セル内容の垂直(上下)方向の揃え方の指定
<table border="1" align="center">
<tr valign="top"><th>見出しセル</th><td>セル内容</td></tr>
<tr><th valign="top">見出しセル</th>
<td valign="top">セル内容</td></tr></table>
valign
属性はセル内容の垂直(上下)方向の揃え方を指定します。tr
要素に対して valign
属性を指定した場合は、その行内に含まれるセル全てを対象に位置揃えを指定することができます。valign
属性に指定できる値には次の4つのキーワードがあります。
- top
- セルの上辺に内容の上辺を揃えて表示する
- middle
- セルの垂直方向の長さの中央に表示する
- bottom
- セルの下辺に内容の下辺を揃えて表示する
- baseline
- テキストの1行目をベースラインで揃えて表示する(2行目以降は影響なし)
valign
属性を指定しない場合、テキストやイメージは垂直方向の長さの中央(middle
)に表示されます。なお、valign
属性は非推奨属性ではありませんが、CSS で td
要素, th
要素の各セルをセレクタとする vertical-align
プロパティで同様の表現に代替できます。
表やセルの背景色・背景画像の指定
1. 背景に色をつける
<table border="1" bgcolor="#000000">
<tr bgcolor="#FFFFFF"><th>見出し内容</th><td>内容</td></tr>
<tr><th bgcolor="#FFFFFF">見出し内容</th>
<td bgcolor="#FFFFFF">内容</td></tr></table>
table
要素の bgcolor
属性は表全体に背景色を指定する属性です。tr
要素の bgcolor
属性はその1行に含まれるセル全てに対して背景色を指定します。th
要素, td
要素の bgcolor
属性は表の各セルに個別で背景色を指定することができます。いずれの要素の bgcolor
属性の値も RGB値、またはカラーネームで色を指定します。なお、bgcolor
属性は非推奨属性のため、それぞれの対象に対して CSS の background-color
プロパティで代替することが推奨されています。
2. 背景にイメージを表示する
<table border="1" background="画像ファイルのURI">
<tr background="画像ファイルのURI">
<th>見出しセル</th><td>セル内容</td></tr>
<tr><th background="画像ファイルのURI">見出しセル</th>
<td background="画像ファイルのURI">セル内容</td></tr></table>
table
要素の background
属性は表全体に背景画像を指定する属性です。tr
要素の background
属性はその1行に含まれるセル全てに対して背景画像を指定します。th
要素, td
要素の background
属性は表の各セルに個別で背景画像を指定することができます。指定された背景画像は、それぞれ表全体のサイズ、セルのサイズに応じて縦横にタイル状に繰り返し表示されます。background
属性の値には画像ファイルの所在を URI で指定します。
background
属性は HTML の仕様には正式に定義されていないブラウザの独自機能ですが、主要視覚ブラウザはすべて対応しています。なお、代替表現は CSS の background-image
プロパティで行うことが可能です。
複数行・列のセルを結合
1. 複数行のセルを縦方向に連結する
<table border="2">
<tr><th rowspan="5">見出しセル</th>
<td>セル内容</td></tr>
<tr><td>セル内容</td></tr><tr><td>セル内容</td></tr>
<tr><td>セル内容</td></tr><tr><td>セル内容</td></tr>
</table>
th
要素, td
要素の rowspan
属性はセルを縦方向の複数のセル(行)に連結する属性です。rowspan
属性を追加した th
要素、または td
要素のセルは指定数のセルを連結させ、縦にまたいだ形で表示されます。指定方法の手順は、まず基本の表を作成し、その中で連結させる複数のセルのうち、いちばん上にあるセルに rowspan
属性を追加し、まとめるセルの数に応じて値を整数で指定します。最後にまとめたことによって吸収される分のセルの記述を削除すると良いでしょう。
2. 複数行のセルを横方向に連結する
<table border="1">
<tr><th colspan="5">見出しセル</th></tr>
<tr><td>セル内容</td><td>セル内容</td><td>セル内容</td>
<td>セル内容</td><td>セル内容</td></tr>
</table>
th
要素, td
要素の colspan
属性はセルを横方向の複数のセル(列)に連結する属性です。colspan
属性を追加した th
要素、または td
要素のセルは指定数のセルを連結させ、横にまたいだような形で表示されます。指定方法の手順は、まず基本の表を作成し連結させる複数のセルをひとつにまとめて、そこに colspan
属性を追加し、まとめるセルの数に応じて値を整数で指定します。最後にまとめたことによって吸収される分のセルの記述を削除すると良いでしょう。
行・行グループ(横)の構造化
<table>
<thead><tr><td>セル内容</td><td>セル内容</td></tr></thead>
<tfoot><tr><td>セル内容</td><td>セル内容</td></tr></tfoot>
<tbody><tr><td>セル内容</td><td>セル内容</td></tr></tbody>
</table>
thead
要素, tfoot
要素, tbody
要素は表の内容をグループ化するための要素です。それぞれ thead
要素は表のヘッダ部分、tfoot
要素はフッタ部分、tbody
要素は本体部分をそれぞれグループ化します。この構造分けは表を横に区切るもので、ヘッダ、フッタ部分は表内に1つずつ、ボディは複数指定することができます。指定方法は、行(tr
要素)単位でまとめる形で、その前後を開始タグと終了タグではさみます。
注意点として、thead
要素, tfoot
要素は table
要素内で tbody
要素よりも前(先)に記述します。これは表の本体のデータを待たずに先にヘッダとフッタを表示できるようにするためです。視覚ブラウザは tbody
要素よりも前(先)に記述されている tfoot
要素部分を表の一番下に表示します。
グループ化することで表が一画面に収まらない場合、ヘッダ部とフッタ部を表示域内で固定し、本体部分をその間にスクロールさせて表示することが期待されます(現在、このようなレンダリングを行う UA はありません)。また、印刷時においても表の内容を印刷するのに用紙が複数枚にまたがる場合は、用紙の全ページにヘッダ・フッタ部分のみを繰り返し付けることが期待されます(現在、このような機能をする UA はありません)。また、thead
要素, tfoot
要素, tbody
要素はいずれも align
属性(水平方向の揃え方), valign属性(垂直方向の揃え方)と組合わせることができます。align
属性, valign
属性は非推奨属性ではありませんが、CSS でそれぞれ、text-align
プロパティ, vertical-align
プロパティで代替することが可能です。
列・列グループ(縦)の構造化
<table border="1">
<colgroup align="center" width="200"></colgroup>
<colgroup span="2"><col width="200"><col width="100"></colgroup>
<tr><th>見出しセル</th><th>見出しセル</th><th>見出しセル</th></tr>
<tr><td>セル内容</td><td>セル内容</td><td>セル内容</td></tr>
<tr><td>セル内容</td><td>セル内容</td><td>セル内容</td></tr>
</table>
colgroup
要素も表の内容をグループ化するための要素で、こちらはセルの縦列をグループ化します。span
属性はグループ化する列数を指定する属性で、値はまとめる列数を整数で指定します。col
要素は colgroup
要素でグループとしてまとめた列に関して個別にスタイル(装飾)を指定する場合に用います。いずれも width
属性(セルの横幅), align
属性(水平方向の揃え方), valign
属性(垂直方向の揃え方)と組合わせて指定できます。しかし、col
要素, colgroup
要素に指定された属性の対応は UA ごとにかなりバラツキがあります。詳しい対応状況は HTML辞典の col
要素, colgroup
要素を参照してください。なお、width
属性, align
属性, valign
属性はいずれも非推奨属性ではありませんが、CSS でそれぞれ、width
プロパティ, text-align
プロパティ, vertical-align
プロパティで代替が可能です。
- 関連
アクセシビリティに関する属性
表には非視覚環境からの参照においても、その内容を正しく把握できるように数多くの機能が定義されています。それらの機能を使って、非視覚環境が表現する表の情報と視覚環境で閲覧した場合の情報の流れとが一致するように工夫して、アクセシブルな表を作成してみましょう。
英語 | 数学 | 国語 | |
---|---|---|---|
鈴木くん | 80 | 65 | 75 |
佐藤くん | 50 | 95 | 40 |
この表はテスト結果の成績表です。成績表は縦方向の項目が「氏名」で、横方向の項目は「教科」で構成されています。行に対しての見出しには生徒の氏名が並んでいます。列に対しての見出しには「英語」「数学」「国語」といった教科名が並んでいます。この表を合成音声出力機器を使って通常どおりに読み上げた場合、左上から右下に1セルずつ順に「英語, 数学, 国語, 鈴木くん, 80, 65, 75, 佐藤くん, 50, 95, 40」と読み上げられていくことでしょう。しかし、"鈴木くん" と読み上げた次にいきなり "80" と数字だけを読み上げられても、一体何に対する "80" なのかがわかりません。そこで、非視覚環境が表現する情報の流れと視覚環境で参照した場合の情報の流れが一致するように作表してみましょう。
<table summary="鈴木くんと佐藤くんのテスト結果一覧表">
<caption>テスト結果</caption>
<tr>
<td></td>
<th abbr="英" axis="subject" id="english">英語</th>
<th abbr="数" axis="subject" id="mathematics">数学</th>
<th abbr="国" axis="subject" id="linguistics">国語</th>
</tr>
<tr>
<th abbr="鈴木" axis="name" id="suzuki">鈴木くん</th>
<td headers="english suzuki">80</td>
<td headers="mathematics suzuki">65</td>
<td headers="linguistics suzuki">75</td>
</tr>
<tr>
<th abbr="佐藤" axis="name" id="satou">佐藤くん</th>
<td headers="english satou">50</td>
<td headers="mathematics satou">95</td>
<td headers="linguistics satou">40</td>
</tr>
</table>
まず、table
要素に指定されている summary
属性には表全体が表現している情報や表の構造を簡潔に説明するテキストを指定します。音声出力環境において、表の内容より先に summary
属性の値を読み上げてもらうことを意図しており、最初に表がどのような内容を扱っているのかを示すことで、ユーザの理解を促すことが期待できます。もうひとつ、summary
属性と同じ役割をもつ abbr
属性は見出しセルの th
要素に設定し、見出しの内容を省略したテキストを指定しますが、もともと省略形に近い内容の場合は、そのまま同じ内容を記述するか、やみくもに abbr
属性を付ける必要はありません。
headers
属性は td要素に見出し情報を提供している th
要素の id
属性の値を指定します。これにより td
要素の headers
属性の値が th
要素の id
属性の値を参照します。複数の id
属性の値を参照する場合には、半角スペースで区切って列挙することができます。また、axis
属性に td
要素、または th
要素の内容を示した分類名を指定し、headers
属性と関連付けしています。この作表によって、鈴木くんの英語の成績の "80" の部分であれば「subject:英, name:鈴木, 80」と視覚環境と同様の情報の流れで読み上げることが期待されます。