HTML / Element / Initial coverage

<tbody>要素

状態: 初期Coverage 対象: HTML Living Standard 仕様確認日: 2026-10-17

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

tbody要素の基本定義
項目仕様上の定義条件・範囲
意味表本体の行グループ見出しやfooterとは異なるbody部分の行をまとめる
配置先tableの子caption、colgroup、thead、表本体、tfootなど、親要素のcontent modelと順序に従う
content model0個以上のtrとscript-supporting elements空のtbodyもcontent model上は許される
開始タグ・終了タグHTML構文では条件付きで省略できる開始タグは、最初の内容がtrで、直前に終了タグを省略したtbody・thead・tfootがない場合に省略できる。終了タグは、次がtbodyまたはtfootの場合、または親要素に続く内容がない場合に省略できる
DOM interfaceHTMLTableSectionElementtheadと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

tbodyとtableから使う主なrow API
member戻り値・動作範囲・境界
tbody.rowssection直下のtrを含むHTMLCollection行の挿入や削除を反映するlive collection
table.tBodiestableの子であるtbodyを含むHTMLCollectionthead・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そのものではありません。

tbodyの主要Factと根拠位置
種別Fact / 主張条件・範囲状態根拠
SPECtbodyの親はtableで、content modelは0個以上のtrとscript-supporting elementsから成る。table child ordering、tag omission、global attributesを含む。仕様確認済みHTML Standard: the tbody element
SPECrow groupにまたがるcellは複数のrow groupのslotを占められず、rowspan="0"は同じrow groupの残り行までを対象とする。table grid、row group boundary、cell spanを扱う。仕様確認済みHTML Standard: forming a table
SPECtable内のtr tokenの前にparserは暗黙のtbodyを挿入する。table body内に直接現れたtd/thでは暗黙のtrを挿入してtokenを再処理する。HTML parserのrecovery規則と、適合するauthoring markupを分ける。仕様確認済みHTML Standard: in table / in table body
SPECHTML-AAMはtbodyをrowgroup roleへ対応付ける。規範的mappingと各browserのAccessibility tree、platform API観測を区別する。仕様確認済みHTML-AAM: tbody

Evidence

  1. HTML Standard: The tbody element — context, content model, tag omission, and section API
  2. HTML Standard: Forming a table — row groups, cell slots, and row-span boundaries
  3. HTML Standard: Table parsing modes — implied section and row insertion
  4. HTML Accessibility API Mappings: tbody — rowgroup role and platform mappings
  5. Web Platform Tests: the-tbody-element — section row collection and row methods
  6. Web Platform Tests: rowspan-0.html — row-span behavior at a row-group boundary

Implementation Evidence

仕様上の要求と、選定環境でのbrowser観測、WPT実行、Accessibility role queryを分けて記録します。各結果は記載したfixture・browser・テスト範囲に限られます。

tbodyのImplementation Evidence register
種別再現確認の範囲記録条件状態
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で扱います。