メインコンテンツへスキップ

tbody要素


1.仕様

TBODY要素は、
表(テーブル)の
行グループ(本体)を
表します。

tbody

行グループ(データの本体) (table body)

種類

通常要素

カテゴリ

なし

使用できるコンテキスト
table要素の子であるthead要素の後

table要素の子であるthead要素の後のコンテンツとして、使用できます。

table要素の子として、caption, colgroup および thead要素の後にありますが、table要素の子である tr要素がない場合に限ります。

コンテンツモデル
0個以上のtr要素 オプションでスクリプトをサポートする要素が混在

0個以上のtr要素が配置できます。オプションで、スクリプトをサポートする要素を混在して配置できます。

スクリプトをサポートする要素に分類される要素は、script要素, template要素 です。

タグの省略
どちらのタグも省略できます。

tbody要素の開始タグは、tbody要素内の最初の要素が tr要素であり、終了タグが省略された tbody, thead または tfoot要素が要素の直前にない場合に省略できます。 (要素が空の場合は省略できません。)

tbody要素の直後に tbody要素または tfoot要素が続く場合、または親要素にそれ以上のコンテンツがない場合は、tbody要素の終了タグを省略できます。

コンテンツ属性

グローバル属性のみ

DOM インターフェイス
HTMLTableSectionElement
  1. [Exposed=Window]
  2. interface HTMLTableSectionElement : HTMLElement {
  3. [HTMLConstructor] constructor();
  4.  
  5. [SameObject] readonly attribute HTMLCollection rows;
  6. HTMLTableRowElement insertRow(optional long index = -1);
  7. [CEReactions] undefined deleteRow(long index);
  8.  
  9. // also has obsolete members
  10. };
HTMLElement
  1. [Exposed=Window]
  2. interface HTMLElement : Element {
  3. [HTMLConstructor] constructor();
  4.  
  5. // metadata attributes
  6. [CEReactions] attribute DOMString title;
  7. [CEReactions] attribute DOMString lang;
  8. [CEReactions] attribute boolean translate;
  9. [CEReactions] attribute DOMString dir;
  10.  
  11. // user interaction
  12. [CEReactions] attribute (boolean or unrestricted double or DOMString)? hidden;
  13. [CEReactions] attribute DOMString inert;
  14. undefined click();
  15. [CEReactions] attribute DOMString accessKey;
  16. readonly attribute DOMString accessKeyLabel;
  17. [CEReactions] attribute boolean draggable;
  18. [CEReactions] attribute boolean spellcheck;
  19. [CEReactions] attribute DOMString writingSuggestions;
  20. [CEReactions] attribute DOMString autocapitalize;
  21.  
  22. [CEReactions] attribute [LegacyNullToEmptyString] DOMString innerText;
  23. [CEReactions] attribute [LegacyNullToEmptyString] DOMString outerText;
  24.  
  25. ElementInternals attachInternals();
  26.  
  27. // The popover API
  28. undefined showPopover();
  29. undefined hidePopover();
  30. boolean togglePopover(optional boolean force);
  31. [CEReactions] attribute DOMString? popover;
  32. };
  33.  
  34. HTMLElement includes GlobalEventHandlers;
  35. HTMLElement includes ElementContentEditable;
  36. HTMLElement includes HTMLOrSVGElement;
