如何使 div 与父级高度相同(显示为表格单元格)

Posted

技术标签:

【中文标题】如何使 div 与父级高度相同(显示为表格单元格)【英文标题】:How to make div same height as parent (displayed as table-cell) 【发布时间】:2014-05-07 21:28:22 【问题描述】:

我有一个容器 div,其中包含三个子 div(内容不同)——每个子 div 都和最高的一样高。我通过将容器设置为 display:table 并将子 div 设置为 display:table-cell 等来管理这一点。

一切都很好,直到...

我在其中一个子 div 中插入了一个新 div,并尝试将其设置为 height:100% - 这样它就会拉伸到与其父级相同的高度,但这不起作用。

请看我的 JSFiddle:http://jsfiddle.net/bkG5A/

任何帮助将不胜感激!

HTML

<div class="container">
    <div class="child">
        a<br />a<br />a
    </div>
    <div class="child">
        a<br />a<br />a<br />a<br />a<br />a<br />a
    </div>
    <div class="child">
        <div class="content">
            a<br />a<br />a
        </div>
    </div>
</div>

CSS

.container 
    display: table;

.child 
    width: 30px;
    background-color: red;
    display: table-cell;
    vertical-align: top;

.content 
    height: 100%;
    background-color: blue;

【问题讨论】:

【参考方案1】:

另一种选择是将您的子 div 设置为 display: inline-block;

.content 
    display: inline-block;
    height: 100%;
    width: 100%;
    background-color: blue;

.container 
  display: table;

.child 
  width: 30px;
  background-color: red;
  display: table-cell;
  vertical-align: top;

.content 
  display: inline-block;
  height: 100%;
  width: 100%;
  background-color: blue;
<div class="container">
  <div class="child">
    a
    <br />a
    <br />a
  </div>
  <div class="child">
    a
    <br />a
    <br />a
    <br />a
    <br />a
    <br />a
    <br />a
  </div>
  <div class="child">
    <div class="content">
      a
      <br />a
      <br />a
    </div>
  </div>
</div>

JSFiddle Demo

【讨论】:

有趣的是,这在 IE 10 和 FF 28 中不起作用(甚至我的解决方案在 IE 10 和 FF 中也不起作用),根本无法理解这 2 个浏览器。 我有同样的问题。显示表格不适用于所有浏览器。【参考方案2】:

您必须为父母(容器和孩子)明确设置height,这是另一种解决方法(如果您不想明确设置该高度):

.child 
  width: 30px;
  background-color: red;
  display: table-cell;
  vertical-align: top;
  position:relative;


.content 
  position:absolute;
  top:0;
  bottom:0;
  width:100%;
  background-color: blue;

Fiddle

【讨论】:

另外,我认为使用绝对定位来解决这个问题是个坏主意。 @Chris 不明白为什么它对你不起作用,我当然已经测试过了。而且一点也不坏,你可能根本不明白绝对定位是怎么工作的 您说得对,代码运行良好 - 由于 Firefox 中有一些糟糕的缓存,因此对我不起作用。但我仍然不相信绝对定位是一个好的解决方案。原因如下:jsfiddle.net/bkG5A/5 - 为 div 添加了填充。 @Chris 看起来绝对定位不太好在这种情况下我们必须处理table-cell 布局,我认为这很复杂。您实际上拥有的解决方案在 FireFox 28 和 IE 10 中不起作用(不确定您拥有哪些版本,但这些版本是最新版本)。唯一的解决方案是我们为containerchild 显式设置height(正如我在答案中提到的那样),它适用于Chrome、Opera 和FireFox,但不适用于IE 10(太奇怪了) ,这个问题虽然看起来很简单,但跨浏览器却很难解决。 是的,你完全正确。我同意这是一个非常简单的任务,但在 css 中很难解决。我想这毕竟必须在 JS 中解决?就像 jQuery.equalHeights 插件一样。【参考方案3】:

你可以使用这个 CSS:

.content 
    height: 100%;
    display: inline-table;
    background-color: blue;

JSFiddle

【讨论】:

效果很好 :) 但我更喜欢 reinders 解决方案,因为 div 已经在一个表中 - 然后它可能不是使它成为表中的表的最佳解决方案。【参考方案4】:

如果父级已经设置了一个高度,那么子级只能获取一个高度。看到这个例子:Vertical Scrolling 100% height

 html, body 
        height: 100%;
        margin: 0;
    
    .header
        height: 10%;
        background-color: #a8d6fe;
    
    .middle 
        background-color: #eba5a3;
        min-height: 80%;
    
    .footer 
        height: 10%;
        background-color: #faf2cc;
    

    $(function() 
      $('a[href*="#nav-"]').click(function() 
        if (location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '') && location.hostname == this.hostname) 
          var target = $(this.hash);
          target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');
          if (target.length) 
            $('html, body').animate(
              scrollTop: target.offset().top
            , 500);
            return false;
          
        
      );
    );
html,
body 
  height: 100%;
  margin: 0;

.header 
  height: 100%;
  background-color: #a8d6fe;

.middle 
  background-color: #eba5a3;
  min-height: 100%;

.footer 
  height: 100%;
  background-color: #faf2cc;

nav 
  position: fixed;
  top: 10px;
  left: 0px;

nav li 
  display: inline-block;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<body>
  <nav>
    <ul>
      <li>
        <a href="#nav-a">got to a</a>
      </li>
      <li>
        <a href="#nav-b">got to b</a>
      </li>
      <li>
        <a href="#nav-c">got to c</a>
      </li>
    </ul>
  </nav>
  <div class="header" id="nav-a">

  </div>
  <div class="middle" id="nav-b">

  </div>
  <div class="footer" id="nav-c">

  </div>

【讨论】:

以上是关于如何使 div 与父级高度相同(显示为表格单元格)的主要内容,如果未能解决你的问题,请参考以下文章

表格单元格垂直对齐的默认值

使 DIV 填充整个表格单元格

android -> 将 ImageView 的高度设置为父级的动态高度

如何使子div高度与父div高度相同

如何在保持垂直位置的同时使 div 与父级的右侧对齐?

CSS:强制子级使用父级(表格单元格)高度