Update in 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>
The rest of this answer is left for learning & historical reasons.
诀窍在于了解100%是什么。阅读CSS规范可以帮助你。
长话短说 - 存在所谓的“包含块”,它并不必须是父元素。简单地说,它是在层次结构中具有 position:relative 或 position:absolute 的第一个元素。如果没有其他元素,则是 body 元素本身。因此,当您说“width: 100%”时,它会检查“包含块”的宽度,并将您的元素的宽度设置为相同大小。如果有其他东西存在,则您可能会得到比自身更大的“包含块”内容(因此“溢出”)。
高度的工作方式是相同的。除了一个例外。您无法将高度设置为浏览器窗口的100%。可以计算出100%的最高级元素是body(或html?不确定)元素,并且它只要容纳其内容就足够了。在它上面指定height:100%将没有任何效果,因为它没有“父元素”可以测量100%。窗口本身不计入其中。;)
要让某个东西恰好拉伸到窗口的100%,您有两个选择:
- Use JavaScript
- Don t use DOCTYPE. This is not a good practice, but it puts the browsers in "quirks mode", in which you can do height="100%" on elements and it will stretch them to the window size. Do note, that the rest of your page will probably have to be changed too to accommodate for the DOCTYPE changes.
更新:我不确定我在发布这篇文章时是否已经出错了,但现在肯定已经过时了。今天,您可以在样式表中执行以下操作:html,body {height:100%}
,它实际上将扩展到您的整个视口。即使带有 DOCTYPE。根据您的情况,min-height:100%
也可能有用。
我也不会建议任何人制作quirks-mode文档,因为它会带来比解决问题更多的烦恼。每个浏览器都有不同的quirks-mode,因此要让您的页面在浏览器中保持一致,就变得更加困难。始终使用DOCTYPE。最好使用HTML5一个-。它很容易记住,并且在所有浏览器中都可以正常运行,即使是10年前的浏览器也是如此。
唯一的例外是当你必须支持类似 IE5 的东西时。如果你在那里,那么你无论如何都要自己解决。那些古老的浏览器与今天的浏览器完全不同,这里给出的任何建议都不会对它们有帮助。但好的一面是,如果你在那里,你可能只需要支持一种浏览器,这样可以消除兼容性问题。
祝你好运! (Zhù nǐ hǎo yùn!)
更新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
在某些情况下不能用于iframes。这与它是“替换”元素有关。但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
是因为在这种情况下,即使使用display: block
,iframe仍会生成某种溢出。它在全屏视图或片段编辑器中不可见,但是小预览窗口会获得额外的滚动条。不知道那是什么,iframes很奇怪。