同じ<tbody>
に複数の<table>
タグを含めることができますか?もしそうなら、どのようなシナリオで複数の<tbody>
タグを使うべきでしょうか?
はい、あなたはそれらを使用することができます、例えば、私はこのようにデータのグループをより簡単にスタイルするためにそれらを使用します:
thead th { width: 100px; border-bottom: solid 1px #ddd; font-weight: bold; }
tbody:nth-child(odd) { background: #f5f5f5; border: solid 1px #ddd; }
tbody:nth-child(even) { background: #e5e5e5; border: solid 1px #ddd; }
<table>
<thead>
<tr><th>Customer</th><th>Order</th><th>Month</th></tr>
</thead>
<tbody>
<tr><td>Customer 1</td><td>#1</td><td>January</td></tr>
<tr><td>Customer 1</td><td>#2</td><td>April</td></tr>
<tr><td>Customer 1</td><td>#3</td><td>March</td></tr>
</tbody>
<tbody>
<tr><td>Customer 2</td><td>#1</td><td>January</td></tr>
<tr><td>Customer 2</td><td>#2</td><td>April</td></tr>
<tr><td>Customer 2</td><td>#3</td><td>March</td></tr>
</tbody>
<tbody>
<tr><td>Customer 3</td><td>#1</td><td>January</td></tr>
<tr><td>Customer 3</td><td>#2</td><td>April</td></tr>
<tr><td>Customer 3</td><td>#3</td><td>March</td></tr>
</tbody>
</table>
ここで例を見ることができます 。これは新しいブラウザでしか動作しませんが、私の現在のアプリケーションでサポートしているのはJavaScriptなどのグループ化を使用できることです。主なことは、行を視覚的にグループ化してデータを読みやすくする便利な方法です。もちろん他の用途もありますが、適用可能な例としては、これが私にとって最も一般的なものです。
はい。 DTDから
<!ELEMENT table
(caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>
だからそれは1つ以上を期待しています。それはそれから言うことを続けます
テーブル行のグループ間で 規則 が必要な場合は、複数のtbodyセクションを使用します。
この例によれば、 w3-struct-tables とすることができます。
Martin Joinerの問題は、<caption>
タグの誤解が原因です。
<caption>
タグはテーブルキャプションを定義します。
<caption>
タグは、<table>
タグの最初の子である必要があります。
テーブルごとに1つのキャプションだけを指定できます。
また、scope
属性は<th>
要素ではなく<tr>
要素に配置する必要があります。
マルチヘッダーマルチボディテーブルを書くための正しい方法は、次のようになります。
<table id="dinner_table">
<caption>This is the only correct place to put a caption.</caption>
<tbody>
<tr class="header">
<th colspan="2" scope="col">First Half of Table (British Dinner)</th>
</tr>
<tr>
<th scope="row">1</th>
<td>Fish</td>
</tr>
<tr>
<th scope="row">2</th>
<td>Chips</td>
</tr>
<tr>
<th scope="row">3</th>
<td>Peas</td>
</tr>
<tr>
<th scope="row">4</th>
<td>Gravy</td>
</tr>
</tbody>
<tbody>
<tr class="header">
<th colspan="2" scope="col">Second Half of Table (Italian Dinner)</th>
</tr>
<tr>
<th scope="row">5</th>
<td>Pizza</td>
</tr>
<tr>
<th scope="row">6</th>
<td>Salad</td>
</tr>
<tr>
<th scope="row">7</th>
<td>Oil</td>
</tr>
<tr>
<th scope="row">8</th>
<td>Bread</td>
</tr>
</tbody>
</table>
はい。私はそれらをテーブルの関連部分を動的に隠したり明らかにしたりするために使います。コース。つまり.
<table>
<tbody id="day1" style="display:none">
<tr><td>session1</td><tr>
<tr><td>session2</td><tr>
</tbody>
<tbody id="day2">
<tr><td>session3</td><tr>
<tr><td>session4</td><tr>
</tbody>
<tbody id="day3" style="display:none">
<tr><td>session5</td><tr>
<tr><td>session6</td><tr>
</tbody>
</table>
多数の行を個別に処理せずにtbodiesを操作することによって、すべてを切り替えたり、今日だけを切り替えたりするためのボタンを提供できます。
編集:caption
タグはtableに属しているので、一度だけ存在するはずです。私のように、caption
を各tbody
要素に関連付けないでください。
<table>
<caption>First Half of Table (British Dinner)</caption>
<tbody>
<tr><th>1</th><td>Fish</td></tr>
<tr><th>2</th><td>Chips</td></tr>
<tr><th>3</th><td>Pease</td></tr>
<tr><th>4</th><td>Gravy</td></tr>
</tbody>
<caption>Second Half of Table (Italian Dinner)</caption>
<tbody>
<tr><th>5</th><td>Pizza</td></tr>
<tr><th>6</th><td>Salad</td></tr>
<tr><th>7</th><td>Oil</td></tr>
<tr><th>8</th><td>Bread</td></tr>
</tbody>
</table>
上の悪い例:コピーしないでください
このように書くことはcaption
タグの誤解を示すので、上の例はあなたが期待するようにレンダリングしません。標準に反することになるので、正しくレンダリングするにはたくさんのCSSハックが必要になります。
caption
タグでW3C標準を検索しましたが、テーブルごとにcaption
要素は1つだけでなければならないという明示的な規則を見つけることができませんでしたが、実際はそうです。
さらに、 W3CのHTML Validator を使用して、HTML5 DOCTYPEを使用して複数の<tbody>
タグを使用してHTML文書を実行すると、それは正常に検証されます。
私は JSFiddle を作成しました。ここで私はテーブルと共に2つの入れ子にされたng-repeatとtbodyの親ng-repeatを持っています。テーブルの行を調べると、6つのtbody要素、つまり親レベルがあります。
HTML
<div>
<table class="table table-hover table-condensed table-striped">
<thead>
<tr>
<th>Store ID</th>
<th>Name</th>
<th>Address</th>
<th>City</th>
<th>Cost</th>
<th>Sales</th>
<th>Revenue</th>
<th>Employees</th>
<th>Employees H-sum</th>
</tr>
</thead>
<tbody data-ng-repeat="storedata in storeDataModel.storedata">
<tr id="storedata.store.storeId" class="clickableRow" title="Click to toggle collapse/expand day summaries for this store." data-ng-click="selectTableRow($index, storedata.store.storeId)">
<td>{{storedata.store.storeId}}</td>
<td>{{storedata.store.storeName}}</td>
<td>{{storedata.store.storeAddress}}</td>
<td>{{storedata.store.storeCity}}</td>
<td>{{storedata.data.costTotal}}</td>
<td>{{storedata.data.salesTotal}}</td>
<td>{{storedata.data.revenueTotal}}</td>
<td>{{storedata.data.averageEmployees}}</td>
<td>{{storedata.data.averageEmployeesHours}}</td>
</tr>
<tr data-ng-show="dayDataCollapse[$index]">
<td colspan="2"> </td>
<td colspan="7">
<div>
<div class="pull-right">
<table class="table table-hover table-condensed table-striped">
<thead>
<tr>
<th></th>
<th>Date [YYYY-MM-dd]</th>
<th>Cost</th>
<th>Sales</th>
<th>Revenue</th>
<th>Employees</th>
<th>Employees H-sum</th>
</tr>
</thead>
<tbody>
<tr data-ng-repeat="dayData in storeDataModel.storedata[$index].data.dayData">
<td class="pullright">
<button type="btn btn-small" title="Click to show transactions for this specific day..." data-ng-click=""><i class="icon-list"></i>
</button>
</td>
<td>{{dayData.date}}</td>
<td>{{dayData.cost}}</td>
<td>{{dayData.sales}}</td>
<td>{{dayData.revenue}}</td>
<td>{{dayData.employees}}</td>
<td>{{dayData.employeesHoursSum}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
(注意:両方のレベルに大量のデータがある場合はDOMがいっぱいになるので、データを取得して置換するディレクティブ、つまり、親をクリックしたときにDOMに追加し、別のクリックまたは同じ親をクリックしたときに削除するあなたが Prisjakt.nu で見つけた種類の振る舞いを得るために、あなたがリストされたコンピュータまでスクロールして(リンクではなく)行をクリックするならそれをして要素を調べると、trが追加され、親がもう一度クリックされるか削除されると削除されることがわかります。