使DIV填充整个表格单元格


162

我已经看过这个问题并在Google上搜索了一下,但到目前为止没有任何效果。我认为现在是2010年(这些问题/答案很旧,还没有答案),我们有了CSS3!有什么方法可以使用CSS使div填充整个表格单元格的宽度和高度吗?

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

另外,我需要div的原因是因为我需要将某些元素绝对定位在单元格之外,并且position: relative不适用于tds,因此需要包装div。


桌子的容器本身是否有特定的高度?该表是否跨越页面的视口?
meder omuraliev 2010年

4
奇怪的是,将高度和宽度设置为100%无效。那应该使div成为父标签的完整宽度和高度。也许是因为相对位置,这行不通。当有人找到解决方案时,我很好奇。
Marcin

@meder表中的数据是动态的,所以我永远不会知道高度。宽度会填满整个屏幕,是的。
杰森

1
你可能想看看这个问题:stackoverflow.com/questions/2841484/...
格特Grenander

3
@Marcin如果未明确说明表格单元(即容器)的高度,则内部DIV上的pc%高度实际上将计算为“自动”-根据规格。
怀特先生

Answers:


48

以下代码适用于IE 8,IE 8的IE 7兼容模式和Chrome(未经其他测试):

<table style="width:100px"> <!-- Not actually necessary; just makes the example text shorter -->
   <tr><td>test</td><td>test</td></tr>
   <tr>
      <td style="padding:0;">
         <div style="height:100%; width:100%; background-color:#abc; position:relative;">
            <img style="left:90px; position:absolute;" src="../Content/Images/attachment.png"/>
            test of really long content that causes the height of the cell to increase dynamically
         </div>
      </td>
      <td>test</td>
   </tr>
</table>

你在你原来的问题时说,制定widthheight100%没有工作,虽然,这使我怀疑,有一些规则覆盖它。您是否在Chrome或Firebug中检查了计算样式,以查看宽度/高度规则是否真正应用了?

编辑

我真愚蠢!的div大小是根据文本确定的,而不是td。您可以通过制作来在Chrome上解决此问题div display:inline-block,但在IE上则无法使用。事实证明这比较棘手...


感叹...检查是否应用了其他样式是个不错的选择。显然我有一些填充规则,这些规则阻止了div跨越整个表格单元格。一旦摆脱了这些,我就没有问题。我很好奇,因为我的代码看起来像您的代码(当然是使用类),但是当我进一步深入时,请注意,填充。谢谢你的帮助。
杰森

6
请尝试以下示例:jsfiddle.net/2K2tG注意带有图像的单元格是红色的而不是#abc。宽度/高度100%不执行任何操作
Jason 2010年

本文的主题;我已经搜索了很长时间
Ionut Flavius Pogacian 2012年

4
正如杰森(Jason)所指出的,高度:100%无济于事。...这不能解决问题。尽管提到了内联块,但感谢您的编辑。
马特·布朗

3
是的,这适用于Chrome,但不幸的是不适用于Firefox ... jsfiddle.net/38Ngn/1
冥王星

66

表格单元格中的div height = 100%仅在表格本身具有height属性时才有效。

<table border="1" style="height:300px; width: 100px;">
 <tr><td>cell1</td><td>cell2</td></tr>
 <tr>
   <td>
     <div style="height: 100%; width: 100%; background-color:pink;"></div>
   </td>
   <td>long text long text long text long text long text long text</td>
 </tr>
</table>

在FireFox中,UPD还应将height=100%值设置为父TD元素


59
这太奇怪了。愚蠢的是2012年,此错误尚未得到修复
2012年

2
并且因此,我们要支付更多
Ionut Flavius Pogacian 2012年

好招,但对我来说仅适用于Chromium。IE9和Firefox 19无法扩展div。
2013年

1
而不是使用像素高度,我使用了100%的高度和min-height:1px。
andrea.spot。

1
如果将包含td高度也设置100%为,则它应在FF中工作。这是正确的答案。
HartleySan 2014年

57

我只好一个设置假的高度与<tr>和高度:继承<td>s

tr有 height: 1px(无论如何都会被忽略)

然后设置td height: inherit

然后将div设置为 height: 100%

这在IE edge和Chrome中对我有用:

