or for a more dynamic allows display: table-rowwhich of at the成本受限的小位的性能。anyways,the basic of them are -的想法,创造一些wrapper元素延伸方式You need the position,然后与width: 100%; height: 100%; margin: 0; padding: 0; border: noneiframe里面。
茶与绝对定位的问题,如果把它正确,is that在实践你不知道to set the顶和底。the height of the first is by its merely集装箱内容矛盾,我不知道任何方式reliably to its EEA集身高,nor the IFRAME的顶部的容器。我attempt here is to remove那些settings and the result is the Whole":jsfiddle.net / t1h0zwoq iframe is
"你的意思dmitrizaitsev is the second row"?无论如何,if the size of the first面板不知道,那么你可以使用的talked about that table的把戏。这是一jsfiddle.net t1h0zwoq example:/ / 2。s as the tables的风格和使As needed them弹力。overflow:automakes the on the first row to its肯定它会永远延伸内容。the second row means that on the height: 100%is left to不管它会伸展after the第一行。display:blockand the is on the这是因为默认的模式和thus creating the inlineWeird overflows空格开始。
@德米特里扎伊采夫-事实上,让我们不要忘记好的旧flexbox。这实际上是最干净的解决方案:jsfiddle.net/t1h0zwoq/3请注意,浏览器支持不是很好,特别是如果您对旧版本的IE感兴趣的话。IE10需要-ms-前缀,而IE9根本不支持它。除此之外,还不错。
太棒了,谢谢!flexbox确实是最干净的,但是表格也很好学习,而且似乎在没有溢出的情况下工作:jsfiddle.net/dmitri14/1uch3zgx/2
@Dmitrizaitsev-我也更新了答案。而且,是的,可能不需要其中的一些。但是你自己检查一下——今天我自己了解到,iframe比乍一看要挑剔得多。
非常感谢您的更新!我想,这的确是个挑剔的问题,正是这个问题的原因。是的,两个overflows都可以取消注释,几乎不使用css:jsfiddle.net/dmitri14/1uqh3zgx/3就能很好地工作。
可能值得将最新更新移到这个答案的顶部。我必须通读整个过程才能找到最好的答案,flexbox。
@原谅-真的。在这个答案的开头添加了一个注释。
我们使用一个javascript来解决这个问题;这里是源代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| var buffer = 20; //scroll bar buffer
var iframe = document.getElementById('ifm');
function pageY(elem) {
return elem.offsetParent ? (elem.offsetTop + pageY(elem.offsetParent)) : elem.offsetTop;
}
function resizeIframe() {
var height = document.documentElement.clientHeight;
height -= pageY(document.getElementById('ifm'))+ buffer ;
height = (height < 0) ? 0 : height;
document.getElementById('ifm').style.height = height + 'px';
}
// .onload doesn't work with IE8 and older.
if (iframe.attachEvent) {
iframe.attachEvent("onload", resizeIframe);
} else {
iframe.onload=resizeIframe;
}
window.onresize = resizeIframe; |
注:ifm为iframe id
pageY()由jquery的作者john resig创建。
另一种方法是在父节点上使用position: fixed;。如果我没有弄错,position: fixed;将元素与viewport相关联,因此,一旦给这个节点width: 100%;和height: 100%;属性,它将覆盖整个屏幕。从这一点开始,您可以将标记放在它里面,并使用简单的width: 100%; height: 100%;css指令将它跨越剩余空间(宽度和高度)。
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| body {
margin: 0px;
padding: 0px;
}
/* iframe's parent node */
div#root {
position: fixed;
width: 100%;
height: 100%;
}
/* iframe itself */
div#root > iframe {
display: block;
width: 100%;
height: 100%;
border: none;
} |
1 2 3 4 5 6 7 8 9 10 11 12 13
| <html>
<head>
iframe Test
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<iframe src="http://stackoverflow.com/">
Your browser does not support inline frames.
</iframe>
</body>
</html> |
- 如何获取"剩余"高度?
- 我注意到您还需要在iframe中添加position: fixed。
- 谢谢你,修好了我的SSRS报告高度,自杀避免了又一天。
- 没有可见的滚动条
- 完美-你能解释一下CSS的">"吗?比如Div Root>iframe furtheras,我不熟悉,找不到参考资料。
- @Andrej也可以启用滚动条
你可以使用DOCTYPE,但是你必须使用table。看看这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<style>
*{margin:0;padding:0}
html, body {height:100%;width:100%;overflow:hidden}
table {height:100%;width:100%;table-layout:static;border-collapse:collapse}
iframe {height:100%;width:100%}
.header {border-bottom:1px solid #000}
.content {height:100%}
</style>
</head>
<body>
<table>
<tr><td class="header">Header</td></tr>
<tr><td class="content">
<iframe src="http://google.com/" frameborder="0"></iframe></td></tr>
</table>
</body>
</html> |
- 至少它不需要JS!!但是网络安全吗?
- 这种解决方案的缺点是,html,body overflow:hidden;将删除页面滚动。
- 我试图在上面的代码中添加页脚,但没有显示页脚。你能帮忙吗?
以下是一些现代方法:
1虽然它似乎在chrome/ff中工作,但它在ie(第一个方法在所有当前浏览器中都工作)中不工作。
- 方法1似乎对我很有效。
- 这里提到的两个选项是最佳方法。我更喜欢flexbox选项,因为对于calc,您需要知道从vh中扣除的空间量。用flexbox一个简单的flex-grow:1就可以了。
也许这已经被回答了(上面的一些回答是"正确的"方法),但我想我也应该添加我的解决方案。
我们的iframe加载在一个div中,因此我需要其他东西,然后window.height。鉴于我们的项目已经严重依赖jquery,我发现这是最优雅的解决方案:
1
| $("iframe").height($("#middle").height()); |
当然,其中"middle"是DIV的ID。您需要做的唯一额外的事情就是每当用户调整窗口的大小时,调用这个大小更改。
1 2 3
| $(window).resize(function() {
$("iframe").height($("#middle").height());
}); |
我就是这么做的。我也遇到了同样的问题,结果在网上搜索了几个小时的资源。
10我在头部加了这个。
请注意,我的iframe位于具有3行1列的表的中间单元格中。
- 您的代码只能在包含iframe的td的height:100%下工作。如果表包含在一个DIV元素中,它将起作用,因为所有DIV的样式都具有高度:100%。
michadel代码对我有用,但我做了一些小修改以使它正常工作。
1 2 3 4 5 6 7 8 9 10 11 12
| function pageY(elem) {
return elem.offsetParent ? (elem.offsetTop + pageY(elem.offsetParent)) : elem.offsetTop;
}
var buffer = 10; //scroll bar buffer
function resizeIframe() {
var height = window.innerHeight || document.body.clientHeight || document.documentElement.clientHeight;
height -= pageY(document.getElementById('ifm'))+ buffer ;
height = (height < 0) ? 0 : height;
document.getElementById('ifm').style.height = height + 'px';
}
window.onresize = resizeIframe;
window.onload = resizeIframe; |
请尝试以下操作:
1
| <iframe name="" src="" width="100%" style="height: 100em"/> |
它对我有用
- 不填充父级,只在iframe上放置一个较大的高度。
是的,你展示的是一个100%高度的iframe容器:主体。
试试这个:
1 2 3 4 5 6 7
| <body>
Banner
<iframe src="http: //www.google.com.tw" style="width:100%; height:100%;">
</iframe>
</body> |
当然,将第二个DIV的高度更改为所需的高度。
- 30px + 90%!= 100%
- 不间断电源!你说得对!我的解决方案无效:$
- 但我更喜欢@aremesal的回答。它非常简单,但功能强大。谢谢
- 可以使用calc(100%-30px)而不是90%
您可以这样使用HTML/CSS:
1 2 3 4
| <body>
Banner
<iframe src="http: //www.google.com.tw" style="position:fixed;top:30px;bottom:0px;width:100%;"></iframe>
</body> |
我用display:table解决了类似的问题。它几乎适用于此,只留下一个小的垂直滚动条。如果您试图用iframe以外的东西填充这个灵活的列,它可以正常工作(而不是
采用以下HTML
1 2 3 4 5 6 7 8
| <body>
Banner
<iframe src="http: //www.google.com.tw" style="width:100%; height:100%;border:0;"></iframe>
</body> |
将外部DIV更改为使用display:table,并确保设置了宽度和高度。
1 2 3 4 5
| .outer {
display: table;
height: 100%;
width: 100%;
} |
将横幅设为表格行,并将其高度设置为您的首选值:
1 2 3 4 5
| .banner {
display: table-row;
height: 30px;
background: #eee;
} |
在iframe(或您需要的任何内容)周围添加一个额外的DIV,并使其成为高度设置为100%的表行(如果要嵌入iframe以填充高度,则设置其高度至关重要)。
1 2 3 4
| .iframe-container {
display: table-row;
height: 100%;
} |
下面是一个工作时显示它的JSfiddle(没有iframe,因为它似乎在fiddle中不起作用)
网址:https://jsfiddle.net/yufceynk/1/
HTML5中的新功能:使用Calc(高度)
1 2 3 4 5 6
| <html style="width:100%; height:100%; margin: 0px; padding: 0px;">
<body style="width:100%; height:100%; margin: 0px; padding: 0px;">
Banner
<iframe src="http://www.google.com.tw" style="width:100%; height: calc(100% - 30px);"></iframe>
</body>
</html> |
在尝试了一段时间的CSS路径之后,我最终在jquery中编写了一些相当基本的东西,这些东西为我完成了任务:
1 2 3 4 5 6 7 8 9 10 11
| function iframeHeight() {
var newHeight = $j(window).height();
var buffer = 180; // space required for any other elements on the page
var newIframeHeight = newHeight - buffer;
$j('iframe').css('height',newIframeHeight); //this will aply to all iframes on the page, so you may want to make your jquery selector more specific.
}
// When DOM ready
$(function() {
window.onresize = iframeHeight;
} |
在IE8、Chrome、Firefox 3.6中测试
我认为你在这里有一个概念上的问题。说"我试过在iframe上设置高度:100%,结果很接近,但是iframe试着填满整个页面",那么,"100%"什么时候不等于"整体"?
您已要求iframe填充其容器(即主体)的整个高度,但不幸的是,它有一个块级别的兄弟体,上面您要求的是30px大。因此,现在要求父容器合计的大小为100%+30px>100%!因此滚动条。
我认为您的意思是,您希望iframe使用剩下的框架和表格单元格可以使用的内容,即height="*"。IIRC这不存在。
不幸的是,据我所知,也没有办法有效地混合/计算/减去绝对单位和相对单位,所以我认为您可以减少到两个选项:
绝对定位你的部门会把它从容器里拿出来吗?只有iframe会消耗它集装箱高度。这留给你还有各种各样的问题尽管如此,但也许是因为你做不透明度或对齐将是好啊。
或者,您需要指定%DIV的高度并减少我的名字高那么多。如果绝对高度你需要申请的那一点很重要到DIV的子元素相反。
类似于@michadel的答案,但我使用的是jquery,而且更优雅。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <script type="text/javascript">
$(document).ready(function() {
var $iframe = $('#iframe_id')[0];
// Calculate the total offset top of given jquery element
function totalOffsetTop($elem) {
return $elem.offsetTop + ($elem.offsetParent ? totalOffsetTop($elem.offsetParent) : 0);
}
function resizeIframe() {
var height = window.innerHeight || document.body.clientHeight || document.documentElement.clientHeight;
height -= totalOffsetTop($iframe);
$iframe.height = Math.max(0, height) + 'px';
}
$iframe.onload = resizeIframe();
window.onresize = resizeIframe;
}); |
iframe_id是iframe标签的ID
它将与下面提到的代码一起工作
1
| <iframe src="http: //www.google.com.tw"style="position: absolute; height: 100%; border: none"></iframe> |
一个简单的jquery解决方案
在iframed页内的脚本中使用此命令
1 2 3 4 5 6 7 8 9 10 11 12
| $(function(){
if(window != top){
var autoIframeHeight = function(){
var url = location.href;
$(top.jQuery.find('iframe[src="'+ url +'"]')).css('height', $('body').height()+4);
}
$(window).on('resize',autoIframeHeight);
autoIframeHeight();
}
} |
您不能以%设置iframe高度,因为您的父体高度不是100%,所以将父体高度设置为100%,然后应用iframe高度100%
1 2 3 4 5 6 7 8 9 10 11
| For eg.
<html>
<head>
<style>
html,body{height:100%}
</style>
</head>
<body>
<iframe src="http://www.quasarinfosystem.com" height="100%" width="100%"></iframe>
</body>
</html> |
我认为使用CSS位置实现这个场景的最佳方法。设置相对于父分区的位置和位置:相对于iframe的绝对位置。
1 2 3 4 5 6 7 8 9 10 11
| .container{
width:100%;
position:relative;
height:500px;
}
iframe{
position:absolute;
width:100%;
height:100%;
} |
1 2 3 4 5
| <iframe src="http://www.w3schools.com">
<p>
Your browser does not support iframes.
</p>
</iframe> |
对于其他填充和页边距问题,days css3 calc()非常高级,而且大多数情况下也与所有浏览器兼容。
校验码()
或者你可以去上大学,用一个框架,也许:
1 2 3 4
| <frameset rows="30,*">
<frame src="banner.swf"/>
<frame src="inner.html" />
</frameset> |
- 是的,但是框架集只能在HTML5之前工作。
- @vdbuilder:不,它只在HTML5之前有效。我打赌它还能用。;-)
为什么不这样做(车身衬垫/边缘稍微调整一下)
1 2
| var oF = document.getElementById("iframe1");
oF.style.height = document.body.clientHeight - oF.offsetTop - 0; |
您可以通过在加载/调整大小事件时测量主体大小,并将高度设置为(全高-横幅高度)。
请注意,当前在IE8 beta2中,不能对Resize执行此操作,因为该事件当前在IE8 beta2中已被破坏。
虽然我同意JS似乎是一个更好的选择,但我有一个仅限于CSS的工作解决方案。它的缺点是,如果您必须经常向iframe html文档添加内容,那么您必须调整一个百分比的槽时间。
解决方案:
尽量不要为两个HTML文档指定任何高度,
1
| html, body, section, main-div {} |
然后只对其进行编码:
1 2
| #main-div {height:100%;}
#iframe {height:300%;} |
注意:DIV应该是您的主要部分。
这应该相对有效。iframe精确计算300%的可见窗口高度。如果第二个文档(在iframe中)中的HTML内容的高度小于浏览器高度的3倍,则可以正常工作。如果您不需要经常向该文档添加内容,这是一个永久的解决方案,您可以根据内容高度找到自己需要的百分比。
这是因为它阻止第二个HTML文档(嵌入的文档)从父HTML文档继承其高度。它阻止了它,因为我们没有为它们都指定高度。当我们给孩子一个百分比时,它会寻找它的父代,如果不是,它会获取它的内容高度。只有在其他容器没有给出高度的情况下,从我的尝试。
"无缝"属性是旨在解决此问题的新标准:
http://www.w3schools.com/tags/att_iframe_无缝.asp
分配此属性时,它将删除边框和滚动条,并将iframe调整为其内容大小。尽管它只在Chrome和最新的Safari中受支持
更多信息:HTML5 iframe无缝属性
如果您有权访问将要加载的iframe的内容,则可以告诉其父级在其调整大小时调整大小。
10如果页面上有多个iframe,可能需要使用id或其他巧妙的方法来增强.find("iframe"),以便选择正确的iframe。