TBODY要素間にスペースを置く方法


95

私はこのようなテーブルを持っています:

<table>
    <tfoot>
        <tr><td>footer</td></tr>
    </tfoot>
    <tbody>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
    </tbody>
</table>

各tbody要素の間にスペースを入れたいのですが、パディングとマージンが機能しません。何か案は?


「tbody」タグを繰り返すのは正しいことですか?私が常に見ているのは、すべての「<tr> .. </ tr>」が単一の「
tbody

23
はい、これは有効です。仕様には次のように記載されています。 w3.org/TR/html4/struct/tables.html#h-11.2.1
nickf

回答:


56

国境がなくてもかまわない場合は、これを試してください。

<style>
table {
  border-collapse: collapse;
}

table tbody {
  border-top: 15px solid white;
}
</style>

<table>
    <tfoot>
        <tr><td>footer</td></tr>
    </tfoot>
    <tbody>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
    </tbody>
</table>

7
border-topを試してください。
スティーブアーモンド

3
これを強調したかった。transparent境界線の色として使用します。@SteveAlmondが言ったこと。
iheartcsharp 2017年

table / tbody / tr / tdにbackground-colorがある場合、border colorをに設定するtransparentと、要素のbackground-colorが与えられ、要素の本体と本質的に区別できなくなります。境界線に表示したい色を明示的に(必要に応じて非表示にするため)着色する必要があります
Guy Passy

81

ブラウザのサポート要件によっては、次のようなものが機能します。

tbody::before
{
  content: '';
  display: block;
  height: 15px;

}

1
これは、セルにスペースではいけない背景がある場合に機能する唯一のソリューションです。
Laradda 2012年

これは私にとってはうまくいきました。欠点はありますか?また、なぜ2つのコロンが必要なのでしょうか。
nh2 2013

素晴らしいソリューション。すべてをアクセス可能に保ちます!
Jason T Featheringham

1
@ nh2:二重コロンは疑似コンテンツ用で、単一コロンは疑似セレクター用です。これはCSS構文の更新です。以前はすべて、単一のコロンを使用していました。古いブラウザは、ダブルコロンをサポートしていません(IE <= 8など)。
dbmikus 2015

3
使用する方が安全ではないdisplay: table-row;ですか?
レイチェル2015

20

空のテーブル要素を使用してページをレイアウトすることについて、人々は常に物議を醸す意見を持っています(この回答の反対票から明らかです)。私はこれを認識していますが、「すばやく汚れた」方法で作業しているときは、この方法を使用する方が簡単な場合があります。

過去のプロジェクトで空の行を使用して、テーブル行のグループを配置しました。スペーサー行に独自のcssクラスを割り当て、そのクラスの高さを定義しました。この高さは、テーブル行のグループの上下のマージンとして機能しました。

    .separator{
             height: 50px;
    }

   <table>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>

           <tr class="separator" colspan="2"></tr>

           <tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>

           <tr class="separator" colspan="2"></tr>

           tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>
           <tr><td>Cell 1</td><td>Cell 2</td></tr>
   </table>

テーブルセルに境界線がない場合は、スタイルシートの一般的なセルまたは行の高さを定義して、テーブルのすべての行を均等に配置することもできます。

tr{
   height: 40px;
}

マークアップを追加する場合は、各tbodyの最初の行にクラスを配置してみませんか?
nickf 2008年

それは、行が生成されたコードであり、マークアップに別の行を追加する方が、生成されたコンテンツの最初の行に特別なケースを作成するよりも保守しやすいためです。
Rolf Rander

12
必要なすべてを反対票を投じますが、これは欠点のない唯一の解決策です。分離に違反しても、空の行はそれほど大きなIMOにはなりません。
Xkeeper

