• HTMLの表はth要素とscope属性で見出しとデータを対応させる

HTMLの表はth要素とscope属性で見出しとデータを対応させる

公開日: 執筆:佐藤

HTMLでデータを表にするときは、見出しセルをth要素、データセルをtd要素で記述します。列見出しにはscope="col"、行見出しにはscope="row"を指定し、見出しがどのデータに対応するかを示します。

太字や背景色だけで見出しらしく見せても、HTML上は見出しになりません。表の見た目と、セル同士の関係は分けて作ります。

th要素は見出しをtd要素はデータを表す

HTML 4.01の表の仕様は、TH要素を見出し情報のセル、TD要素をデータのセルと定義しています。ブラウザがthを太字や中央寄せで表示することがありますが、表示の違いは本来の役割ではありません。

次の書き方では、先頭行のセルをすべてtd要素にしています。

<table>
  <tr>
    <td>行見出し</td>
    <td>列A</td>
    <td>列B</td>
  </tr>
  <tr>
    <td>行A</td>
    <td>データA1</td>
    <td>データA2</td>
  </tr>
</table>

CSSで先頭行を太字にしても、各セルはデータのままです。見出しとして働くセルをth要素へ変更します。

scope属性は見出しが対応する方向を示す

先頭行が列見出し、先頭列が行見出しとなる単純な表は、次のように記述できます。このコードは、構造を説明するための模式例です。

<table>
  <tr>
    <th scope="col">行見出し</th>
    <th scope="col">列A</th>
    <th scope="col">列B</th>
  </tr>
  <tr>
    <th scope="row">行A</th>
    <td>データA1</td>
    <td>データA2</td>
  </tr>
  <tr>
    <th scope="row">行B</th>
    <td>データB1</td>
    <td>データB2</td>
  </tr>
</table>

scope="col"は、そのセルが同じ列の見出しであることを示します。scope="row"は、そのセルが同じ行の見出しであることを示します。たとえば「データA2」には、列見出しの「列B」と行見出しの「行A」が対応します。

WCAG 2.0の実装方法H63は、scope属性の値としてrow、col、rowgroup、colgroupを挙げています。単純な表では、まずrowとcolで、各見出しの方向を明示します。

H63は、見出しが先頭行か先頭列にある単純な表では、th要素だけでも十分と説明しています。それでもscopeを付ければ、見出しが行と列のどちらへ対応するかをHTMLに直接記述できます。表示位置から推測させず、役割を明示するために使います。

thead要素はth要素の代わりにならない

thead要素は、表の見出し部分となる行をまとめます。th要素は、個々のセルが見出しであることを示します。名前は似ていますが、役割は別です。

先頭行をthead要素へ入れても、その中のセルがtd要素なら、セル自体はデータです。列見出しとなるセルにはth scope="col"を使います。tbody要素へ入れた行でも、先頭セルが行見出しならth scope="row"を使えます。

caption要素は表全体の題名を示す

caption要素は、表全体の内容を短く示す題名です。th要素は、行や列にある個々のデータの見出しです。表に題名を付けても、各データと見出しの対応までは示せません。

<table>
  <caption>表の内容を示す題名</caption>
  <tr>
    <th scope="col">項目</th>
    <th scope="col">値</th>
  </tr>
  <tr>
    <th scope="row">項目A</th>
    <td>値A</td>
  </tr>
</table>

表全体にはcaption、列と行の見出しにはthとscopeを使い、役割を重ねません。

複数階層の見出しではid属性とheaders属性を使う

一つのデータセルに複数の列見出しや行見出しが対応する表では、scopeだけで関係を示しにくくなります。WCAG 2.0の実装方法H43は、見出しセルへ固有のid属性を付け、データセルのheaders属性へ対応する見出しのidを列挙する方法を示しています。

複雑な表を見つけたら、先に表を分割できないか検討します。分割すると意味が失われる場合は、idとheadersを使い、各データセルに対応する見出しを一つずつ指定します。同じidをページ内で重複させてはいけません。

レイアウト用の表へ見出しの関係を付けない

表は、行と列の交点に意味があるデータへ使います。ページを左右に分けるためのレイアウトへtable要素を使い、thやscopeを付けても、意味のない見出し関係を作るだけです。HTML 4.01も、文書の配置だけを目的に表を使わず、スタイルシートで配置するよう勧めています。

WCAG 2.0の達成基準1.3.1は、表示によって伝えている情報、構造、関係を、プログラムが解釈できる形にするか、テキストで提供するよう求めています。データ表では、罫線や背景色だけに頼らず、th、td、scopeで関係を記述します。

まず、一つの表について、各セルが列見出し、行見出し、データのどれかを決めてください。見出しをth要素へ直し、列にはscope="col"、行にはscope="row"を指定します。次に、ブラウザへ出力されたHTMLで、すべてのthに意図したscopeがあるかを確認します。

戻る