<table style="width:200px;">
    <tr style="height: 1px;">
        <td style="height: inherit; border: 1px solid #000; width: 100px;">
            <div>
              Something big with multi lines and makes table bigger
            </div>
        </td>
        <td style="height: inherit; border: 1px solid #000; width: 100px;">
            <div style="background-color: red; height: 100%;">
                full-height div
            </div>
        </td>
    </tr>
</table>


我不知道这是否总是工作,但它在IE 11没有工作对我来说
乔·玛菲

7
我只需要td { height: 1px }Chrome。
克里斯·克里斯(Chris Happy)

非常感谢!这帮助我将html表和Angular组件用作单元格内容。
Felix Lemke

15

如果您想要在表格单元格中添加100%div的原因是能够将背景色扩展到整个高度,但仍然能够在单元格之间留有间距,则可以为<td>自身指定背景色并使用CSS border-spacing属性在单元格之间创建边距。

但是,如果您确实需要100%的高度div,那么正如此处其他人所提到的,您需要为分配固定的高度<table>或使用Javascript。


1
您可以通过border-spacing:5px在“表格”元素上使用来分隔单元格,但是我同意,在单元格内部使用DIV更加优雅,整体上更好。
vsync

感谢您的建议,效果很好。只要记住要申请border-collapse: separate表,否则不会有任何效果。+1
katzenhut 2015年

border-collapse: separate是默认设置,但是是的,这是一个很好的提示。
马特·布朗

11

因此,因为每个人都在发布他们的解决方案,但对我没有一个好处,所以这里是我的(在Chrome和Firefox上进行了测试)。

table { height: 1px; }
tr { height: 100%; }
td { height: 100%; }
td > div { height: 100%; }

小提琴:https//jsfiddle.net/nh6g5fzv/


1
先生或女士,您值得拥有一颗金星。这让我发疯。
tylertrotter

6

由于其他所有浏览器(包括IE 7、8和9)都只能position:relative正确处理表格单元格都可以 Firefox能够因此最好的选择是使用JavaScript填充程序。您不必为一个故障的浏览器更改DOM。当IE出问题而其他所有浏览器都出问题时,人们总是在使用垫片。

这是一个带有所有代码注释的代码段。在我的示例中,JavaScript,HTML和CSS使用了响应式Web设计实践,但如果不需要,则不必这样做。(自适应意味着它可以适应您的浏览器宽度。)

http://jsfiddle.net/mrbinky3000/MfWuV/33/

这是代码本身,但是没有上下文是没有意义的,因此请访问上面的jsfiddle URL。(完整的代码段在CSS和Javascript中都有很多注释。)

$(function() {
    // FireFox Shim
    if ($.browser.mozilla) {
        $('#test').wrapInner('<div class="ffpad"></div>');
        function ffpad() {
            var $ffpad = $('.ffpad'),
                $parent = $('.ffpad').parent(),
                w, h;
            $ffpad.height(0);
            if ($parent.css('display') == 'table-cell') {               
                h = $parent.outerHeight();
                $ffpad.height(h);
            }
        }
        $(window).on('resize', function() {
            ffpad();
        });
        ffpad();
    }
});

2
虽然这是一个很好的答案,但是请勿复制/粘贴此代码。$ .browser自jQuery 1.8起已弃用,并于1.9中删除。有关更多信息:api.jquery.com/jQuery.browser
cmegown 2013年

我也喜欢这个答案,但是就像@cmegown所说的那样,$。browser现在已被弃用。我个人会做的(我会尝试-我不是100%确信它会工作)是将元素的位置从静态更改为绝对(或相反),然后查看是否存在与窗口相比,元素位置的变化。如果该元素具有这应该只是工作top:0; left: 0;
Nikola Ivanov Nikolov

我可以确认这对我有用-我获得了元素的.offset(),然后将其更改为绝对位置,然后再次获得它的offset(),如果不相同,则将其包装在一个位置:相对div。这只是工作,因为绝对定位的时候,我不希望我的元素来改变它的位置(因为它的顶部:0;左:0;)
尼古拉·伊万诺夫尼科洛夫