Element
  1. [Exposed=Window]
  2. interface Element : Node {
  3. readonly attribute DOMString? namespaceURI;
  4. readonly attribute DOMString? prefix;
  5. readonly attribute DOMString localName;
  6. readonly attribute DOMString tagName;
  7.  
  8. [CEReactions] attribute DOMString id;
  9. [CEReactions] attribute DOMString className;
  10. [SameObject, PutForwards=value] readonly attribute DOMTokenList classList;
  11. [CEReactions, Unscopable] attribute DOMString slot;
  12.  
  13. boolean hasAttributes();
  14. [SameObject] readonly attribute NamedNodeMap attributes;
  15. sequence<DOMString> getAttributeNames();
  16. DOMString? getAttribute(DOMString qualifiedName);
  17. DOMString? getAttributeNS(DOMString? namespace, DOMString localName);
  18. [CEReactions] undefined setAttribute(DOMString qualifiedName, DOMString value);
  19. [CEReactions] undefined setAttributeNS(DOMString? namespace, DOMString qualifiedName, DOMString value);
  20. [CEReactions] undefined removeAttribute(DOMString qualifiedName);
  21. [CEReactions] undefined removeAttributeNS(DOMString? namespace, DOMString localName);
  22. [CEReactions] boolean toggleAttribute(DOMString qualifiedName, optional boolean force);
  23. boolean hasAttribute(DOMString qualifiedName);
  24. boolean hasAttributeNS(DOMString? namespace, DOMString localName);
  25.  
  26. Attr? getAttributeNode(DOMString qualifiedName);
  27. Attr? getAttributeNodeNS(DOMString? namespace, DOMString localName);
  28. [CEReactions] Attr? setAttributeNode(Attr attr);
  29. [CEReactions] Attr? setAttributeNodeNS(Attr attr);
  30. [CEReactions] Attr removeAttributeNode(Attr attr);
  31.  
  32. ShadowRoot attachShadow(ShadowRootInit init);
  33. readonly attribute ShadowRoot? shadowRoot;
  34.  
  35. Element? closest(DOMString selectors);
  36. boolean matches(DOMString selectors);
  37. boolean webkitMatchesSelector(DOMString selectors); // legacy alias of .matches
  38.  
  39. HTMLCollection getElementsByTagName(DOMString qualifiedName);
  40. HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
  41. HTMLCollection getElementsByClassName(DOMString classNames);
  42.  
  43. [CEReactions] Element? insertAdjacentElement(DOMString where, Element element); // legacy
  44. undefined insertAdjacentText(DOMString where, DOMString data); // legacy
  45. };
GlobalEventHandlers
  1. interface mixin GlobalEventHandlers {
  2. attribute EventHandler onabort;
  3. attribute EventHandler onauxclick;
  4. attribute EventHandler onbeforeinput;
  5. attribute EventHandler onbeforematch;
  6. attribute EventHandler onbeforetoggle;
  7. attribute EventHandler onblur;
  8. attribute EventHandler oncancel;
  9. attribute EventHandler oncanplay;
  10. attribute EventHandler oncanplaythrough;
  11. attribute EventHandler onchange;
  12. attribute EventHandler onclick;
  13. attribute EventHandler onclose;
  14. attribute EventHandler oncontextlost;
  15. attribute EventHandler oncontextmenu;
  16. attribute EventHandler oncontextrestored;
  17. attribute EventHandler oncopy;
  18. attribute EventHandler oncuechange;
  19. attribute EventHandler oncut;
  20. attribute EventHandler ondblclick;
  21. attribute EventHandler ondrag;
  22. attribute EventHandler ondragend;
  23. attribute EventHandler ondragenter;
  24. attribute EventHandler ondragleave;
  25. attribute EventHandler ondragover;
  26. attribute EventHandler ondragstart;
  27. attribute EventHandler ondrop;
  28. attribute EventHandler ondurationchange;
  29. attribute EventHandler onemptied;
  30. attribute EventHandler onended;
  31. attribute OnErrorEventHandler onerror;
  32. attribute EventHandler onfocus;
  33. attribute EventHandler onformdata;
  34. attribute EventHandler oninput;
  35. attribute EventHandler oninvalid;
  36. attribute EventHandler onkeydown;
  37. attribute EventHandler onkeypress;
  38. attribute EventHandler onkeyup;
  39. attribute EventHandler onload;
  40. attribute EventHandler onloadeddata;
  41. attribute EventHandler onloadedmetadata;
  42. attribute EventHandler onloadstart;
  43. attribute EventHandler onmousedown;
  44. [LegacyLenientThis] attribute EventHandler onmouseenter;
  45. [LegacyLenientThis] attribute EventHandler onmouseleave;
  46. attribute EventHandler onmousemove;
  47. attribute EventHandler onmouseout;
  48. attribute EventHandler onmouseover;
  49. attribute EventHandler onmouseup;
  50. attribute EventHandler onpaste;
  51. attribute EventHandler onpause;
  52. attribute EventHandler onplay;
  53. attribute EventHandler onplaying;
  54. attribute EventHandler onprogress;
  55. attribute EventHandler onratechange;
  56. attribute EventHandler onreset;
  57. attribute EventHandler onresize;
  58. attribute EventHandler onscroll;
  59. attribute EventHandler onscrollend;
  60. attribute EventHandler onsecuritypolicyviolation;
  61. attribute EventHandler onseeked;
  62. attribute EventHandler onseeking;
  63. attribute EventHandler onselect;
  64. attribute EventHandler onslotchange;
  65. attribute EventHandler onstalled;
  66. attribute EventHandler onsubmit;
  67. attribute EventHandler onsuspend;
  68. attribute EventHandler ontimeupdate;
  69. attribute EventHandler ontoggle;
  70. attribute EventHandler onvolumechange;
  71. attribute EventHandler onwaiting;
  72. attribute EventHandler onwebkitanimationend;
  73. attribute EventHandler onwebkitanimationiteration;
  74. attribute EventHandler onwebkitanimationstart;
  75. attribute EventHandler onwebkittransitionend;
  76. attribute EventHandler onwheel;
  77. };
