table 要素
4.9.1 table 要素
- カテゴリー
- フロー・コンテンツ
- この要素を使うことができるコンテキスト:
- フロー・コンテンツが期待される場所
- コンテンツ・モデル:
- この順番で:オプションで 1 つの
caption要素、続いて、0 個以上のcolgroup要素、続いて、オプションで 1 つのthead要素、続いて、オプションで 1 つのtfoot要素、続いて、0 個以上のtbody要素または 1 個以上のtr要素、続いて、オプションで 1 つのtfoot要素(ただし、tfoot要素は、合計で1個つまでしか入れてはいけません。) - コンテンツ属性:
- グローバル属性
border- DOMインタフェース:
-
interface HTMLTableElement : HTMLElement { attribute HTMLTableCaptionElement caption; HTMLElement createCaption(); void deleteCaption(); attribute HTMLTableSectionElement tHead; HTMLElement createTHead(); void deleteTHead(); attribute HTMLTableSectionElement tFoot; HTMLElement createTFoot(); void deleteTFoot(); readonly attribute HTMLCollection tBodies; HTMLElement createTBody(); readonly attribute HTMLCollection rows; HTMLElement insertRow(in optional long index); void deleteRow(in long index); attribute DOMString border; };
table 要素は、テーブルの形式で 1 個以上の次元をもったデータを表します。
テーブルには、その子孫によって指定される行、カラム、セルがあります。行とカラムはグリッドを形成します。テーブルのセルは、オーバーラップせずに、そのグリッドを完全に覆わなければいけません。
この準拠要件を満たしているかどうかを判定する正確な規則は、テーブル・モデルにて説明されています。
ウェブ制作者は、複雑なテーブルの解釈の方法を説明する情報を提供することが推奨されます。そのような情報を提供する方法に関するガイドラインは後述します。
もし、table 要素に summary 属性があり、ユーザーエージェントがそのテーブルをレイアウト・テーブルと分類しなかったら、ユーザーエージェントは、ユーザーにその属性のコンテンツをレポートすることができます。
テーブルをレイアウト目的で使うべきではありません。歴史的に、多くのウェブ制作者が、ページ・レイアウトを制御する方法として、HTML にテーブルを入れていました。これは、ドキュメントから表形式データを抽出することを困難にしてしまいます。特に、スクリーン・リーダーといったアクセシビリティ・ツールのユーザーは、レイアウト目的で使われたテーブルがあると、ページを渡り歩くことがが非常に困難になります。もし、テーブルをレイアウト目的で使うのであれば、role="presentation" という属性を使わなければいけません。これによって、ユーザーエージェントは、支援テクノロジーに対して適切にテーブルを表すことができるようになります。また、ドキュメントから表形式データを抽出しようとするツールに、ウェブ制作者の意図を適切に伝えることができるようになります。
レイアウトに HTML のテーブルを使う代わりの方法はいくつもあります。基本的には、CSS の位置指定や CSS の表組みを使ってください。
border 属性は table 要素に指定することができます。その table 要素はレイアウト目的で使われていないことを明示的に表すことができます。指定するなら、その属性値は、空文字列か値 "1" のいずれかでなければいけません。この属性は、そのテーブルのセルの周囲にボーダーを引くという指示として、特定のユーザーエージェントによって使われます。
テーブルは、理解しにくかったり、ナビゲートしにくかったりすることがあります。これに関してユーザーを助けるべく、ユーザーエージェントは、そのテーブルがレイアウト・テーブルとして分類されなかった場合は、そのテーブルのセルをお互いに区別できるようはっきりと描画するべきです。
ウェブ制作者と実装者は、ユーザーがテーブルを渡り歩きやすくするために、後述のテーブル・レイアウト・テクニックのいくつかを使うことを考慮することが推奨されます。
ユーザーエージェントは、とりわけ、任意のコンテンツでテーブル解析を行うものは、どのテーブルが実際にデータを含んでいるのか、そして、どのテーブルが単にレイアウト目的に使われているのか、を判定できるような、経験則的な方法を見つけることが推奨されます。本仕様は、正確な経験則的な方法については定義しませんが、次に考え得る目安を提示します:
| 特徴 | 目安 |
|---|---|
値に presentation がセットされた role 属性が使われている |
レイアウト・テーブルである可能性が大きい |
0 が値にセット(非準拠)された border 属性が使われている |
レイアウト・テーブルである可能性が大きい |
0 が値にセットされた cellspacing と cellpadding 属性(非準拠)が使われている |
レイアウト・テーブルである可能性が大きい |
caption, thead, th 要素のいずれかが使われている |
非レイアウト・テーブルである可能性が大きい |
headers と scope 属性のいずれも使われている |
非レイアウト・テーブルである可能性が大きい |
0 より大きい値がセットされた border 属性が使われている |
非レイアウト・テーブルである可能性が大きい |
| CSS を使って明示的な可視ボーダーがセットされている | 非レイアウト・テーブルである可能性が大きい |
summary が使われている |
有効な目安がありません。(レイアウト・テーブルにも非レイアウト・テーブルにも、歴史的に、この属性が使われてきました。) |
- table .
caption[ = value ] -
該当のテーブルの
caption要素を返します。値をセットして、
caption要素を置き換えることができます。新しい値がcaption要素でなければ、HIERARCHY_REQUEST_ERR例外を投げます。 - caption = table .
createCaption() -
該当のテーブルが確実に
caption要素を持つ状態にしてから、それを返します。 - table .
deleteCaption() -
該当のテーブルが確実に
caption要素を持たない状態にします。 - table .
tHead[ = value ] -
該当のテーブルの
thead要素を返します。値をセットして、
thead要素を置き換えることができます。新しい値がthead要素でなければ、HIERARCHY_REQUEST_ERR例外を投げます。 - thead = table .
createTHead() -
該当のテーブルが確実に
thead要素を持つ状態にしてから、それを返します。 - table .
deleteTHead() -
該当のテーブルが確実に
thead要素を持たない状態にします。 - table .
tFoot[ = value ] -
該当のテーブルの
tfoot要素を返します。値をセットして、
tfoot要素を置き換えることができます。新しい値がtfoot要素でなければ、HIERARCHY_REQUEST_ERR例外を投げます。 - tfoot = table .
createTFoot() -
該当のテーブルが確実に
tfoot要素を持つ状態にしてから、それを返します。 - table .
deleteTFoot() -
該当のテーブルが確実に
tfoot要素を持たない状態にします。 - table .
tBodies -
該当のテーブルの
tbody要素のHTMLCollectionを返します。 - tbody = table .
createTBody() -
tbody要素を生成し、それを該当のテーブル挿入してから、それを返します。 - table .
rows -
該当のテーブルの
tr要素のHTMLCollectionを返します。 - tr = table .
insertRow(index) -
tr要素を生成します。必要に応じてtbodyも生成します。そして、それらを引数に指定された位置に該当のテーブルに挿入してから、生成したtrを返します。位置は、該当のテーブルの行に対して相対的になります。インデックス -1 なら、該当のテーブルの最後に挿入することになります。
指定位置が -1 より小さい、または、行の数より大きいなら、
INDEX_SIZE_ERR例外を投げます。 - table .
deleteRow(index) -
該当のテーブルの指定位置にある
tr要素を削除します。位置は、該当のテーブルの行に対して相対的になります。インデックス -1 なら、該当のテーブルの最後の行を削除することになります。
指定位置が -1 より小さい、または、最後の行のインデックスより大きいなら、
INDEX_SIZE_ERR例外を投げます。
caption IDL
属性は、取得時においては、table 要素の子となる caption 要素があれば、その最初のものを返し、なければ、null を返さなければいけません。セット時においては、もし、新しい値が caption 要素なら、table 要素の子に caption 要素があれば、その最初のものを削除し、それから、table 要素の最初のノードとして、それを挿入しなければいけません。もし、新しい値が caption 要素でなければ、HIERARCHY_REQUEST_ERR DOM 例外が発出されなければいけません。
createCaption() メソッドは、table 要素の子に caption 要素があれば、その最初のものを返さなければいけません。なければ、新規に caption 要素を生成し、table 要素の最初のノードとしてそれを挿入してから、返さなければいけません。
deleteCaption() メソッドは、table 要素の子に caption 要素があれば、その最初のものを削除しなければいけません。
tHead IDL
属性は、取得時においては、table 要素の子に thead 要素があれば、その最初のものを返し、なければ、null を返さなければいけません。セット時においては、もし、新しい値が thead 要素であれば、table 要素の子に thead 要素があれば、その最初のものを削除しなければいけません。そして、caption 要素でも colgroup 要素でもない要素が table 要素の中にあれば、その最初の要素の直前に、なければ、テーブルの最後に、新しい値を挿入しなければいけません。新しい値が thead 要素でなければ、HIERARCHY_REQUEST_ERR DOM 例外が発出されなければいけません。
createTHead() メソッドは、table 要素の子に thead 要素があれば、その最初のものを返さなければいけません。なければ、新規に thead 要素を生成し、caption 要素でも colgroup 要素でもない要素が table 要素の中にあれば、その最初の要素の直前に、なければ、テーブルの最後に、新しい値を挿入しなければいけません。それから、その新しい値を返さなければいけません。
deleteTHead() メソッドは、table 要素の子に thead 要素があれば、その最初のものを削除しなければいけません。
tFoot IDL
属性は、取得時においては、table 要素の子に tfoot 要素があれば、その最初のものを返さなければいけません。セット時においては、もし、新しい値が tfoot 要素であれば、table 要素の子に tfoot 要素があれば、その最初のものを削除しなければいけません。そして、caption 要素でも colgroup 要素でもない要素が table 要素の中にあれば、その最初の要素の直前に、なければ、テーブルの最後に、新しい値を挿入しなければいけません。新しい値が tfoot 要素でなければ、HIERARCHY_REQUEST_ERR DOM 例外が発出されなければいけません。
createTFoot() メソッドは、table 要素の子に tfoot 要素があれば、その最初のものを返さなければいけません。なければ、新規に tfoot 要素を生成し、caption 要素でも colgroup 要素でもない要素が table 要素の中にあれば、その最初の要素の直前に、なければ、テーブルの最後に、新しい値を挿入しなければいけません。それから、その新しい値を返さなければいけません。
deleteTFoot() メソッドは、table 要素の子に tfoot 要素があれば、その最初のものを削除しなければいけません。
tBodies 属性は、table ノードをルートとした HTMLCollection を返さなければいけません。ただし、table 要素の子である tbody 要素に一致するもののみにフィルターされます。
createTBody() メソッドは、tbody 要素を新規に生成しなければいけません。そして、table 要素に tbody 要素があれば、その直後に、table 要素に tbody 要素がなければ、table 要素の最後に、それを挿入しなければいけません。それから、その新規の tbody 要素を返さなければいけません。
rows 属性は、table ノードをルートとした HTMLCollection を返さなければいけません。ただし、table 要素、または、table 要素の子の thead, tbody, tfoot のいずれかの子となる tr 要素に一致するもののみにフィルターされます。このコレクションの要素は、まず thead が親となるものからツリー順に並び、続いて、table または tbody 要素が親となる要素がツリー順に並び、最後に、tfoot 要素が親となる要素がツリー順に並ぶようにしなければいけません。
insertRow(index) メソッドの挙動は、テーブルの状態に依存します。呼び出された時には、このメソッドは、テーブルの状態と index 引数を記述した次の条件のリストのうち、最初の項目に求められる通りに動作しなければいけません:
- index が -1 より小さい、または、
rowsコレクションの要素数より大きい場合: - このメソッドは、
INDEX_SIZE_ERR例外を発出しなければいけません。 rowsコレクションに要素がなく、かつ、table要素にtbody要素がない場合:- このメソッドは、
tbody要素を生成してから、tr要素を生成し、それから、tbody要素に、そのtr要素を追加し、それから、そのtbody要素をtable要素に追加してから、最後に、そのtr要素を返さなければいけません。 rowsコレクションに要素がない場合:- このメソッドは、
tr要素を生成してから、該当のテーブルにある最後のtbody要素にそれを追加し、そして、そのtr要素を返さなければいけません。 - index が指定されなかった、または、-1 に等しい、または、
rowsコレクションの項目の数に等しい場合: - このメソッドは、
tr要素を生成し、rowsコレクションの最後のtr要素の親にそれを追加し、それから、新規に生成したtr要素を返さなければいけません。 - それ以外の場合:
- このメソッドは、
tr要素を生成し、rowsコレクションの中で、同じ親を持つ index 番目のtr要素の直前に、それを挿入し、最後に、新規に生成したtr要素を返さなければいけません。
deleteRow(index) メソッドが呼び出されたときには、ユーザーエージェントは、次の手順を実行しなければいけません:
-
index が -1 に等しく、
rowsコレクションに項目があれば、その項目数から 1 を引いた数字を index にセットしなければいけません。 -
この時点で、index が 0 より小さい、または、
rowsコレクションの要素の数より大きい、または、等しいなら、このメソッドは、INDEX_SIZE_ERR例外を発出し、これらの手順を中止しなければいけません。 -
そうででなければ、このメソッドは、
rowsコレクションの index 番目の要素を、その親から削除しなければいけません。
border IDL
属性は、同じ名前のコンテンツ属性を反映しなければいけません。
これは、数独パズルをマークアップするために使われてるテーブルの例です。ヘッダーが欠落している点に注目してください。こういったテーブルには必要ありません。
<section>
<style scoped>
table { border-collapse: collapse; border: solid thick; }
colgroup, tbody { border: solid medium; }
td { border: solid thin; height: 1.4em; width: 1.4em; text-align: center; padding: 0; }
</style>
<h1>Today's Sudoku</h1>
<table>
<colgroup><col><col><col>
<colgroup><col><col><col>
<colgroup><col><col><col>
<tbody>
<tr> <td> 1 <td> <td> 3 <td> 6 <td> <td> 4 <td> 7 <td> <td> 9
<tr> <td> <td> 2 <td> <td> <td> 9 <td> <td> <td> 1 <td>
<tr> <td> 7 <td> <td> <td> <td> <td> <td> <td> <td> 6
<tbody>
<tr> <td> 2 <td> <td> 4 <td> <td> 3 <td> <td> 9 <td> <td> 8
<tr> <td> <td> <td> <td> <td> <td> <td> <td> <td>
<tr> <td> 5 <td> <td> <td> 9 <td> <td> 7 <td> <td> <td> 1
<tbody>
<tr> <td> 6 <td> <td> <td> <td> 5 <td> <td> <td> <td> 2
<tr> <td> <td> <td> <td> <td> 7 <td> <td> <td> <td>
<tr> <td> 9 <td> <td> <td> 8 <td> <td> 2 <td> <td> <td> 5
</table>
</section>
4.9.1.1 テーブルを表現するためのテクニック
最初の行や最初のカラムではないセルが見出しとなるようなテーブルや、読者がコンテンツの理解に困難を伴うようなテーブルに対して、ウェブ制作者は、そのテーブルの説明情報を入れるべきです。この情報は、すべてのユーザーにとって有益なだけでなく、スクリーン・リーダーのユーザーのように、そのテーブルを見ることができないユーザーにとっては、とりわけ有益なものになります。
こういった説明情報は、そのテーブルの目的を紹介し、基本的なセルの構造をまとめ、傾向やパターンをはっきりさせ、そのテーブルをどうやって使うのかをユーザーに教えるものとするべきです。
例えば、次のテーブルは:
| マイナス面 | 特徴 | プラス面 |
|---|---|---|
| 悲しい | 気分 | 幸せ |
| 不合格 | 成績 | 合格 |
... そのテーブルがレイアウトされた理由を説明する文章があれば分かりやすくなるでしょう。例えば、次のような文章です。"2 番目のカラムに特徴が入れられています。その左側のカラムにはマイナス面が、右側にはプラス面が入れられています。"。
この情報を入れる方法はいくつかあります:
- テーブルの前後の本文の中
-
<p>In the following table, characteristics are given in the second column, with the negative side in the left column and the positive side in the right column.</p> <table> <caption>Characteristics with positive and negative sides</caption> <thead> <tr> <th id="n"> Negative <th> Characteristic <th> Positive <tbody> <tr> <td headers="n r1"> Sad <th id="r1"> Mood <td> Happy <tr> <td headers="n r2"> Failing <th id="r2"> Grade <td> Passing </table>
- テーブルの
captionの中 -
<table> <caption> <strong>Characteristics with positive and negative sides.</strong> <p>Characteristics are given in the second column, with the negative side in the left column and the positive side in the right column.</p> </caption> <thead> <tr> <th id="n"> Negative <th> Characteristic <th> Positive <tbody> <tr> <td headers="n r1"> Sad <th id="r1"> Mood <td> Happy <tr> <td headers="n r2"> Failing <th id="r2"> Grade <td> Passing </table>
- テーブルの
captionの中に入れたdetailsの中 -
<table> <caption> <strong>Characteristics with positive and negative sides.</strong> <details> <summary>Help</summary> <p>Characteristics are given in the second column, with the negative side in the left column and the positive side in the right column.</p> </details> </caption> <thead> <tr> <th id="n"> Negative <th> Characteristic <th> Positive <tbody> <tr> <td headers="n r1"> Sad <th id="r1"> Mood <td> Happy <tr> <td headers="n r2"> Failing <th id="r2"> Grade <td> Passing </table>
figureの中にテーブルを入れ、そのテーブルのとなり-
<figure> <figcaption>Characteristics with positive and negative sides</figcaption> <p>Characteristics are given in the second column, with the negative side in the left column and the positive side in the right column.</p> <table> <thead> <tr> <th id="n"> Negative <th> Characteristic <th> Positive <tbody> <tr> <td headers="n r1"> Sad <th id="r1"> Mood <td> Happy <tr> <td headers="n r2"> Failing <th id="r2"> Grade <td> Passing </table> </figure> figureの中にテーブルを入れ、そのとなりのfigcaptionの中-
<figure> <figcaption> <strong>Characteristics with positive and negative sides</strong> <p>Characteristics are given in the second column, with the negative side in the left column and the positive side in the right column.</p> </figcaption> <table> <thead> <tr> <th id="n"> Negative <th> Characteristic <th> Positive <tbody> <tr> <td headers="n r1"> Sad <th id="r1"> Mood <td> Happy <tr> <td headers="n r2"> Failing <th id="r2"> Grade <td> Passing </table> </figure>
ウェブ制作者は、必要に応じて、他のテクニックや、前述のテクニックの組み合わせも使うことができます。
もちろん、最善の選択肢は、テーブルのレイアウト方法を解説した説明文を書くのではなく、説明が必要とならないようなテーブルに調整することです。
前述の例で使われたテーブルの場合、簡単に再構成するとしたら、ヘッダーをトップと左におきます。こうすることで、説明の必要がなくなり、headers 属性を使う必要もなくなります:
<table> <caption>プラス面とマイナス面を持ち合わせた特徴 </caption> <thead> <tr> <th> 特徴 <th> マイナス面 <th> プラス面 <tbody> <tr> <th> 気分 <td> 悲しい <td> 幸せ <tr> <th> 成績 <td> 不合格 <td> 合格 </table>
4.9.1.2 テーブル・レイアウトのテクニック
良いテーブル・レイアウトの要諦は、より読みやすく使いやすくすることです。
ビジュアル・メディアでは、カラムと行にボーダーを与え、行の背景を交互に変えることは、複雑なテーブルをより読みやすくする上では、非常に効果的です。
膨大な数値のコンテンツを伴うテーブルに対しては、等幅フォントを使うと、ユーザーはパターンが見やすくなるでしょう。ユーザーエージェントがボーダーをレンダリングしない状況においては、なおさらです。(残念なことに、歴史的な理由で、一般にデフォルトは、テーブルにボーダーをレンダリングしません。)
スピーチ・メディアにおいては、テーブルのセルは、そのセルのコンテンツが読まれる前に、対応するヘッダーが読み上げられることで、区別できます。ユーザーは、テーブルをグリッド単位で渡り歩くことも可能です。ソース順にテーブルのすべてのコンテンツをつなげられるわけではありません。
ウェブ制作者は、これらの効果を実現するために CSS を使うことが推奨されます。
ユーザーエージェントは、ページに CSS が使われていないときや、レイアウト・テーブルとして分類されないときは、これらのテクニックを使ってテーブルをレンダリングすることが推奨されます。
※ 原文:http://www.w3.org/TR/2011/WD-html5-20110525/tabular-data.html#the-table-element