7
Firefox不会“搞错”。相对放置表格单元格在CSS规范中未定义。(链接
user2867288 2014年

现在即使在Firefox(26)中也不需要JavaScript也可以使用。此外,这是至今只为我工作的答案...
托马什Zato -恢复莫妮卡

4

我建议使用 实验性的 那么Flexbox模拟表布局,这将使单元格的内容元素,以垂直填补它的父单元:

演示版

.table{ display:flex; border:2px solid red; }
.table > *{ flex: 1; border:2px solid blue; position:relative; }
.fill{ background:lightgreen; height:100%; position:absolute; left:0; right:0; }

/* Reset */
*{ padding:0; margin:0; }
body{ padding:10px; }
<div class='table'>
  <aside><div class='fill'>Green should be 100% height</div></aside>
  <aside></aside>
  <aside>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus imperdiet, nulla et dictum interdum, nisi lorem egestas odio, vitae scelerisque enim ligula venenatis dolor. Maecenas nisl est, ultrices nec congue eget, auctor vitae massa. Fusce luctus vestibulum augue ut aliquet. Mauris ante ligula, facilisis sed ornare eu, lobortis in odio. Praesent convallis urna a lacus interdum ut hendrerit risus congue. Nunc sagittis dictum nisi, sed ullamcorper ipsum dignissim ac. In at libero sed nunc venenatis imperdiet sed ornare turpis. Donec vitae dui eget tellus gravida venenatis. Integer fringilla congue eros non fermentum. Sed dapibus pulvinar nibh tempor porta. Cras ac leo purus. Mauris quis diam velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus imperdiet, nulla et dictum interdum, nisi lorem egestas odio, vitae scelerisque enim ligula venenatis dolor. Maecenas nisl est, ultrices nec congue eget, auctor vitae massa. Fusce luctus vestibulum augue ut aliquet. Mauris ante ligula, facilisis sed ornare eu, lobortis in odio. Praesent convallis urna a lacus interdum ut hendrerit risus conguet.</p>
  </aside>
</div>


3

经过几天的搜索,我发现了可能解决此问题的方法。

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Documento sin título</title>
</head>

<body style="height:100%">
<!-- for Firefox and Chrome compatibility set height:100% in the containing TABLE, the TR parent and the TD itself. -->
<table width="400" border="1" cellspacing="0" cellpadding="0" style="height:100%;">  
  <tr>
    <td>whatever</td>
    <td>whatever</td>
    <td>whatever</td>
  </tr>
  <tr style="height:100%;">
    <td>whatever dynamic height<br /><br /><br />more content
</td>
    <td>whatever</td>

    <!-- display,background-color and radius properties in TD BELOW could be placed in an <!--[if IE]> commentary If desired.
    This way TD would remain as display:table-cell; in FF and Chrome and would keep working correctly.    
    If you don't place the properties in IE commentary it will still work in FF and Chorme with a TD display:block;

    The Trick for IE is setting the cell to display:block; Setting radius is only an example of whay you may want a DIV 100%height inside a Cell.
    -->

    <td style="height:100%; width:100%; display:block; background-color:#3C3;border-radius: 0px 0px 1em 0px;">

    <div style="width:100%;height:100%;background-color:#3C3;-webkit-border-radius: 0px 0px 0.6em 0px;border-radius: 0px 0px 0.6em 0px;">
    Content inside DIV TAG
    </div>
     </td>
  </tr>
</table>
</body>
</html>

西班牙语:塔布(Tabla)的tru est establecer,TR和TD的身高:100%。与Esto兼容的FireFox和Chrome。Internet Explorer igno eso,等离子TD como块。De esta forma Explorersítoma la alturamáxima。

英文说明:代码内的注释


3

如果已<table> <tr> <td> <div>全部height: 100%;设置,则div将在所有浏览器中填充动态单元格高度。


1

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

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

溢出:在单元格内的那个容器div上的自动为我完成了把戏。没有它,div不会使用整个高度。


1

如果表单元格是您想要的大小,只需添加此css类并将其分配给您的div:

.block {
   height: -webkit-calc(100vh);
   height: -moz-calc(100vh);
   height: calc(100vh);
   width: 100%;
}

如果您也希望表单元格填充父级,则也将类分配给表单元格。希望对您有所帮助。


1

参加聚会有点晚,但这是我的解决方案:

<td style="padding: 0; position: relative;">
   <div style="width: 100%; height: 100%; position: absolute; overflow: auto;">
     AaaaaaaaaaaaaaaaaaBBBBBBBbbbbbbbCCCCCCCCCccccc<br>
     DDDDDDDddddEEEEEEEEdddfffffffffgggggggggggggggggggg
   </div>
</td>

1

因为我没有足够的声誉来发表评论,所以我想添加一个完整的跨浏览器解决方案,该解决方案将@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;
}

