如何在TBODY元素之间放置间距

How to put spacing between TBODY elements

提问人:nickf 提问时间:11/17/2008 更新时间:12/1/2022 访问量:91141

问:

我有一张这样的表:

<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 元素之间留出一些间距,但填充和边距没有效果。有什么想法吗?

html css (英语

评论

0赞 Saneef 3/11/2009
重复“tbody”标签是对的吗?我看到的总是所有的“<tr>。</tr>“位于单个”tbody“标签内。
29赞 nickf 3/11/2009
是的,这是有效的。规范说:<!元素表 - - (CAPTION?, (COL*|COLGROUP*)、THEAD?、TFOOT?、TBODY+)>表示必须有一个或多个 TBODY。w3.org/TR/html4/struct/tables.html#h-11.2.1

答:

65赞 Dave Jensen 11/17/2008 #1

试试这个,如果你不介意没有边界。

<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>

评论

17赞 Steve Almond 9/23/2015
尝试 border-top:15px 纯透明;
3赞 iheartcsharp 1/27/2017
想强调这一点。用作边框颜色。@SteveAlmond说的。transparent
0赞 Guy Passy 5/15/2017
如果 table/tbody/tr/td 具有背景色,则将边框颜色设置为 将为它提供元素的背景色,基本上与元素的主体无关。您需要显式地将边框着色为您希望它显示的颜色(使其看起来不可见)transparent
10赞 Dave Jensen 11/17/2008 #2

这是另一种依赖于 :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 12/16/2011
如果您有任何内容恰好依赖于内容相对于单元格大小的位置,例如框阴影、背景图像或其他任何东西,那么这个效果就不好了。
1赞 redfox05 11/9/2015
只是为了澄清其他人在谷歌上找到这个答案,我假设这是在 2008 年写的,现在(2015 年)这个答案在所有主要浏览器上都有完全支持?至少检查 caniuse.com 的第一个孩子似乎得到了很好的支持?
27赞 kevtrout 11/18/2008 #3

对于使用空表格元素来布局页面,人们总是会有有争议的意见(正如这个答案的反对票所证明的那样)。我认识到这一点,但有时当您以“快速而肮脏”的方式工作时,以这种方式使用它们会更容易。

在过去的项目中,我曾使用空行来间隔表行组。我为间隔行分配了它们自己的 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;
}

评论

0赞 nickf 11/18/2008
好吧,如果你要添加额外的标记,为什么不在每个 tbody 的第一行放一个类呢?
0赞 Rolf Rander 1/6/2009
嗯,这可能是因为这些行是生成的代码,在标记中添加单独的行可能比为生成的内容的第一行创建特殊情况更易于维护。
15赞 Xkeeper 12/16/2011
随心所欲地投反对票,但这是唯一没有缺点的解决方案——即使它确实违反了分隔,空行也没什么大不了的 IMO。
15赞 Jason 12/19/2013
没有缺点,我的屁股!尝试使用屏幕阅读器,并注意不正确的行数。更好的是,尝试将表格复制并粘贴到电子表格中。如果您有很多内容,您将重新格式化数小时。表格旨在显示数据(并且非常易于访问),而不是在各部分之间显示填充码。
0赞 pawel-kuznik 4/25/2014
这只是视觉上的。请记住,html 也是可以处理的文档,因此其中的内容应该格式良好。如上所述,复制粘贴表格或使用屏幕阅读器将失败。不应鼓励这种设计。::content 解决方案更好,因为它不会弄乱标记。
4赞 Calvin 4/2/2009 #4

在上面给出的所有答案中,只有 djenson47 的答案保留了陈述和内容的分离。折叠边框模型方法的缺点是不能再使用表格的边框单元格间距属性来分隔各个单元格。你可以争辩说这是一件好事,并且有一些解决方法,但这可能是一种痛苦。所以我认为第一个孩子的方法是最优雅的。

或者,也可以将 TBODY 类的 overflow 属性设置为“visible”以外的任何属性。此方法还允许您保留分隔的边界模型:

<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>

评论

0赞 Eruant 7/10/2012
我想做类似的事情,这对我来说是完美的
0赞 stramin 4/7/2022
这似乎不起作用,我尝试使用 50px 的边框顶部,但什么也没发生:jsfiddle.net/stramin/zrsq0dmk
0赞 Jason 4/2/2009 #5

新答案