11
欠点なく、私のお尻!これにスクリーンリーダーを使用してみて、行数が正しくないことに注意してください。さらに良いことに、表をコピーしてスプレッドシートに貼り付けてみてください。コンテンツが多い場合は、何時間も再フォーマットすることになります。テーブルは、セクション間のシム表示ではなく、データを表示する(そして非常にアクセスしやすい)ことを目的としています。
Jason T Featheringham

それは視覚的なものです。htmlも処理可能なドキュメントであるため、その中のコンテンツは適切にフォーマットされている必要があります。上記のように、テーブルのコピーと貼り付け、またはスクリーンリーダーの使用は失敗します。このような設計は推奨されません。::コンテンツソリューションは、マークアップを台無しにしないので、より良い方法です。
pawel-kuznik 2014

12

私は適切に複数のトラブルの間隔にあった<tbody>::beforeの存在下で、擬似<tr>含む<td>ブラウザのカップルでROWSPANと。

基本的に、次の<tbody>ような構造の場合:

<tbody>
    <tr>
        <td>td 1</td>
        <td rowspan"2">td 2</td>
        <td>td 3</td>
        <td>td 4</td>
    </tr>
    <tr>
        <td>td 1</td>
        <td>td 2</td>
        <td>td 4</td>
    </tr>
</tbody>

そして、あなたは誰が::beforeこのような疑似要素にCSSを書くことを勧めるのかに従います:

tbody::before
{
    content: '';
    display: block;
    height: 10px;
}

これは行スパンに影響し、2番目のテーブルが最初のテーブルに<tr>いくつあるかを示し<td>ます。

したがって、そのような問題に遭遇した場合の解決策は::before、次のように疑似スタイルを設定することです。

tbody::before
{
    content: '';
    display: table-row;
    height: 10px;
}

ここにフィドルがあります


6

これは、すべてのブラウザーで使用できるわけではない:first-childに依存する別の可能性です。

<style>
table {
  border-collapse: collapse;
}

td {
  border: 1px solid black;
}

tbody tr:first-child td {
  padding-top: 15px;
}

</style>

<table>
    <tfoot>
        <tr><td>footer</td></tr>
    </tfoot>
    <tbody>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
    </tbody>
</table>

3
これは、ボックスの影や背景画像など、セルのサイズを基準にしたコンテンツの位置に依存している場合、うまく機能しません。
Xkeeper

1
Googleでこの回答を見つけた他の人たちを明確にするために、私はこれが2008年に書かれたと思いますが、この回答(2015)はすべての主要なブラウザーで完全にサポートされていますか?少なくともcaniuse.comの最初の子をチェックすることは十分にサポートされているようですか?
redfox05 2015年

6

ただ、設定displayとしてblock、それが動作します。

table tbody{
    display:block;
    margin-bottom:10px;
    border-radius: 5px;
}

1
これは「no-border」列を持つボーダー付きのtbodyを使用できる唯一の回答であるため、この回答は受け入れられるはずです。
robsonrosa 2015年

13
display:blocktbody要素間の列の配置を解除します。テーブルレイアウトエンジンのメリットを利用できなくなった
Mコンラッド

4

上記のすべての回答のうち、プレゼンテーションとコンテンツの分離を維持しているのはdjenson47の回答のみです。折りたたみボーダーモデルメソッドの欠点は、テーブルのボーダーまたはセルスペース属性を使用して個々のセルを分離できなくなることです。これは良いことであり、いくつかの回避策がありますが、それは苦痛である可能性があります。だから私は最初の子の方法が最もエレガントだと思います。

または、TBODYクラスのオーバーフロープロパティを「可視」以外に設定することもできます。この方法では、分離した境界モデルも保持できます。

<style>
tbody {
    overflow: auto;
    border-top: 1px solid transparent;
}
</style>
<table>
    <tfoot>
        <tr><td>footer</td></tr>
    </tfoot>
    <tbody>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
        <tr><td>Body 1</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
        <tr><td>Body 2</td></tr>
    </tbody>
    <tbody>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
        <tr><td>Body 3</td></tr>
    </tbody>
