我想设计一个带有横幅和iframe的网页。我希望iframe可以填满所有剩余的页面高度,并在浏览器调整大小时自动调整大小。是否可以仅使用CSS而无需编写Javascript代码来完成它?
我尝试height:100%
在iframe上进行设置,结果非常接近,但是iframe尝试填充整个页面高度,包括30px
banner
div元素的高度,因此我得到了不必要的垂直滚动条。这不是完美的。
更新说明
:对不起,我没有很好地描述问题,我尝试使用CSS边距,DIV上的padding属性成功占据了整个页面的刷新高度,但该技巧在iframe上不起作用。
<body>
<div style="width:100%; height:30px; background-color:#cccccc;">Banner</div>
<iframe src="http: //www.google.com.tw" style="width:100%; height:100%;"></iframe>
</body>
任何想法表示赞赏。
TL; DR: 今天,最好的选择是这个答案中的最后一个-
flexbox。一切都很好地支持它,并且已经有很多年了。为此,不要回头。由于历史原因,其余答案均保留下来。
诀窍是要了解100%是什么。阅读CSS规范可以为您提供帮助。
长话短说-有一个“包含块”之类的东西-
父元素不是必需的。简而言之,这是层次结构中具有position:relative或position:absolute的第一个元素。如果没有其他内容,则为body元素本身。因此,当您说“
width:100%”时,它将检查“包含块”的宽度,并将元素的宽度设置为相同的大小。如果那里还有其他东西,那么您可能会获得比其自身大的“包含块”的内容(因此“溢出”)。
高度的工作方式相同。
除了一个例外。
您无法将浏览器窗口的高度提高到100%。最上层的元素(可以计算出100%)是body(或html?不确定)元素,其拉伸范围足以容纳其内容。在其上指定height:100%将无效,因为它没有要对其进行100%测量的“父元素”。窗口本身不计算在内。;)
要使某物精确地延伸到窗口的100%,您有两种选择:
更新: 我不确定发布此消息时是否还没有错,但是现在肯定已经过时了。今天,您可以在样式表中执行此操作:html, body { height: 100% }
它实际上将扩展到整个视口。即使使用DOCTYPE。min-height: 100%
视您的情况而定也可能有用。
而且我 也不建议任何人再做一个怪异模式的文档
,因为它造成的麻烦比解决它们的麻烦多。每种浏览器都有不同的怪癖模式,因此要使页面在各种浏览器中保持一致看起来要困难两个数量级。使用DOCTYPE。总是。最好是HTML5one- <!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
没有在内部框架出于某种原因的工作。与“已替换”元素有关。但是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。其中最干净的一种,但对浏览器的支持不足。IE10
-ms-
的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仍然会产生某种程度的溢出。在全屏视图或代码片段编辑器中看不到它,但是小的预览窗口有一个额外的滚动条。不知道那是什么,iframe很奇怪。
问题内容: 我有一个容器div,我想至少拉伸到整个窗口的高度。如果容器div中有很多内容,我希望它可以扩展到大于窗口的高度。这可行。 在容器div中,我有一个图像。图片下方/下方,我有第二个div。我希望此嵌套div垂直拉伸以填充容器div的剩余空间。这行不通。 我试图用这张图来说明问题。我希望div以右图 左侧 所示的方式拉伸,而不是像 右图 右侧所示。 以下是我的代码。如您所见,在这段代码中,
Fixed 盒子数量不是固定的 Fixed 盒子宽度是固定的 Fill 盒子只有一个 Fill 盒子宽度是动态的 如何让 Fill 填满剩余 Container 的宽度? 如下图
问题内容: 我有一个带两个孩子的容器。第一个孩子有给定的身高。如何让第二个孩子占据容器的“自由空间” 而不给其指定高度? 在示例中,粉红色也应占据白色空间。 与此问题类似:如何使div占据剩余高度? 但是我不想摆 绝对的位置 。 问题答案: 可以通过多种方式扩展子级以填充剩余的空间,具体取决于您希望获得的浏览器支持以及是否具有定义的高度。 样本 格网 CSS的布局提供了另一种选择,尽管它可能不如F
http://jsfiddle.net/s8g4e/ 类似于这个问题:如何使div占据剩余高度? 但我不想给位置绝对。
我有两个div并排放在一个flexbox中。右手边的宽度应该总是一样的,我希望左手边的那个能抓住剩下的空间。但它不会,除非我特别设置它的宽度。 所以目前,它被设置为96%,看起来不错,直到你真的挤压屏幕——然后右手div有点缺乏它需要的空间。 我想我可以让它保持原样,但感觉不对——就像有一种方式可以说: 右边的总是一样的你在左边你得到了剩下的一切
问题内容: 我有这个问题,我有两个股利: 如何使div2占据页面的剩余高度? 问题答案: 使用绝对定位: