table 要素

4.9.1 table 要素

Status: Last call for comments. ISSUE-92 (cleanuptable) blocks progress to Last Call

カテゴリー
フロー・コンテンツ
この要素を使うことができるコンテキスト:
フロー・コンテンツが期待される場所
コンテンツ・モデル:
この順番で:オプションで 1 つの caption 要素、続いて、0 個以上の colgroup 要素、続いて、オプションで 1 つの thead 要素、続いて、オプションで 1 つの tfoot 要素、続いて、0 個以上の tbody 要素または 1 個以上の tr 要素、続いて、オプションで 1 つの tfoot 要素(しかし、tfoot 要素は、合計で1個つまでしか入れてはいけません。)
コンテンツ属性:
グローバル属性
summary (本文参照のこと)
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 summary;
};

table 要素は、テーブルの形式で 1 個以上の次元をもったデータを表します。

table 要素は、テーブル・モデルに属します。

テーブルをレイアウト目的で使ってはいけません。歴史的に、ページレイアウトを制御する方法として、HTML 内にテーブルを誤用するウェブ制作者がいました。この利用方法は非準拠です。ドキュメントからテーブル・データを展開しようとするツールが、非常に紛らわしい結果を取得してしまうからです。特に、スクリーン・リーダーのようなアクセシビリティ・ツールのユーザーは、レイアウト目的のテーブルがあるページのナビゲートに多大な困難を伴うことになるでしょう。

レイアウトに HTML のテーブルを使う代わりの方法はいくつもあります。まず CSS の位置指定や CSS の表組みを使ってください。

任意のコンテンツでのテーブル解析をするユーザーエージェントは、どのテーブルが本当のデータを含んでおり、どのテーブルがただ単にレイアウト目的のためだけに使われているのかを決定できる経験則を見つけることが推奨されます。この仕様では、正確な経験則を定義していません。

テーブルは、その子孫に行とカラムを持ちます。テーブル・モデルの説明で解説されているように、テーブルには、空の行や空のカラムがあってはいけません。

最初の行や最初のカラムではないセルが見出しとなるようなテーブルや、リーダーがコンテンツの理解に困難を伴うテーブルに対して、ウェブ制作者は、そのテーブルの説明情報を入れるべきです。この情報は、すべてのユーザーにとって有益なだけでなく、スクリーン・リーダーのユーザーのように、そのテーブルを見ることができないユーザーにとっては、とりわけ有益なものになります。

説明情報は、そのテーブルの目的を紹介し、基本的なセルの構造をまとめ、傾向やパターンをはっきりさせ、そのテーブルをどうやって使うのかをユーザーに教えるものとするべきです。

例えば、次のテーブルは:

プラス面とマイナス面を持ち合わせた特徴
マイナス 特徴 プラス
悲しい 気分 幸せ
不合格 成績 合格

... そのテーブルがレイアウトされた理由を説明する文章があれば分かりやすくなるでしょう。例えば、次のような文章です。"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>
テーブルのとなりにある figurefigcaption の中
<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>Characteristics with positive and negative sides</caption>
 <thead>
  <tr>
   <th> Characteristic
   <th> Negative
   <th> Positive
 <tbody>
  <tr>
   <th> Mood
   <td> Sad
   <td> Happy
  <tr>
   <th> Grade
   <td> Failing
   <td> Passing
</table>

以前の仕様では、table 要素の summary 属性は、スクリーン・リーダーのユーザーのために、複雑なテーブル向けに説明を提供するためのテクニックを想定したものでした。代わりに、前述のテクニックのひとつが使うべきです。

特に、ウェブ制作者は、テーブルの説明テキストが目の不自由な人に役立つかどうかを検討することが推奨されます。もしそのテキストが役に立たないのであれば、summary 属性を入れないほうが良いでしょう。同様に、その説明テキストが、目の不自由でない人、例えば、初めてそのテーブルを見る人を助けることができるのであれば、そのテキストは、そのテーブルの前か、caption の中に入れれば、より役に立つものとなるでしょう。例えば、テーブルのデータの結論を説明することは、誰にとっても役に立ちます。テーブルの読み方を説明することは、もしヘッダーだけでははっきりしないのであれば、誰にでも役に立ちます。テーブルの構造を説明することは、見ればすぐに分かるようなものであれば、誰にでも役に立つわけではないでしょう。しかし、アクセスビリティ・ツールを使ってテーブルを素早くナビゲートすることができるユーザーにも役に立つわけではないでしょう。

