使一个DIV填满整个表格单元格

216

我看到了这个问题并且查询过一些资料,但至今没有找到解决方法。我想现在已经是2010年了(那些问题/答案都太老了,而且还没有回答),我们有CSS3!是否有任何方法可以使用CSS使一个div充满整个表格单元格的宽度和高度?

我不知道单元格的宽度和/或高度将会是多少,将div的宽度和高度设置为100%无效。

另外,我需要这个div是因为我需要绝对定位一些元素在单元格外部,而position:relative不适用于td,所以我需要一个包装器div。


6
将高度和宽度设置为100%却不起作用,这真的很奇怪。这应该使div标签与父标签具有相同的宽度和高度。也许这不起作用是因为相对定位。当有人找到解决方案时,我很想看看它是什么。 - Marcin
@meder 表格中的数据是动态的,所以我永远不会知道高度。宽度填满屏幕,是的。 - Jason
1
你可能想看一下这个问题:https://dev59.com/zXE85IYBdhLWcg3wUBoZ#3074320 - Gert Grenander
3
如果表格单元格(即容器)的高度没有明确声明,那么内部DIV元素上的百分比高度pc%实际上会根据规范计算为“auto”。请注意,这里指的是CSS规范。 - MrWhite
除非您可以使表格跨越视口,否则您可能需要依赖JS。 - meder omuraliev
显示剩余3条评论
27个回答

2

由于我的声望不够高,无法发布评论,因此我想提供一个完整的跨浏览器解决方案,结合了@Madeorsk和@Saadat的方法,稍加修改!(截至2020年2月10日,在Chrome、Firefox、Safari、IE和Edge上进行了测试)

table { height: 1px; }
tr { height: 100%; }
td { height: 100%; }
td > div { 
   height: -webkit-calc(100vh);
   height: -moz-calc(100vh);
   height: calc(100%);
   width: 100%;
    background: pink;  // This will show that it works!
} 

然而,如果你和我一样,想要控制垂直对齐方式,那么我建议使用flexbox:

td > div {
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: flex-end;
}

1

好的,没有人提到这个,所以我想我会发布这个技巧:

.tablecell {
    display:table-cell;
}
.tablecell div {
    width:100%;
    height:100%;
    overflow:auto;
}

在单元格内的容器div上使用overflow:auto就可以解决问题。如果没有它,div将无法使用整个高度。

0
这个技巧对我很有用:只需在div中加入一个空格(然后它将占据整个td的高度)。
<td>
   <div>
     &nbsp;
     <!-- some optional content filled by vuejs, angular or what you want -->
   </div>
</td>

一旦您开始在行中添加更多项目,这种方法就不会始终有效,因为它可能会使行变高。在您的示例中,它可以工作,但我认为这对于实际使用是误导的。您不应该使用 &nbsp; 来破解布局。 - Jake

0

我经常遇到类似的问题,总是在 table 元素上使用 table-layout: fixed;,在内部 div 上使用 height: 100%;


0
如果定位元素及其父元素没有宽度和高度,则设置
padding: 0;

在其父元素中,


0
为了使内部div的高度:100%生效,您必须为父td设置一个高度。对于我的特定情况,使用height:100%可以实现这一点。这使得内部div的高度拉伸,而表格的其他元素不会使td变得太大。当然,您也可以使用其他值而不是100%。
如果您还想使表格单元格具有固定高度,以便它不会根据内容变大(使内部div滚动或隐藏溢出),那么这时您别无选择,只能使用一些js技巧。父td将需要使用非相对单位(不是%)指定高度。并且您很可能别无选择,只能使用js计算该高度。这还需要为表格元素设置table-layout:fixed样式。

0

最终我发现除了使用jQuery之外,没有任何东西可以在所有浏览器和所有DocTypes / 浏览器渲染模式下工作。所以这就是我想出来的方法。
它甚至考虑了rowspan。

function InitDivHeights() {
    var spacing = 10; // <-- Tune this value to match your tr/td spacing and padding.
    var rows = $('#MyTable tr');
    var heights = [];
    for (var i = 0; i < rows.length; i++)
        heights[i] = $(rows[i]).height();
    for (var i = 0; i < rows.length; i++) {
        var row = $(rows[i]);
        var cells = $('td', row);
        for (var j = 0; j < cells.length; j++) {
            var cell = $(cells[j]);
            var rowspan = cell.attr('rowspan') || 1;
            var newHeight = 0;
            for (var k = 0; (k < rowspan && i + k < heights.length); k++)
                newHeight += heights[i + k];
            $('div', cell).height(newHeight - spacing);
        }
    }
}
$(document).ready(InitDivHeights);

在IE11(Edge模式),FF42和Chrome44+中进行了测试。未测试嵌套表格。


现在使用Flexbox很容易解决这个问题。这是一个老问题! - Jason
@Jason 谢谢,但我们需要它在IE10/IE11中也能正常工作,这两个浏览器根据http://caniuse.com/#feat=flexbox和https://github.com/philipwalton/flexbugs的说法都只有部分/有缺陷的flexbox支持。或许以后会有改进... - Peter B

0
如果表格单元格的大小符合您的要求,只需添加此CSS类并将其分配给您的div:
.block {
   height: -webkit-calc(100vh);
   height: -moz-calc(100vh);
   height: calc(100vh);
   width: 100%;
}

如果您想让表格单元格也填满父容器,请将该类分配给表格单元格。

0

你可以这样做:

<td>
  <div style="width: 100%; position: relative; float: left;">inner div</div>
</td>

0
有点晚了,但这是我的解决方案:
<td style="padding: 0; position: relative;">
   <div style="width: 100%; height: 100%; position: absolute; overflow: auto;">
     AaaaaaaaaaaaaaaaaaBBBBBBBbbbbbbbCCCCCCCCCccccc<br>
     DDDDDDDddddEEEEEEEEdddfffffffffgggggggggggggggggggg
   </div>
</td>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接