web-dev-qa-db-ja.com

同じ<table>に複数の<tbody>を含めることができますか?

同じ<tbody>に複数の<table>タグを含めることができますか?もしそうなら、どのようなシナリオで複数の<tbody>タグを使うべきでしょうか?

569
Jitendra Vyas

はい、あなたはそれらを使用することができます、例えば、私はこのようにデータのグループをより簡単にスタイルするためにそれらを使用します:

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などのグループ化を使用できることです。主なことは、行を視覚的にグループ化してデータを読みやすくする便利な方法です。もちろん他の用途もありますが、適用可能な例としては、これが私にとって最も一般的なものです。

684
Nick Craver

はい。 DTDから

<!ELEMENT table
     (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>

だからそれは1つ以上を期待しています。それはそれから言うことを続けます

テーブル行のグループ間で 規則 が必要な場合は、複数のtbodyセクションを使用します。

295
Martin Smith

この例によれば、 w3-struct-tables とすることができます。

47

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>
13
John Slegers

はい。私はそれらをテーブルの関連部分を動的に隠したり明らかにしたりするために使います。コース。つまり.

<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を操作することによって、すべてを切り替えたり、今日だけを切り替えたりするためのボタンを提供できます。

7
CPslashM

編集: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つだけでなければならないという明示的な規則を見つけることができませんでしたが、実際はそうです。

4
Martin Joiner

さらに、 W3CのHTML Validator を使用して、HTML5 DOCTYPEを使用して複数の<tbody>タグを使用してHTML文書を実行すると、それは正常に検証されます。

3
Bern

私は 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">&nbsp;</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が追加され、親がもう一度クリックされるか削除されると削除されることがわかります。

2
Pixic