table 要素が summary 属性を持つなら、ユーザーエージェントは、その属性のコンテンツをユーザーに通知することができます。

table . caption [ = value ]

テーブルの caption 要素を返します。

caption 要素を置き換えるために、この属性に値をセットすることができます。その新しい値が caption 要素でなければ、HIERARCHY_REQUEST_ERR 例外を投げます。

caption = table . createCaption()

テーブルが caption 要素を持つ状態にして、その caption 要素を返します。

table . deleteCaption()

テーブルが caption 要素を持たない状態にします。

table . tHead [ = value ]

テーブルの thead 要素を返します。

thead 要素を置き換えるために、値をセットすることができます。その新しい値が thead 要素でなければ、HIERARCHY_REQUEST_ERR 例外を投げます。

thead = table . createTHead()

テーブルが thead 要素を持つ状態にして、その thead 要素を返します。

table . deleteTHead()

テーブルが thead 要素を持たない状態にします。

table . tFoot [ = value ]

テーブルの tfoot 要素を返します。

tfoot 要素を置き換えるために、値をセットすることができます。新しい値が tfoot 要素でなければ、HIERARCHY_REQUEST_ERR 例外を投げます。

tfoot = table . createTFoot()

テーブルが tfoot 要素を持つ状態にして、その tfoot 要素を返します。

table . deleteTFoot()

テーブルが tfoot 要素を持たない状態にします。

table . tBodies

テーブルの tbody 要素の HTMLCollection を返します。

tbody = table . createTBody()

tbody 要素を生成し、テーブル内にそれを挿入します。そして、それを返します。

table . rows

テーブルの tr 要素の HTMLCollection を返します。

tr = table . insertRow(index)

tr 要素を生成します。必要に応じて tbody も生成します。そして、引数に指定された位置にその tr 要素を挿入します。

この位置はテーブルの中にある行に対応します。indexが -1 の場合は、表の最後に挿入されることになります。

指定の位置が -1 より小さかったり行数より大きかった場合は、INDEX_SIZE_ERR 例外を投げます。

table . deleteRow(index)

テーブルの中の指定位置にある tr 要素を削除します。

この位置は表の中にある行に対応します。index が -1 の場合は、表の最後の行が削除されることになります。

指定された位置が -1 より小さかったり最後の行の index より大きかった場合は、INDEX_SIZE_ERR 例外を投げます。

caption IDL 属性は、取得時においては、table 要素の子要素に caption 要素があれば、そのうち最初の caption 要素を返さなければいけません。なければ null を返さなければいけません。セットの際には、新しい値が caption 要素であれば、もし table 要素の子要素に caption 要素があった場合、その最初の caption 要素を削除し、新しい値を table 要素の最初の要素として挿入しなければいけません。新しい値が caption 要素でなければ、代わりに HIERARCHY_REQUEST_ERR DOM 例外が発出されなければいけません。

createCaption() メソッドは、table 要素の子要素に caption 要素があれば、その最初の caption 要素を返さなければいけません。そうでなければ、新しい caption 要素を生成し、table 要素の最初のノードとして挿入し、それを返さなければいけません。

deleteCaption() メソッドは、table 要素の子要素に caption 要素があれば、その最初の caption 要素を削除しなければいけません。

tHead IDL 属性は、取得時においては、table 要素の子要素に thead 要素があれば、その最初の thead 要素を返さなければいけません。なければ null を返さなければいけません。セット時においては、新しい値が thead 要素であれば、もし table 要素の子要素に thead 要素があれば、その最初の thead 要素を削除してから、そして、新しい値が、caption 要素または colgroup 要素のいずれでもない要素が table 要素内にあれば、その最初の要素の直前に挿入されなければいけません。なければ、table 要素の最後に挿入されなければいけません。新しい値が thead 要素でなければ、代わりに HIERARCHY_REQUEST_ERR DOM例外が発出されなければいけません。

createTHead() メソッドは、table 要素の子要素に thead 要素があれば、その最初の thead 要素を返さなければいけません。なければ、新しい thead 要素を生成し、table 要素に caption 要素や colgroup 要素のいずれでもない要素があれば、その最初の要素の直前にそれを挿入しなければいけません。なければ、table 要素の最後に挿入しなければいけません。そして、それを返さなければいけません。

deleteTHead() メソッドは、table 要素の子要素に thead 要素があれば、その最初の thead 要素を削除しなければいけません。