ElementContentEditable
  1. interface mixin ElementContentEditable {
  2. [CEReactions] attribute DOMString contentEditable;
  3. [CEReactions] attribute DOMString enterKeyHint;
  4. readonly attribute boolean isContentEditable;
  5. [CEReactions] attribute DOMString inputMode;
  6. };
HTMLOrSVGElement
  1. interface mixin HTMLOrSVGElement {
  2. [SameObject] readonly attribute DOMStringMap dataset;
  3. attribute DOMString nonce; // intentionally no [CEReactions]
  4.  
  5. [CEReactions] attribute boolean autofocus;
  6. [CEReactions] attribute long tabIndex;
  7. undefined focus(optional FocusOptions options = {});
  8. undefined blur();
  9. };
ARIA in HTML
暗黙的="rowgroup" ARIAロール="任意" aria-* 属性="GlobalAny"

暗黙的な ARIAセマンティクスは、role=rowgroup です。

要素で任意の role 値を使用できます。ただし、作成者が要素の暗黙的なロール, 汎用ロール, または ARIA によって非推奨となったロールをこれらの要素に対して指定することは推奨されません。

グローバル aria-* 属性と、許可されたロールに適用される任意の aria-* 属性が記述できます。

レンダリング
ブロックボックス
テーブル
  1. tbody {
  2. display: table-row-group;
  3. border-color: inherit;
  4. vertical-align: middle;
  5. unicode-bidi: isolate;
  6. }
  7. tbody[hidden] {
  8. display: table-row-group;
  9. visibility: collapse;
  10. }
  11. tbody[align=absmiddle i] { text-align: center; }
  12. tbody[valign=top i] { vertical-align: top; }
  13. tbody[valign=middle i] { vertical-align: middle; }
  14. tbody[valign=bottom i] { vertical-align: bottom; }
  15. tbody[valign=baseline i] { vertical-align: baseline; }
  16. table[rules=groups i] > tbody {
  17. border-block-width: 1px;
  18. border-block-style: solid;
  19. }

CSS を大雑把に読むと、 表組版コンテキストに参加する適切な内部テーブルボックス(テーブルトラックグループボックス)を生成する。 などになります。

説明
tbody要素は、行グループ(データの本体)を表します。

tbody要素は、表(テーブル・table)の行グループ(本体)を表します。

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>tbody要素の例 - (Example of tbody element) | 離珠のHTMLでしぃ!</title>
  6. </head>
  7. <body>
  8. <h1>tbody要素の例</h1>
  9. <table>
  10. <caption>tbody要素の例</caption>
  11. <colgroup>
  12. <col>
  13. <col>
  14. <col>
  15. </colgroup>
  16. <thead>
  17. <tr>
  18. <th>id</th>
  19. <th>name</th>
  20. <th>data</th>
  21. </tr>
  22. </thead>
  23. <tbody>
  24. <tr>
  25. <td>10</td>
  26. <th>name01</th>
  27. <td>data01</td>
  28. </tr>
  29. <tr>
  30. <td>20</td>
  31. <th>name02</th>
  32. <td>data02</td>
  33. </tr>
  34. </tbody>
  35. <tbody>
  36. <tr>
  37. <td>55</td>
  38. <th>name55</th>
  39. <td>data55</td>
  40. </tr>
  41. <tr>
  42. <td>57</td>
  43. <th>name57</th>
  44. <td>data57</td>
  45. </tr>
  46. <tr>
  47. <td>59</td>
  48. <th>name59</th>
  49. <td>data59</td>
  50. </tr>
  51. </tbody>
  52. <tfoot>
  53. <tr>
  54. <td>-</td>
  55. <th>total</th>
  56. <td>data99</td>
  57. </tr>
  58. </tfoot>
  59. </table>
  60. </body>
  61. </html>

