2019年更新
**TL;DR:**今天最好的选择是 - flexbox。一切都很好地支持它并且已经存在了很多年。努力去做,不要回头。下面是 Flexbox 的代码示例:
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.row-container {display: flex; width: 100%; height: 100%; flex-direction: column; background-color: blue; overflow: hidden;}
.first-row {background-color: lime; }
.second-row { flex-grow: 1; border: none; margin: 0; padding: 0; }
<div class="row-container">
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<iframe src="https://jsfiddle.net/about" class="second-row"></iframe>
</div>
运行代码片段隐藏结果
展开片段
这个答案的其余部分留给学习和历史原因。
诀窍是要了解 100% 指的是什么。阅读 CSS 规范可以为您提供帮助。
长话短说 - 有一个“包含块”这样的东西 - 它不一定是父元素。简单地说,它是层次结构中第一个具有position:relative 或position:absolute 的元素。或者如果没有其他东西的话就是 body 元素本身。因此,当您说“width:100%”时,它会检查“包含块”的宽度并将元素的宽度设置为相同的大小。如果那里还有其他东西,那么您可能会得到比自身大的“包含块”的内容(因此“溢出”)。
高度也以同样的方式起作用。但有一个例外。您无法将浏览器窗口的高度设置为 100%。可以计算 100% 的最顶层元素是 body(或 html?不确定)元素,它的伸展程度刚好足以包含其内容。在其上指定 height:100% 不会产生任何效果,因为它没有可用于测量 100% 的“父元素”。窗户本身不算数。 ;)
要使某些内容完全拉伸到窗口的 100%,您有两种选择:
- 使用 JavaScript
- 不要使用文档类型。这不是一个好的做法,但它会将浏览器置于“怪异模式”,在该模式下,您可以对元素执行 height="100%" ,它会将它们拉伸到窗口大小。请注意,页面的其余部分可能也必须更改以适应 DOCTYPE 更改。
**更新:**我不确定当我发布这篇文章时我是否已经错了,但这现在肯定已经过时了。今天,您可以在样式表中执行此操作:html, body { height: 100% }
它实际上会延伸到整个视口。即使有 DOCTYPE。min-height: 100%
也可能有用,具体取决于您的情况。
我也不会建议任何人再制作怪异模式文档,因为它带来的麻烦远多于解决的麻烦。每个浏览器都有不同的怪异模式,因此让页面在不同浏览器中看起来一致变得困难两个数量级。使用文档类型。总是。最好是 HTML5 之一 - <!DOCTYPE html>
.它很容易记住,并且在所有浏览器中都具有魅力,甚至是 10 年前的浏览器。
唯一的例外是当你必须支持 IE5 之类的东西时。如果你在那里,那么你就只能靠自己了。那些古老的浏览器与今天的浏览器完全不同,这里给出的建议对您使用它们几乎没有帮助。好的一面是,如果您在那里,您可能只需要支持一种浏览器,这样就可以消除兼容性问题。
祝你好运!
**更新2:**嘿,好久不见了! 6年后,新的选择出现了。我刚刚在下面的评论中进行了讨论,这里有更多适用于当今浏览器的技巧。
选项 1 - 绝对定位。当您知道第一部分的精确高度时,效果会很好而且干净。
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.first-row {position: absolute;top: 0; left: 0; right: 0; height: 100px; background-color: lime;}
.second-row {position: absolute; top: 100px; left: 0; right: 0; bottom: 0; background-color: red }
.second-row iframe {display: block; width: 100%; height: 100%; border: none;}
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<div class="second-row">
<iframe src="https://jsfiddle.net/about"></iframe>
</div>
运行代码片段隐藏结果
展开片段
一些注意事项 -second-row
容器是必需的,因为由于某种原因bottom: 0
,它right: 0
不能在 iframe 上工作。与“被替换”元素有关。但是width: 100%
并且height: 100%
工作得很好。display: block
是必需的,因为inline
默认情况下它是一个元素,否则空格会开始产生奇怪的溢出。
选项 2 - 表格。当您不知道第一部分的高度时适用。您可以使用实际<table>
标签,也可以使用display: table
.我会选择后者,因为现在它似乎很流行。
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.row-container {display: table; empty-cells: show; border-collapse: collapse; width: 100%; height: 100%;}
.first-row {display: table-row; overflow: auto; background-color: lime;}
.second-row {display: table-row; height: 100%; background-color: red; overflow: hidden }
.second-row iframe {width: 100%; height: 100%; border: none; margin: 0; padding: 0; display: block;}
<div class="row-container">
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<div class="second-row">
<iframe src="https://jsfiddle.net/about"></iframe>
</div>
</div>
运行代码片段隐藏结果
展开片段
一些注意事项 -overflow: auto
确保该行始终包含其所有内容。否则浮动元素有时会溢出。第二行height: 100%
确保它尽可能扩展,将第一行压缩得尽可能小。
推荐:选项 3 - flexbox - 其中最干净的一个。
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.row-container {display: flex; width: 100%; height: 100%; flex-direction: column; background-color: blue; overflow: hidden;}
.first-row {background-color: lime; }
.second-row { flex-grow: 1; border: none; margin: 0; padding: 0; }
<div class="row-container">
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<iframe src="https://jsfiddle.net/about" class="second-row"></iframe>
</div>
运行代码片段隐藏结果
展开片段
一些注意事项 - 这overflow: hidden
是因为即使在这种情况下,iframe 仍然会产生某种溢出display: block
。它在全屏视图或代码片段编辑器中不可见,但小预览窗口有一个额外的滚动条。不知道那是什么,iframe 很奇怪。