如何将元素(DIV / TABLE / other)高度设置为其容器的100%?

时间:2009-12-12 00:09:10

标签: html css

我正在尝试完成一个简单的“液体布局”,左边有两个宽度= 50%的框,右边有一个宽度= 50%的框,最右边的框的高度跟在最左边的框中,反之亦然。我想要10px的盒子之间的间距,盒子的漂亮3D感觉和外面没有边框或边缘。

我试图仅使用DIV标签实现此功能,但未成功。由于时间不够,我转而采用更熟悉的TABLE / TR / TD方法。实际上,表格单元格高度遵循总表格高度,但是当我在表格单元格中引入DIV标签以便我可以实现3D框边框时,高度再次缩小。无论在我的代码中的哪个位置,我都尝试将“height = 100%”,我的浏览器似乎没有采取行动。

问题与之前已经在StackOverflow上提出的问题有关(链接here)。建议的解决方案是使用TABLE而不是DIV。在我的情况下,如果我想坚持我的3D盒子和我的细胞之间的间距,这将无法工作。

我在下面列出了包含两种不同方法的代码,两种方法都不起作用。有人可以建议我修改我的代码,以便右边框的高度将变为其TD容器大小的100%(在示例中显示为绿色?)。任何其他具有相同结果的方法也是非常受欢迎的。 更新: Tor Valamo发布了一个答案,指出了100%的位置。不幸的是,结果仅适用于IE和Firefox,而不适用于Chrome。因此,搜索继续进行与浏览器无关的解决方案。

更新: 在收到几条有用的建议后,我发布了自己的解决方案,这是我目前唯一可以接受的解决方案。不幸的是它使用TABLE而不是DIV。在DIV解决方案上已经完成了一些工作,对于任何想要完成工作的人来说,源代码可用here

<html>
<head>
  <style>
 .outsidetable {
  border-collapse: collapse;
  border-style: hidden;
 }

 .outsidecell {
  border-width: 10px;
  border-color: #FFF;
  padding: 0px;
  border-style: solid;
  background-color: #0F0;
 }

 .fancybox  {
  border-style: outset;
  border-color: yellow;
  border-width: 2px;
  background-color: #CCF;
 }
  </style>
</head>
<body>

<!-- First example, using DIV to draw the boxes 
  and TABLE/TR/TD for the layout -->
<p>
<table class=outsidetable>
  <tr>
 <td class=outsidecell><div class=fancybox>
  Lorem ipsum dolor sit amet, 
  consectetur adipisicing elit, 
  sed do eiusmod tempor incididunt 
  ut labore et dolore magna aliqua. 
 </div></td>
 <td class=outsidecell rowspan=2><div class=fancybox height=100% style="height: 100%">
  Lorem ipsum dolor sit amet, 
  consectetur adipisicing elit, 
  sed do eiusmod tempor incididunt 
  ut labore et dolore magna aliqua. 
 </div></td>
  </tr>
  <tr>
    <td class=outsidecell><div class=fancybox>
  Lorem ipsum dolor sit amet, 
  consectetur adipisicing elit, 
  sed do eiusmod tempor incididunt 
  ut labore et dolore magna aliqua. 
 </div></td>
  </tr>
</table>
</p>

<!-- Second example, using TABLE instead of DIV to draw the boxes 
  (and again TABLE/TR/TD for the layout) -->
<p>
<table class=outsidetable>
  <tr>
 <td class=outsidecell><table class=fancybox><tr><td>
  Lorem ipsum dolor sit amet, 
  consectetur adipisicing elit, 
  sed do eiusmod tempor incididunt 
  ut labore et dolore magna aliqua. 
 </td></tr></table></td>
 <td class=outsidecell rowspan=2><table class=fancybox height=100% style="height: 100%"><tr><td height=100% style="height: 100%">
  Lorem ipsum dolor sit amet, 
  consectetur adipisicing elit, 
  sed do eiusmod tempor incididunt 
  ut labore et dolore magna aliqua. 
 </td></tr></table></td>
  </tr>
  <tr>
    <td class=outsidecell><table class=fancybox><tr><td>
  Lorem ipsum dolor sit amet, 
  consectetur adipisicing elit, 
  sed do eiusmod tempor incididunt 
  ut labore et dolore magna aliqua. 
 </td></tr></table></td>
  </tr>
</table>
</p>

</body>
</html>

6 个答案:

答案 0 :(得分:2)

首先,不要使用表格进行布局。这是一个语义禁忌。有了这个,请参阅The Perfect 3 Column Liquid Layout by Matthew James Taylor。 Matthew创建了一个很棒的多柱液体布局实现,可以按百分比或宽度调整大小。

答案 1 :(得分:2)