このサンプルへのリンクです。
(./extbody.htm)

JSONデータ
JSON形式での、データのイメージです。
  1. {
  2. "tbody": {
  3. "check": "2024-09-01",
  4. "group": "Table",
  5. "element": "O O (tr)* +(%Scriptsupporting) -- table body. (Normal elements.) [None] --",
  6. "attlist": {"%Global;": ""},
  7. "comment": "行グループ(データの本体) (table body)",
  8. "point": "行グループ(データの本体)を表します。",
  9. "description": "表(テーブル・table)の行グループ(本体)を表します。",
  10. "kind": "Normal",
  11. "categories": "None",
  12. "used": "table (caption?,colgroup*,thead?,tbody*,tfoot?)",
  13. "usedsupplement": "table要素の子として、caption, colgroup および thead要素の後にありますが、table要素の子である tr要素がない場合に限ります。",
  14. "contentmodel": "tbody (tr)* +(%Scriptsupporting)",
  15. "tag": [
  16. "O",
  17. "O",
  18. ],
  19. "tagsupplement": [
  20. "tbody要素の開始タグは、tbody要素内の最初の要素が tr要素であり、終了タグが省略された tbody, thead または tfoot要素が要素の直前にない場合に省略できます。 (要素が空の場合は省略できません。)",
  21. "tbody要素の直後に tbody要素または tfoot要素が続く場合、または親要素にそれ以上のコンテンツがない場合は、tbody要素の終了タグを省略できます。",
  22. ],
  23. "attributes": "Global",
  24. "dominterface": "HTMLTableSectionElement",
  25. "rendering": [
  26. "Tables",
  27. "Bidirectional",
  28. ],
  29. "reference": [
  30. {
  31. "title": "HTML Living Standard. 4.9.5 The tbody element.",
  32. "href": "https://html.spec.whatwg.org/multipage/tables.html#the-tbody-element",
  33. "heading": "HTML Living Standard. 4.9.5 The tbody element",
  34. "sub": "Last Updated 27 August 2024",
  35. },
  36. {
  37. "title": "HTML Living Standard. 15 Rendering 15.3.8 Tables.",
  38. "href": "https://html.spec.whatwg.org/multipage/rendering.html#tables-2",
  39. "heading": "HTML Living Standard. 15 Rendering 15.3.8 Tables",
  40. "sub": "Last Updated 27 August 2024",
  41. },
  42. {
  43. "title": "HTML 5.2 W3C Recommendation. 4.9.5 The tbody element. W3C Recommendation, 14 December 2017.",
  44. "href": "https://www.w3.org/TR/2017/REC-html52-20171214/tabular-data.html#the-tbody-element",
  45. "heading": "HTML 5.2 W3C 勧告. 4.9.5 The tbody element",
  46. "sub": "W3C勧告、2017年12月14日",
  47. },
  48. {
  49. "title": "HTML 5.2 W3C Recommendation. 10.3.9. Tables.",
  50. "href": "https://www.w3.org/TR/2017/REC-html52-20171214/rendering.html#tables",
  51. "heading": "HTML 5.2 W3C 勧告. 10.3.9. Tables",
  52. "sub": "W3C勧告、2017年12月14日",
  53. },
  54. {
  55. "title": "HTML 5.1 W3C Recommendation. 4.9.5 The tbody element. W3C Recommendation, 1 November 2016.",
  56. "href": "https://www.w3.org/TR/2016/REC-html51-20161101/tabular-data.html#the-tbody-element",
  57. "heading": "HTML 5.1 W3C 勧告. 4.9.5 The tbody element",
  58. "sub": "W3C勧告、2016年11月1日",
  59. },
  60. {
  61. "title": "HTML 5.1 W3C Recommendation. 10.3.9. Tables. W3C Recommendation, 1 November 2016.",
  62. "href": "https://www.w3.org/TR/2016/REC-html51-20161101/rendering.html#tables",
  63. "heading": "HTML 5.1 W3C 勧告. 10.3.9. Tables",
  64. "sub": "W3C勧告、2016年11月1日",
  65. },
  66. {
  67. "title": "HTML 5 W3C Recommendation. 4.9.5 The tbody element. W3C Recommendation, 28 October 2014.",
  68. "href": "https://www.w3.org/TR/2014/REC-html5-20141028/tabular-data.html#the-tbody-element",
  69. "heading": "HTML 5 W3C 勧告. 4.9.5 The tbody element",
  70. "sub": "W3C勧告、2014年10月28日",
  71. },
  72. {
  73. "title": "HTML 5 W3C Recommendation. 10.3.9 Tables. W3C Recommendation, 28 October 2014.",
  74. "href": "https://www.w3.org/TR/2014/REC-html5-20141028/rendering.html#tables",
  75. "heading": "HTML 5 W3C 勧告. 10.3.9 Tables",
  76. "sub": "W3C勧告、2014年10月28日",
  77. },
  78. {
  79. "title": "HTML 4.01 Specification W3C Recommendation. 11.2.3 Row groups: the THEAD, TFOOT, and TBODY elements. W3C Recommendation 24 December 1999.",
  80. "href": "https://www.w3.org/TR/html401/struct/tables.html#h-11.2.3",
  81. "heading": "HTML 4.01 Specification W3C 勧告. 11.2.3 Row groups: the THEAD, TFOOT, and TBODY elements",
  82. "sub": "W3C勧告1999年12月24日",
  83. },
  84. {
  85. "title": "MDN Web Docs. HTML <tbody>: The Table Body element.",
  86. "href": "https://developer.mozilla.org/ja/docs/Web/HTML/Element/tbody",
  87. "heading": "<tbody>: テーブル本体要素 - HTML: ハイパーテキストマークアップ言語 | MDN",
  88. },
  89. ],
  90. "version": {
  91. "first": "HTML4",
  92. "latest": "HTML Living Standard",
  93. },
  94. }
  95. }

