html剩余高度的100,关于html:使Iframe适合容器剩余高度的100%

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来解决这个问题;这里是源代码。

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.οnlοad=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指令将它跨越剩余空间(宽度和高度)。

示例代码

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;

}

iframe Test

Your browser does not support inline frames.

如何获取"剩余"高度?

我注意到您还需要在iframe中添加position: fixed。

谢谢你,修好了我的SSRS报告高度,自杀避免了又一天。

没有可见的滚动条

完美-你能解释一下CSS的">"吗?比如Div Root>iframe furtheras,我不熟悉,找不到参考资料。

@Andrej也可以启用滚动条

你可以使用DOCTYPE,但是你必须使用table。看看这个:

*{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%}

Header

至少它不需要JS!!但是网络安全吗?

这种解决方案的缺点是,html,body overflow:hidden;将删除页面滚动。

我试图在上面的代码中添加页脚,但没有显示页脚。你能帮忙吗?

以下是一些现代方法:

方法1——视区相对单位/calc()的组合。

表达式calc(100vh - 30px)表示剩余高度。其中,100vh是浏览器的高度,使用calc()可以有效地替换另一个元素的高度。

这里例子

body {

margin: 0;

}

.banner {

background: #f00;

height: 30px;

}

iframe {

display: block;

background: #000;

border: none;

height: calc(100vh - 30px);

width: 100%;

}

这里支持calc();这里支持视区相关单位。

2号进近-柔性箱进近

这里例子

将公共父元素的display设置为flex,同时将flex-direction: column设置为(假设希望元素彼此堆叠在一起)。然后在子元素iframe上设置flex-grow: 1,以便它填充剩余的空间。

body {

margin: 0;

}

.parent {

display: flex;

flex-direction: column;

min-height: 100vh;

}

.parent .banner {

background: #f00;

width: 100%;

height: 30px;

}

.parent iframe {

background: #000;

border: none;

flex-grow: 1;

}

由于这种方法的支持度较低1,我建议采用上述方法。

1虽然它似乎在chrome/ff中工作,但它在ie(第一个方法在所有当前浏览器中都工作)中不工作。

方法1似乎对我很有效。

这里提到的两个选项是最佳方法。我更喜欢flexbox选项,因为对于calc,您需要知道从vh中扣除的空间量。用flexbox一个简单的flex-grow:1就可以了。

也许这已经被回答了(上面的一些回答是"正确的"方法),但我想我也应该添加我的解决方案。

我们的iframe加载在一个div中,因此我需要其他东西,然后window.height。鉴于我们的项目已经严重依赖jquery,我发现这是最优雅的解决方案:

$("iframe").height($("#middle").height());

当然,其中"middle"是DIV的ID。您需要做的唯一额外的事情就是每当用户调整窗口的大小时,调用这个大小更改。

$(window).resize(function() {

$("iframe").height($("#middle").height());

});

我就是这么做的。我也遇到了同样的问题,结果在网上搜索了几个小时的资源。10

我在头部加了这个。

请注意,我的iframe位于具有3行1列的表的中间单元格中。

您的代码只能在包含iframe的td的height:100%下工作。如果表包含在一个DIV元素中,它将起作用,因为所有DIV的样式都具有高度:100%。

michadel代码对我有用,但我做了一些小修改以使它正常工作。

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;

请尝试以下操作:

它对我有用

不填充父级,只在iframe上放置一个较大的高度。

是的,你展示的是一个100%高度的iframe容器:主体。

试试这个:

Banner

当然,将第二个DIV的高度更改为所需的高度。

30px + 90%!= 100%

不间断电源!你说得对!我的解决方案无效:$

但我更喜欢@aremesal的回答。它非常简单,但功能强大。谢谢

可以使用calc(100%-30px)而不是90%

您可以这样使用HTML/CSS:

Banner