0

我认为最好的解决方案是使用JavaScript。

但是我不确定您是否需要执行此操作来解决将元素放置<td>在单元外部的问题。为此,您可以执行以下操作:

<div style="position:relative">
    <table>
        <tr>
            <td>
                <div style="position:absolute;bottom:-100px">hello world</div>
            </td>
        </tr>
    </table>
</div>

当然不是内联的,但带有类和ID。


感谢您的回复。如果我需要相对于桌子放置一些东西,则此方法有效。我需要在单元位置未知的单个单元外部放置一些东西。
杰森

您可以扩展此表包含的内容吗?100%的宽度/高度是什么?
meder omuraliev 2010年

0

为了使height:100%适用于内部div,您必须为父td设置高度。对于我的特殊情况,它使用height:100%起作用。这使得内部div高度变长,而表格的其他元素不允许td变得太大。您当然可以使用100%以外的其他值

如果您还希望使表格单元格具有固定的高度,以使表格单元格不会因内容而变大(使内部div滚动或隐藏溢出),那就是您别无选择,只能做一些js技巧。父td必须具有以非相对单位(不是%)指定的高度。您可能别无选择,只能使用js计算该高度。这还需要为table元素设置table-layout:fixed样式


0

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


0

我最终发现除了使用jQuery之外,没有任何东西可以在所有浏览器和所有DocTypes /浏览器呈现模式下正常工作。这就是我的想法。
它甚至考虑了行跨度。

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(边缘模式),FF42,Chrome44 +中进行了测试。未使用嵌套表进行测试。


好了,现在使用flexbox很容易。这是一个老问题!
杰森

@Jason谢谢,但是我们也需要它在IE10 / IE11中工作,根据caniuse.com/#feat=flexboxgithub.com/philipwalton/flexbugs都具有部分/错误的flexbox支持。也许以后...
Peter B


0

如果定位的元素及其父元素没有宽度和高度,则设置

padding: 0;

在其父元素中


0

不建议这样做。

我想出了一种解决方法,如果您的div不包含文本并且具有统一的背景,则该方法可以起作用。

display: 'list-item'

为div提供所需的高度和宽度,但缺点是列表项有很大的缺点。由于div具有均匀的背景色,因此我摆脱了那些样式的问题:

list-style-position: 'inside',
color: *background-color*,

-1

我不确定您要做什么,但是您可以尝试以下一种方法:

<td width="661" valign="top"><div>Content for New Div Tag Goes Here</div></td>


-1

以下应该工作。您必须为父单元格设置一个高度。 https://jsfiddle.net/nrvd3vgd/

<table style="width:200px; border: 1px solid #000;">
    <tr>
        <td style="height:100px;"></td>
    </tr>
    <tr>
        <td style="height:200px;">
            <div style="height:100%; background: #f00;"></div>
        </td>
    </tr>
</table>

-1

试试这个:

<td style="position:relative;">
    <div style="position:absolute;top:0;bottom:0;width:100%;"></div>
</td>

-2

尝试将display:table块放入单元格中


1
“ display:table block”是什么意思?请考虑修改和格式化答案
Pmpr '16

-2

我没有在这里观看< div的旧CSS技巧在< td > 内 >。因此,我提醒:简单设置一些极小值的宽度,但什么,你需要最小宽度。例如:

<div style="width: 3px; min-width: 99%;">

TD的宽度,在这种情况下,是由你。


-9

这是我在HTML中扩展100%高度和100%宽度的解决方案 <td>

如果您删除代码中的第一行,则可以对其进行修复...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

因为此doctype不允许某些文件使用内的100%百分比<td>,但是如果删除此行,正文将无法将背景扩展到100%高度和100%宽度,因此我发现这DOCTYPE可以解决问题

<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">

此DOCTYPE可让您将身体中的背景扩展为100%高度和100%宽度,并将100%高度和100%宽度全部吸收到 <td>


3
最好不要弄乱文档类型。您似乎并不了解所有后果。更改Doctypes可能会有很多副作用(令人遗憾的是,CSS世界中的大多数事情也是如此)。
罗尔夫(Rolf)2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.