【问题标题】:Make nested div stretch to 100% of remaining container div height使嵌套 div 拉伸到剩余容器 div 高度的 100%
【发布时间】:2014-01-19 21:06:49
【问题描述】:

我有一个容器 div,我想将它至少拉伸到窗口的整个高度。如果容器 div 中有很多内容,我希望它拉伸到超过窗口的高度。这行得通。

在容器 div 中,我有一个图像。在图像之后/下方,我有第二个 div。我希望这个嵌套的 div 垂直拉伸以填充容器 div 的剩余空间。这不起作用。

我试图在this image 中说明问题。我希望 div 以右图像的 left 侧所示的方式拉伸,而不是像右图像的 right 侧显示的那样。

以下是我的代码。如您所见,在这段代码中,我什至没有尝试让图像下的 div 垂直拉伸,因为没有任何效果。 "Height: 100%" 并不能解决问题,因为我默认将 "100%" 定义为窗口的高度,以使容器 div 至少拉伸到窗口的高度。

* {
  margin: 0;
  padding: 0;
}

body {
  overflow-y: scroll;
  overflow-x: hidden;
}

body,
html {
  height: 100%;
}

.container {
  display: block;
  overflow: auto;
  min-height: 100%;
  height: 100%;
  height: auto;
}

.bottom {
  width: 100%;
}
<div class="container">

  <img src="image.jpg" width="100%">

  <div class="bottom">
    LOREM IPSUM
  </div>

</div>

【问题讨论】:

标签: css html


【解决方案1】:

我花了太多时间试图弄清楚,但乔治我明白了!

“尤里卡”时刻正在阅读其他问题,人们在问“我如何不使用表格做到这一点?”因为当然,这种布局很容易使用表格。但这让我想到了display:table

正如this blog post 很好地论证的那样,使用display:table 可以为您提供表格布局,而无需像HTML 表格布局那样令人讨厌的标记开销,允许您为不同的媒体查询拥有语义代码和不同的布局。

我最终不得不对标记进行一个更改:围绕图像的包装器&lt;div&gt;。此外,在处理table displays 时,最大/最小高度都很奇怪:考虑到父元素和子元素的约束,height 设置被视为首选高度。因此,在 display:table-row 包装器 div 上设置零高度使该行完全适合内容图像。在内容 div 上设置 100% 的高度可以很好地填充图像和父容器的最小高度之间的空间。

Voila!

仅压缩基本代码:

body {
  overflow-y: scroll;
  overflow-x: hidden;
}

body,
html {
  height: 100%;
}

.container {
  display: table;
  width: 100% height: 100%;
  /* this will be treated as a Minimum! It will stretch to fit content */
}

div.wrapper {
  display: table-row;
  height: 0px;
  /* take as little as possible, while still fitting content */
}

img {
  display: table-cell;
  width: 100%;
  /*scale to fit*/
}

.bottom {
  display: table-cell;
  height: 100%;
  /* take as much as possible */
}
<div class="container">
  <div class="wrapper">
    <img src="http://placekitten.com/600/250" />
  </div>
  <div class="bottom" contentEditable="true">
  </div>

适用于 Firefox 25、Chrome 32、Opera 18 和 IE10。在 IE 8 中不起作用,但那又如何呢?它在 IE8 中看起来并没有损坏,只是无法拉伸以适应。

如果可以在 Safari、IE9 或移动浏览器中测试,请发表评论。

【讨论】:

【解决方案2】:

Flex 盒子会很好,当它们得到广泛支持时。

更好的是规范中的更改,这样如果您在父对象上指定min-height,您可以为子对象的min-height 使用百分比值,而不是要求必须显式设置父对象的高度值让孩子身高百分比有任何意义。但是我跑题了……

同时,使用"faux columns" 可以得到你想要的效果。这个概念很简单:你让子 div 有一个自动高度,然后你绘制父级的背景,这样看起来子 div 的背景一直在全高。

该链接中的示例使用背景图像进行处理,但如果您不介意sacrificing support for Safari and IE9-,您可以使用背景渐变。 (请记住,缺乏支持只是意味着不那么漂亮,一切在功能上都是一样的。)

此处为示例:
http://fiddle.jshell.net/y6ZwR/3/

【讨论】:

  • 这是另一件很好的事情。如果您可以在calc() 函数中使用“视口单位”。我不知道视口单位。可能是因为没有calc() 支持,这些都是无用的。我确实尝试过解决它,但生成的代码几乎难以理解,并且仍然无法正确调整所有内容:fiddle.jshell.net/y6ZwR/5
【解决方案3】:

非javascript方式是使用flexbox。具体如何取决于很多细节,但您可以在http://the-echoplex.net/flexyboxes/ 玩。

Polyfill 确实存在,但具体使用什么取决于您所针对的浏览器。

【讨论】:

    猜你喜欢
    • 2011-01-24
    • 2020-09-10
    • 1970-01-01
    • 2012-09-18
    • 2010-10-17
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多