注意: 簡易に描画する為に、各項目の後ろに , を付与しています。JSON の形式では、末尾の項目の後には , は付けません。

最終確認日

2024-09-01


2.使用可能な箇所

table要素
配置できます。

tbody要素を使用できる状態(コンテキスト・Context)は、 table要素の子として、caption要素, colgroup要素, thead要素の後、tbody要素, の前に配置できます。ただし、table要素の子である他の tr要素がない場合に限ります。


3.配置できるコンテンツ

tr要素
スクリプトをサポートする要素
配置できます。

tbody要素(内容・コンテンツ・Content)として、0 以上の tr要素scriptコンテンツを配置できます。

scriptコンテンツである要素は、script要素, template要素 です。

table
caption
colgroup
thead
tbody
tfoot
Flow
col
tr
tr
tr
  1. <table>
  2. <caption>caption</caption>
  3. <colgroup>
  4. <col>
  5. <col>
  6. <col>
  7. </colgroup>
  8. <thead>
  9. <tr><th>id</th><th>name</th><th>data</th></tr>
  10. </thead>
  11. <tbody>
  12. <tr><td>10</td><th>name01</th><td>data01</td></tr>
  13. <tr><td>20</td><th>name02</th><td>data02</td></tr>
  14. </tbody>
  15. <tbody>
  16. <tr><td>55</td><th>name55</th><td>data55</td></tr>
  17. <tr><td>57</td><th>name57</th><td>data57</td></tr>
  18. <tr><td>59</td><th>name59</th><td>data59</td></tr>
  19. </tbody>
  20. <tfoot>
  21. <tr><td>-</th><th>total</th><td>data99</td></tr>
  22. </tfoot>
  23. </table>

colgroup要素のコンテンツの一部として、0個以上の col要素を配置できます。

ブロック
フォーマット
コンテキスト
テーブル
キャプション
ボックス
テーブル
フォーマット
コンテキスト
テーブル
トラック
グループ
ボックス
テーブル
トラック
ボックス
ブロック
コンテナ
ボックス

ボックスで表すと、table要素が存在して、その中に caption要素テーブルグリッドボックスがあります。