我用display:table解决了类似的问题。它几乎适用于此,只留下一个小的垂直滚动条。如果您试图用iframe以外的东西填充这个灵活的列,它可以正常工作(而不是

采用以下HTML

Banner

将外部DIV更改为使用display:table,并确保设置了宽度和高度。

.outer {

display: table;

height: 100%;

width: 100%;

}

将横幅设为表格行,并将其高度设置为您的首选值:

.banner {

display: table-row;

height: 30px;

background: #eee;

}

在iframe(或您需要的任何内容)周围添加一个额外的DIV,并使其成为高度设置为100%的表行(如果要嵌入iframe以填充高度,则设置其高度至关重要)。

.iframe-container {

display: table-row;

height: 100%;

}

下面是一个工作时显示它的JSfiddle(没有iframe,因为它似乎在fiddle中不起作用)

网址:https://jsfiddle.net/yufceynk/1/

HTML5中的新功能:使用Calc(高度)

Banner

在尝试了一段时间的CSS路径之后,我最终在jquery中编写了一些相当基本的东西,这些东西为我完成了任务:

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,而且更优雅。

$(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

它将与下面提到的代码一起工作

一个简单的jquery解决方案

在iframed页内的脚本中使用此命令

$(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%

For eg.

html,body{height:100%}

我认为使用CSS位置实现这个场景的最佳方法。设置相对于父分区的位置和位置:相对于iframe的绝对位置。

.container{

width:100%;

position:relative;

height:500px;

}

iframe{

position:absolute;

width:100%;

height:100%;

}

Your browser does not support iframes.

对于其他填充和页边距问题,days css3 calc()非常高级,而且大多数情况下也与所有浏览器兼容。

校验码()

或者你可以去上大学,用一个框架,也许:

是的,但是框架集只能在HTML5之前工作。

@vdbuilder:不,它只在HTML5之前有效。我打赌它还能用。;-)

为什么不这样做(车身衬垫/边缘稍微调整一下)

var oF = document.getElementById("iframe1");

oF.style.height = document.body.clientHeight - oF.offsetTop - 0;

最后需要用+'px'替换-0。它在手机上工作吗?

您可以通过在加载/调整大小事件时测量主体大小,并将高度设置为(全高-横幅高度)。

请注意,当前在IE8 beta2中,不能对Resize执行此操作,因为该事件当前在IE8 beta2中已被破坏。

虽然我同意JS似乎是一个更好的选择,但我有一个仅限于CSS的工作解决方案。它的缺点是,如果您必须经常向iframe html文档添加内容,那么您必须调整一个百分比的槽时间。

解决方案:

尽量不要为两个HTML文档指定任何高度,

html, body, section, main-div {}

然后只对其进行编码:

#main-div {height:100%;}

#iframe {height:300%;}

注意:DIV应该是您的主要部分。

这应该相对有效。iframe精确计算300%的可见窗口高度。如果第二个文档(在iframe中)中的HTML内容的高度小于浏览器高度的3倍,则可以正常工作。如果您不需要经常向该文档添加内容,这是一个永久的解决方案,您可以根据内容高度找到自己需要的百分比。

这是因为它阻止第二个HTML文档(嵌入的文档)从父HTML文档继承其高度。它阻止了它,因为我们没有为它们都指定高度。当我们给孩子一个百分比时,它会寻找它的父代,如果不是,它会获取它的内容高度。只有在其他容器没有给出高度的情况下,从我的尝试。

它只在Chrome思想中起作用…

"无缝"属性是旨在解决此问题的新标准:

http://www.w3schools.com/tags/att_iframe_无缝.asp

分配此属性时,它将删除边框和滚动条,并将iframe调整为其内容大小。尽管它只在Chrome和最新的Safari中受支持

更多信息:HTML5 iframe无缝属性

无缝属性已从HTML5规范中删除。

如果您有权访问将要加载的iframe的内容,则可以告诉其父级在其调整大小时调整大小。10

如果页面上有多个iframe,可能需要使用id或其他巧妙的方法来增强.find("iframe"),以便选择正确的iframe。

Copyright ©  码农家园

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值