您可以根据需要使用任意数量的标签。直到现在,我才意识到 W3C 可以这样做。并不是说我下面的解决方案不起作用(它确实有效),而是要做您要做的事情,请分配您的标签类,然后通过 CSS 引用它们的各个标签,如下所示:<tbody><tbody><td>

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 元素不应超过 1 个。您可以做的是在元素中设置 class 或 id 属性,并为其相应的标签提供填充:<tr><td>

table {
    border-collapse: collapse;
}

tr.yourClass td {
    padding: 10px;
}

您甚至可以为顶部和底部分配一个附加类,以便它们分别只进行顶部或底部填充:<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>

希望这有帮助!

101赞 MacNimble 5/26/2012 #6

根据您的浏览器支持要求,这样的东西将起作用:

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

}

评论

1赞 Laradda 6/11/2012
当您的单元格具有空间不应该有的背景时,这是唯一有效的解决方案。
0赞 nh2 4/25/2013
这对我来说效果很好。有什么缺点吗?另外,为什么是两个冒号?
1赞 dbmikus 2/25/2015
@nh2:双冒号用于伪内容,单冒号用于伪选择器。这是对 CSS 语法的更新。过去,一切都只使用单冒号。较旧的浏览器不支持双冒号(例如,IE <=8)。
4赞 rachel 4/28/2015
使用不是更安全吗?display: table-row;
4赞 OdraEncoded 12/16/2012 #7

您可以在具有表行组的表中使用在这些组之间添加空格。不过,我认为没有办法指定哪些组是间隔的,哪些不是。border-spacing

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

CSS的

table {
  border-spacing: 0px 10px; /* h-spacing v-spacing */
}
0赞 Jereme 9/14/2013 #8

djensen47 answer 适用于较新的浏览器,但是,正如所指出的,它不适用于 IE7。

为了支持较旧的浏览器,我解决这个问题的方法是将每个单元格内容包装在一个 div 中。然后向 div 添加一个 margin-top。

<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 中使用的任何单元格颜色在文本周围折叠。边距顶部通过使整行更高来创建所需的空间。

4赞 user007 5/15/2014 #9

只需设置为,它就会起作用。displayblock

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

评论

1赞 robsonrosa 11/6/2015
这个答案应该是公认的答案,因为它是唯一一个允许使用带有“无边框”列的有边框的 tbody 的答案。
22赞 M Conrad 1/20/2017
display:block断开 tbody 元素之间的列对齐方式。您不再受益于表布局引擎
4赞 Maarten 7/11/2014 #10

因为填充可以应用于 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 不会有顶部填充。但是,这不是必需的。

据我所知,:)没有缺点,尽管没有测试较旧的浏览器。

20赞 Nineoclick 9/15/2015 #11

我一直在使用伪选择器跨浏览器支持间隔多个 时遇到麻烦,如果有的话。<tbody>::before<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>

...您的伪选择器将内容显示为如下所示:::beforeblock

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

...那么这将导致表切断任何使用 .rowspan

解决方案是将 pseudo 样式设置为:::beforetable-row

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

这应该有良好的跨浏览器支持。

这是一把小提琴

评论

0赞 Andreas O 1/30/2023
看着小提琴,我看到这两个选项之间没有区别。您在哪些浏览器中遇到了这个问题?
1赞 Nineoclick 1/31/2023
7 年过去了,我认为现在浏览器内部引擎的更新已经克服了小提琴的明显差异。
0赞 Ian 5/10/2019 #12

在尝试自己解决时遇到了这个问题。我成功地在结束标签之前放置了一个标签。这是一个纯粹的视觉修复,但似乎适用于我测试的大多数浏览器。<br></tbody>

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

也应该是可访问的。

0赞 user2182349 10/29/2020 #13

感谢其他第一个回答的人......

table {
  border-collapse: collapse;
  table-layout: fixed;
  width: 50%;
}
tbody:before {
  content: "";
  display:block;
  border-top: 15px solid white;
}
tbody tr {
  border-color: #000;
  border-style: solid;
}
tbody tr:first-of-type{
  border-width: 2px 2px 0 2px;
}
tbody tr:nth-of-type(1n+2){
  border-width: 0 2px 0 2px;
}
tbody tr:last-of-type{
  border-width: 0 2px 2px 2px;
}
tbody tr:nth-child(odd) {
  background-color: #ccc;
}
tbody tr:hover {
  background-color: #eee;
}
td {
  text-align: right;
}
<table>
  <tbody>
    <tr>
      <th colspan="3">One</th>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <th colspan="3">Two</th>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
    </tr>
  </tbody>
</table>