table要素は、ブロックレベルブロックコンテナであるボックス(テーブルラッパーボックス)を生成します。table要素を含むブロックフォーマットコンテキストがない場合は、新しいブロックフォーマットコンテキストを確立します。table要素は、ブロックレベルのボックスを生成するcaption要素を配置します。他の要素はテーブルグリッドボックス内に収めます。なのでここでは、インラインフォーマットコンテキストは確立されません。
尚、この説明は各要素のレンダリングに関する指定が既定値での話で、個々にスタイルを指定した場合はこの限りではありません。

tbody要素は、テーブルグリッドボックスによって確立されたテーブルフォーマットコンテキストに参加する テーブルトラックグループボックス(内部テーブルボックス)を生成します。


4.属性

グローバル属性のみ、
設定できます。

tbody要素は、グローバル属性のみ 設定できます。


5.Web API

table要素
tBodiesプロパティは、
テーブルの
tbody要素の集合を
返します。

table要素id属性を用いて documentgetElementById()メソッドで、要素を取得する方法がお勧めです。この時に取得できるのはHTMLTableElement オブジェクトです。そのプロパティである tBodiesプロパティが、テーブルのtbody要素の集合を表します。この時に取得できるのはHTMLCollection オブジェクトです。このインターフェイスは、要素の汎用的な集合(配列風のオブジェクト)を表し、リストから選択するためのメソッドとプロパティを提供します。


6.レンダリング

  1. tbody {
  2. display: table-row-group;
  3. vertical-align: middle;
  4. border-color: inherit;
  5. unicode-bidi: isolate;
  6. }

tbody要素は、テーブルフォーマットコンテキストに参加する適切な内部テーブルボックスを生成します。

caption
idnamedata
10name01data01
20name02data02
55name55data55
57name57data57
59name59data59
-totaldata99
  1. <table style="border-collapse: ;
    border-spacing: px; border: ;">
  2. <caption style="caption-side: ;
    border-style: ;
    border-width: px;">caption</caption>
  3. <colgroup>
  4. <col>
  5. <col span="" style="background-color: #ffffcc; border: ;">
  6. </colgroup>
  7. <thead>
  8. <tr><th>id</th><th>name</th><th>data</th></tr>
  9. </thead>
  10. <tbody style="background-color: ;
    border-style: ;
    border-width: px;">
  11. <tr><td>10</td><th>name01</th><td>data01</td></tr>
  12. <tr><td>20</td><th>name02</th><td>data02</td></tr>
  13. </tbody>
  14. <tbody style="background-color: ;
    border-style: ;
    border-width: px;">
  15. <tr><td>55</td><th>name55</th><td>data55</td></tr>
  16. <tr><td>57</td><th>name57</th><td>data57</td></tr>
  17. <tr><td>59</td><th>name59</th><td>data59</td></tr>
  18. </tbody>
  19. <tfoot>
  20. <tr><td>-</th><th>total</th><td>data99</td></tr>
  21. </tfoot>
  22. </table>
  1. tbody:hover {
  2. background: #ffccff!important;
  3. }

tbody要素の装飾例です。例示で分かり易くする為に、別途にセルの境界線の装飾を指定できる様にしています。

とりあえず詰め込んだ例示なので、組み合わせによっては効果のない物もあります。またスクリプトにて動的に処理している為、指定する順番で効果が異なる可能性もあります。
実際に使用する場合は、動作確認を改めて行ってから採用して下さい。


7.気を付ける点

セルの境界

表(テーブル)のセル(Cell)は、境界の共有, 分離が指定できます。既定値は分離(セルが個別に境界線を持つ)です。 その上で、行(Row)に別途に境界を指定してもセルが境界を分離している状態では効果はありません。 というか、行は行で境界線を描画してセルはセルで境界線を描画するという事は無理の様です。

dl要素を用いたりして、疑似的に表(テーブル)の様に装飾しつつして描画できるとは思いますが、列の扱いが面倒です。

タグの省略

条件次第で tbody要素は、開始タグも終了タグも省略できます。なので逆にtr要素table要素の子要素としているのか tbody要素の子要素としているのか分かり難い事があります。なのでおまじないとしての習慣づけで良いのでtbody要素をタグを省略しないで必ず書く, 必要がなくてもtr要素table要素の子要素としないでtbody要素を明記する習慣をつけていた方が良いでしょう。スタイルシートなどで感覚的に分かり易いと思います。


8.付記