tFoot IDL 属性は、取得時においては、table 要素の子要素に tfoot 要素があれば、その最初の tfoot 要素を返さなければいけません。なければ null を返さなければいけません。セット時においては、新しい値が tfoot 要素であれば、table 要素の子要素に tfoot 要素があれば、その最初の tfoot 要素を削除しなければいけません。そして、新しい値を、table 要素に caption 要素または colgroup 要素または thead 要素のいずれでもない要素があれば、その最初の要素の直前にそれを挿入しなければいけません。そのような要素がなければ、table 要素の最後にそれを挿入しなければいけません。新しい値が tfoot 要素でなければ、代わりに HIERARCHY_REQUEST_ERR DOM 例外を発出しなければいけません。

createTFoot() メソッドは、table 要素の子要素に tfoot 要素があれば、その最初の tfoot 要素を返さなければいけません。なければ、新しい tfoot 要素を生成し、table 要素に caption 要素または colgroup 要素または thead 要素のいずれでもない要素があれば、その最初の要素の直前にそれを挿入しなければいけません。そのような要素がなければ、table 要素の最後に挿入しなければいけません。そして、その新しい要素を返さなければいけません。

deleteTFoot() メソッドは、table 要素の子要素に tfoot 要素があれば、その最初の tfoot 要素を削除しなければいけません。

tBodies 属性は、table ノードをルートとした HTMLCollection を返さなければいけません。そのフィルターは、table 要素の子要素である tbody 要素だけに一致します。

createTBody() メソッドは、新しい tbody 要素を生成し、table 要素に tbody 要素があれば、その最後の tbody 要素の直後にそれを挿入しなければいけません。table 要素に tbody が一つもなければ、table 要素の最後にそれを挿入しなければいけません。そして、新しい tbody 要素を返さなければいけません。

rows 属性は、table ノードをルートとした HTMLCollection を返さなければいけません。そのフィルターは、table 要素の子要素または、table 要素の子要素である thead, tbody, tfoot 要素の子要素のいずれかとなる tr 要素だけに一致します。この HTMLCollection にある要素は、まず、親が thead 要素となる要素がツリー順に並び、次に、親が table 要素または tbody のいずれかとなる要素がツリー順に続き、最後に、親が tfoot 要素となる要素がツリー順に続くという順番としなければいけません。

insertRow(index) メソッドの挙動は、テーブルの状態に依存します。このメソッドは、呼び出されたとき、テーブルの状態と引数 index を説明した次の条件のリストから最初に一致する項目で要求されているように動作しなければいけません:

index が -1 より小さい、または、rows コレクションの要素数より大きい場合:
このメソッドは、INDEX_SIZE_ERR 例外を発出しなければいけません。
rows コレクションの要素数が 0 で、かつ、table 要素に tbody 要素がない場合:
このメソッドは、tbody 要素を生成し、次に、tr 要素を生成し、その次に、その tbody 要素にその tr 要素を追加し、それから table 要素にその tbody を追加し、最後にその tr 要素を返さなければいけません。
rows コレクションの要素数が 0 の場合:
このメソッドは、tr 要素を生成し、最後の tbody 要素にそれを追加してから、その tr 要素を返さなければいけません。
index が指定されない、または、-1 に等しい、または、rows コレクションの要素数に等しい場合:
このメソッドは、tr 要素を生成し、rows コレクションの最後の tr 要素の親にそれを追加しなければいけません。それから、新しく生成された tr 要素を返さなければいけません。
そうでなければ:
このメソッドは、tr 要素を生成し、rows コレクションの tr 要素のうち、index 番目の tr 要素の直前で、親が同じとなる位置に、それを挿入し、最後に、新しく生成した tr 要素を返さなければいけません。

deleteRow(index) メソッドが呼び出されたら、ユーザーエージェントは、次の手順に従わなければいけません:

  1. index が -1 に等しければ、indexrows コレクションの項目数から 1 を引いた数字にセットされなければいけません。

  2. 今なお、index が 0 より小さい、または、rows コレクションの要素数に等しいかそれより大きいなら、このメソッドは、INDEX_SIZE_ERR 例外を発出し、この手順を中止しなければいけません。

  3. そうでなければ、このメソッドは、その親要素から、rows コレクションの要素のうち、index 番目の要素を削除しなければいけません。

summary IDL 属性は、同じ名前のコンテンツ属性を反映しなければいけません。


※ 原文:http://www.w3.org/TR/2010/WD-html5-20100624/tabular-data.html#the-table-element