<tbody>要素
Technical Summary
tbodyはtableの子として表本体の行をまとめます。仕様上、tbody・thead・tfootが表のrow group(行グループ)を表し、グループ境界はtable modelとcell header associationに関係します。
HTML parserは、table内に直接書かれたtrの前へ暗黙のtbodyを挿入します。DOM APIではHTMLTableSectionElementのrows・insertRow()・deleteRow()からsection内の行を扱えます。
定義・配置・content model
| 項目 | 仕様上の定義 | 条件・範囲 |
|---|---|---|
| 意味 | 表本体の行グループ | 見出しやfooterとは異なるbody部分の行をまとめる |
| 配置先 | tableの子 | caption、colgroup、thead、表本体、tfootなど、親要素のcontent modelと順序に従う |
| content model | 0個以上のtrとscript-supporting elements | 空のtbodyもcontent model上は許される |
| 開始タグ・終了タグ | HTML構文では条件付きで省略できる | 開始タグは、最初の内容がtrで、直前に終了タグを省略したtbody・thead・tfootがない場合に省略できる。終了タグは、次がtbodyまたはtfootの場合、または親要素に続く内容がない場合に省略できる |
| DOM interface | HTMLTableSectionElement | theadとtfootも同じinterfaceを使う |
| 固有属性 | 定義なし | global attributesを利用できる |
表本体は、0個以上のtbodyで表す方法か、1個以上のtrで表す方法がcontent modelにあります。一方、HTML parserでtable直下にtr tokenが現れると、DOMにはtbodyが補われます。HTMLソースの適合性と、parserがDOMを構築・回復する手順は別の規則です。
行グループとtable model
row groupはtable grid上で行をまとめる単位です。1つのcellは複数のrow groupにまたがることができません。そのためrowspan="0"は、cellが属するrow groupの残りの行に広がり、次のtbodyへは続きません。
| 要素 | 一般的な役割 | table model上の区分 |
|---|---|---|
thead | 列の見出しを含む部分 | row group |
tbody | 表本体の行を含む部分 | row group。複数置ける |
tfoot | 合計などのfooter行を含む部分 | row group |
CSSの表示順や見た目だけからDOMの行グループを推定せず、実際の親要素とtable modelを確認します。row groupの区別は、th scope="rowgroup"の適用範囲や支援技術への構造公開にも関わります。
parserが作るDOM
<table id="items">
<tr><td>りんご</td></tr>
</table>
// HTML parserが構築するDOM
table#items
└─ tbody (暗黙に挿入)
└─ tr
└─ td
table insertion modeでtrが直接現れた場合、parserは属性のないtbody要素を挿入してからtokenを再処理します。また、table body insertion modeでtdまたはthが直接現れる不正なmarkupでは、parse errorとして属性のないtrを挿入し、そのcell tokenを再処理します。これらはparser recoveryの挙動であり、作成するHTMLで依存すべき記法ではありません。
HTMLTableSectionElement API
| member | 戻り値・動作 | 範囲・境界 |
|---|---|---|
tbody.rows | section直下のtrを含むHTMLCollection | 行の挿入や削除を反映するlive collection |
table.tBodies | tableの子であるtbodyを含むHTMLCollection | thead・tfootや入れ子table内のtbodyは含めない |
tbody.insertRow(index) | 新しいtrを作ってsectionに挿入する | -1は末尾。範囲外indexはIndexSizeError |
tbody.deleteRow(index) | sectionから指定したtrを削除する | -1は最後の行。行がない場合などの境界はindex規則に従う |
const table = document.querySelector("table");
const body = table.tBodies[0];
body.rows.length; // このtbody内の行数
body.insertRow(-1); // このtbodyの末尾に行を追加
body.deleteRow(-1); // このtbodyの最後の行を削除
tbody.rowsはそのsectionの行を返します。table.rowsはtable全体の行collectionです。どちらも似た名前ですが、対象にする範囲が異なります。
Accessibility mapping
HTML-AAMはnative tbodyにWAI-ARIAのrowgroup roleを対応付けます。これはtable内の行をまとめる構造であり、表示される見出し文字列ではありません。実際のbrowser Accessibility treeやplatform APIに現れる結果は、OS・browser・table構造などの条件を記録して観測します。
Fact / Evidence(主張 / 根拠)
仕様上の主張と実装の測定結果を別々に記録します。browserのrole queryはHTML-AAMの規範的mappingやplatform Accessibility APIそのものではありません。
| 種別 | Fact / 主張 | 条件・範囲 | 状態 | 根拠 |
|---|---|---|---|---|
| SPEC | tbodyの親はtableで、content modelは0個以上のtrとscript-supporting elementsから成る。 | table child ordering、tag omission、global attributesを含む。 | 仕様確認済み | HTML Standard: the tbody element |
| SPEC | row groupにまたがるcellは複数のrow groupのslotを占められず、rowspan="0"は同じrow groupの残り行までを対象とする。 | table grid、row group boundary、cell spanを扱う。 | 仕様確認済み | HTML Standard: forming a table |
| SPEC | table内のtr tokenの前にparserは暗黙のtbodyを挿入する。table body内に直接現れたtd/thでは暗黙のtrを挿入してtokenを再処理する。 | HTML parserのrecovery規則と、適合するauthoring markupを分ける。 | 仕様確認済み | HTML Standard: in table / in table body |
| SPEC | HTML-AAMはtbodyをrowgroup roleへ対応付ける。 | 規範的mappingと各browserのAccessibility tree、platform API観測を区別する。 | 仕様確認済み | HTML-AAM: tbody |
Evidence
- HTML Standard: The
tbodyelement — context, content model, tag omission, and section API - HTML Standard: Forming a table — row groups, cell slots, and row-span boundaries
- HTML Standard: Table parsing modes — implied section and row insertion
- HTML Accessibility API Mappings:
tbody—rowgrouprole and platform mappings - Web Platform Tests:
the-tbody-element— section row collection and row methods - Web Platform Tests:
rowspan-0.html— row-span behavior at a row-group boundary
Implementation Evidence
仕様上の要求と、選定環境でのbrowser観測、WPT実行、Accessibility role queryを分けて記録します。各結果は記載したfixture・browser・テスト範囲に限られます。
| 種別 | 再現確認の範囲 | 記録条件 | 状態 |
|---|---|---|---|
| IMPL | HTMLTableSectionElement、tbody.rows / table.tBodies、insertRow() / deleteRow()、createTBody()、parserが補うtbody / tr、rowspan=0のrow group境界 |
2026-10-17 JST / Chrome UA 155.0.0.0(Windows NT 10.0 UA)/ viewport 1280×720 / navigator.language=ja。build-config/yugien/research-results/tbody-v1/をloopback 127.0.0.1:4197で表示し、fixture checks 13/13 pass。section interfaceとlive row collection、table.tBodiesの範囲、parserによる暗黙section・row挿入、row APIの追加・削除・境界エラー、空sectionでのdeleteRow(-1)、createTBody()、rowspan group境界を確認。Chrome 1環境のみ。別browser、OS build、platform APIは未測定。 |
部分観測(Chrome 155 / fixture 13/13) |
| WPT | tbody.rows、insertRow() / deleteRow()、rowspan=0のrow group境界に関する選定WPT |
2026-10-17 JST / Chrome UA 155.0.0.0 / wpt.live。rows.html 1/1 pass、insertRow.html 6/6 pass、deleteRow.html 6/6 pass、rowspan-0.html 2/2 pass。合計15/15 pass。wpt.liveが配信した正確な上流revisionは固定できていない。選定外test、他browserは未実施。実測時のテスト版は未記録です。リンク先の内容は変わることがあり、当時と同じテストで再確認できるとは限りません。 |
一部のテストだけ実行(wpt.liveの版は未固定) |
| AAM | Chrome browser role queryによるnative table、row group、row、column header、row header、data cellの公開 | 2026-10-17 JST / Chrome UA 155.0.0.0(Windows NT 10.0 UA)/ viewport 1280×720 / navigator.language=ja。fixtureのnamed table Stock by groupをqueryし、table 1、rowgroup 4(thead、2つのtbody、tfoot)、row 6、columnheader 2、rowheader 5、cell 5を確認。browser role queryによる観測であり、HTML-AAMの規範的mapping以外にWindows UI Automationなどのplatform APIとスクリーンリーダー発話は未測定。 |
部分観測(Chrome 155 browser role query / 1環境) |
browserのrole・name queryはplatform Accessibility APIやスクリーンリーダーの発話と同じ測定ではありません。実施した層と未測定の範囲を分けて扱います。
Coverage / Open Issues
- 仕様確認済みcontent model、table内の順序、行グループ、table parser、HTMLTableSectionElement、HTML-AAM mapping
- 未完了実装観測は選定fixtureとbrowser 1環境に限る。HTML parserの全recovery経路と複数table構造は未網羅
- 未完了WPTは選定ファイルに限る。wpt.liveが配信した正確なupstream revisionと他browserの結果は未確認
- 未完了platform Accessibility API、Windows UI Automation、支援技術の読み上げ、他OS、Expert-gap Review
このTopicは初期Coverageです。選定した測定の成功は、すべてのHTML構造、browser、OS、支援技術で同じ結果になることを示しません。
関連Surface
初心者向けの例はYugienのtbody要素ページを参照してください。表全体のmodelはtable Topic、header row groupはthead Topic、summary row groupはtfoot Topic、行と行番号はtr Topic、row group headerとcell associationはth Topicとtd Topicで扱います。