</table>

私は同じようなことをしようとしていました、これは私にとって完璧です
Eruant

4

パディングはTDに適用できるため、+記号でトリックを実行できます。次に、tbodyの最初のTRのTDにトップパディングを付けることができます。

// The first row will have a top padding
table tbody + tbody tr td {
    padding-top: 20px;
}

// The rest of the rows should not have a padding
table tbody + tbody tr + tr td {
    padding-top: 0px;
}

「tbody + tbody」を追加したので、最初のtbodyには上部パディングがありません。ただし、必須ではありません。

私が知る限り、欠点はありません:)、しかし古いブラウザをテストしていませんでした。


2

border-spacingテーブル行グループのあるテーブルでを使用して、それらのグループの間にスペースを追加できます。ただし、間隔を空けたグループと間隔を空けたグループを指定する方法はないと思います。

<table>
  <thead>
    ...
  </head>
  <tbody>
    ...
  </tbody>
  <tbody>
    ...
  </tbody>
  <tfoot>
    ...
  </tfoot>
</table>

CSS

table {
  border-spacing: 0px 10px; /* h-spacing v-spacing */
}

0

新しい答え

<tbody>タグはいくつでも使用できます。今までW3Cで問題ないことを知りませんでした。以下の解決策が機能しない(それが機能する)と言うのではなく、あなたがしようとしていることを行うには、<tbody>タグクラスを割り当ててから、次の<td>ようにCSSを介して個々のタグを参照します:

table tbody.yourClass td {
    padding: 10px;
}

そしてあなたのHTMLはこうして:

<table> 
<tbody>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
</tbody>
<tbody class="yourClass">    
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
</tbody>
<tbody>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
</tbody>
</table>

その男を試してみてください:)

古い答え

何をしても、空白行を挿入しないでください...

テーブルに複数のtbody要素を含めることはできません。あなたができることはあなたの<tr>要素にクラスまたはID属性を設定し、対応する<td>タグにパディングを与えることです:

table {
    border-collapse: collapse;
}

tr.yourClass td {
    padding: 10px;
}

topとbottomに<tr>追加クラスを割り当てて、それぞれ上または下のパディングのみを行うようにすることもできます。

tr.yourClass.topClass td {
    padding: 10px 0 0 0;
}

tr.yourClass.bottomClass td {
    padding: 0 0 10px 0;
}

HTMLでは、<tr>タグは次のようになります。

<table> 
<tbody>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr class="yourClass topClass"><td>Text</td></tr>
<tr class="yourClass"><td>Text</td></tr>
<tr class="yourClass bottomClass"><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
<tr><td>Text</td></tr>
</tbody>
</table>

お役に立てれば!


0

djensen47の回答は新しいブラウザーではうまく機能しますが、指摘されたとおり、IE7では機能しません。

古いブラウザをサポートするためのこの問題の私の回避策は、div内で各セルのコンテンツをラップすることでした。次に、マージントップをdivに追加します。

<table class="tbl">
<tr></tr>
<tr></tr>
<tr></tr>
<tr><td><div></div></td></tr>
</table>

CSS

.tbl tr td div {
    height:30px;
    margin-top:20px;
}

高さの設定により、セルは少なくとも30pxの高さに保たれ、div内で使用されるセルの色がテキストの周囲で折りたたまれないようにします。margin-topは、行全体を高くすることにより、目的のスペースを作成します。


0

自分で解決しようとしているときにこれに遭遇しました。<br>終了</tbody>タグの直前にタグを配置することに成功しました。これは純粋に視覚的な修正ですが、テストしたほとんどのブラウザで機能するようです。

<table>
    <tbody>
        <tr>
            <td></td>
        </tr>
        <br>
    </tbody>
    <tbody>
        <tr>
            <td></td>
        </tr>
    </tbody>
</table>

同様にアクセスできる必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.