使用表格单元格的轮廓而不是边框​​,它将起作用。并将包含div放入其中!

<html>
<head>
    <style>
        table {
            border-spacing:10px;
            border:0px;
        }
        td {
            width:50%;
            outline-style:outset;
            outline-color:yellow;
            background-color:#CCF;
            vertical-align:top;
        }
        * html td { /* IE hack because it doesn't recognise outline */
            border-style:outset;
            border-color:yellow;
        }
    </style>
</head>
<body>
<table>
    <tr>
        <td>
            Lorem ipsum dolor sit amet
        </td>
        <td rowspan="2">
            Lorem ipsum dolor sit amet
        </td>
    </tr>
    <tr>
        <td>
            Lorem ipsum dolor sit amet
        </td>
    </tr>
</table>

</body>
</html>

答案 2 :(得分:1)

尝试:

.outsidecell {
  height:100%;
  <other stuff here>
}

这是有效的,因为有一个“内部”内容框,它是内容绘图的地方。这个内盒只有它的内容大。因此,即使该内容为100%,它本身也只有100%,而不是父容器。因此,您需要将父容器扩展为其实际的100%大小。

这可能不是它背后的实际机制,但用很多的话来说......

答案 3 :(得分:1)

尽管使用表格可能很糟糕,但在使用所有提议的解决方案后,我发现只有一个解决方案(使用表格)满足我的所有约束。有一天,我希望能够将Andy的代码翻译成DIV的工作解决方案,现在我担心我会坚持这个。 编辑: 对于想要尝试的人,所有源代码均可用here

总结一下,我的约束是,

  • 完全液体布局:任何细胞都遵循任何其他细胞的高度
  • 内部10px的单元格之间的间距(但不在外部)
  • 细胞周围的3D边框
  • 适用于我的计算机上的所有浏览器(Chrome,IE,Firefox)

总结我的解决方案,我使用空间隔单元来实现单元格间距,因为我所知道的所有其他间距方法都不能满足所有约束条件:

  • CSS border-spacing也会在整个表格周围添加一个我不想要的边框
  • 选择性单元格边框限制了我将3D边框添加到单元格的能力

填充间隔单元格使它们太高,所以我选择将它们留空并将CSS empty-cells属性设置为“show”。另一种选择是用1x1间隔GIF填充它们,但那是所以 1990 ......

代码:

<html>
<head>
  <style>
 .outsidetable {
  border-collapse: separate;
  border-style: hidden;
  empty-cells: show;
 }

 .spacercell {
  width: 10px;
  height: 10px;
  border-style: none;
 }

 .contentcell {
  border-style: outset;
  border-color: yellow;
  border-width: 2px;
  background-color: #CCF;
 }

  </style>
</head>
<body>

<p>
<table class=outsidetable>
  <tr>
 <td class=contentcell>
  Lorem ipsum dolor sit amet, 
  consectetur adipisicing elit, 
  sed do eiusmod tempor incididunt 
  ut labore et dolore magna aliqua. 
 </td>
 <td class=spacercell></td>
 <td class=contentcell rowspan=3>
  Lorem ipsum dolor sit amet, 
  consectetur adipisicing elit, 
  sed do eiusmod tempor incididunt 
  ut labore et dolore magna aliqua. 
 </td>
  </tr>
  <tr>
 <td class=spacercell colspan=3></td>
  </tr>
  <tr>
 <td class=contentcell>
  Lorem ipsum dolor sit amet, 
  consectetur adipisicing elit, 
  sed do eiusmod tempor incididunt 
  ut labore et dolore magna aliqua. 
 </td>
 <td class=spacercell></td>
  </tr>
</table>
</p>

</body>
</html>

答案 4 :(得分:1)

这是一个基于div的,只要右边的单元格没有填充超过其他两个组合就可以工作。只有在使用xhtml doctype时才能在IE中使用。

    .inner {
        border:5px outset yellow;
        background-color:#CCF;
    }
    .outer {
        position:relative;
        border:1px solid #000;
        width:500px;
    }
    .left {
        position:relative;
        width:240px;
    }
    .right {
        position:absolute;
        top:0;
        right:0;
        bottom:0;
        width:240px;
    }

<div class="outer">
    <div class="inner left">
        Lorem<br />
        Lorem<br />
    </div>
    <div class="inner left">
        Schmorem<br />
        Schmorem<br />
        Schmorem<br />
    </div>
    <div class="inner right">
        Ipsum schmipsum!<br />
        Ipsum schmipsum!<br />
    </div>
</div>

答案 5 :(得分:0)

如果您在列上设置高度并且div的高度为100%,那么它将适用于您。即如果您的设计允许您在TD上设置高度:)。