设置 iframe 以占用页面中的剩余空间

Posted

技术标签:

【中文标题】设置 iframe 以占用页面中的剩余空间【英文标题】:Setting iframe to take remaining space in page 【发布时间】:2012-11-05 01:13:06 【问题描述】:

关于 iframe 及其高度有很多问题。有些是相似的,但没有给我正确的答案。所以让我解释一下我的情况:

JSFiddle:http://jsfiddle.net/AmVhK/3/show/ 编辑:http://jsfiddle.net/AmVhK/3/

有一个有 2 行的表。第一个包含一个 fixed 高度的 div #toolbar。第二行包含一个包含 iframe 的 div。我需要 iframe 来占用工具栏 div 下方的可用空间。

我面临的问题是 IE 标准模式(支持 IE8+)。 比方说,窗口的高度是 1000px,工具栏的高度是 200px,那么 iframe 的高度也是 1000px,滚动条也是如此。我需要 iframe 的高度为(页面高度-工具栏高度)。

如果有 CSS 解决方案就好了。使用 javascript 获取可用高度并将其设置为 iframe 或包含 div 是我最后的解决方案:)

将工具栏或 iframe 设置为绝对位置也不适用于我的用例。 如有必要,可以更改标记(如果您想删除表格)

我已经设置了以下 CSS:

html, body height: 100%

实现它的任何好的解决方案。

【问题讨论】:

我想你想要这个jsfiddle.net/AmVhK/6 @RohitAzad,iframe 占用的空间仍然比可用空间多。 您是否对使用表格一事无成? hmmmm,去老派并使用框架集? (例如meingutscheincode.de/gutschein-anzeigen/…) 哦不,框架集,我的一个客户在 2012 年还有一个! 【参考方案1】:

我认为您可以简单地隐藏父滚动条并获得所需的内容。就像简单地添加overflow-y hidden一样:

html, body 
        height: 100%;
        overflow-y:hidden;
    

【讨论】:

【参考方案2】:

摆脱垂直滚动

使用此代码应该只留下内部 (iframe) 滚动:

html, body

    height:    100%;
    width:     100%;
    position: fixed;

注意事项:

    需要width(如absolute)。 absolute 没有帮助你是对的。 这实际上对于您想要实现的目标是有意义的(如果我说得对的话)。

浏览器支持:

可能有点问题,但应该从 IE7 (quirksmode) 开始支持。


希望我的问题是正确的。

【讨论】:

【参考方案3】:

这很干净,因为它可以让您注意到您最初的问题提到工具栏具有固定高度。最少的代码,无需包装元素,无需表格,兼容 IE8+/Chrome/Fox。

但是,在 Dale 解决方案的 cmets 中,您提到工具栏高度是灵活的,并且需要 iframe 进行调整 - 这是一个主要的游戏规则改变者,我建议您去掉您的要求,因为它实际上是不可能实现的在 CSS2 中没有额外的 JS 和/或可怕的 CSS hack。如果你不希望 IE

由于工具栏灵活高度的原因是您提到的不同状态的动画,我建议您使用下面的代码为工具栏 height 和 iframe padding-top 同时实现所需的灵活性而不仅仅是工具栏的高度。它不需要动画本身之外的任何额外 JavaScript,因此唯一的“缺点”是动画 2 个属性而不是 1 个。布局的其余部分将进行微调。

<style type="text/css">
html, body 
    height: 100%;
    margin: 0;

#toolbar 
    position: absolute;
    width: 100%;
    height: 200px; /* animate this */

#cblt_content 
    display: block;
    width: 100%;
    height: 100%;
    padding-top: 200px; /* and this */
    box-sizing: border-box;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    border: 0;

</style>

<div id="toolbar">Toolbar</div>
<iframe id="cblt_content" src="https://c9.io/"></iframe>

【讨论】:

【参考方案4】:

解决办法是

<!DOCTYPE html>
<html>
    <head>
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <title> - Webduos Demo</title>

        <style type="text/css">
            * border: 0;  line-height: 0;  margin: 0; padding: 0; 

            html, body   height: 100%;  

            #layout  position: relative; width: 100%; min-height: 100%; overflow-y: hidden; background-color: green; 

            #toolbar   width: 100%;  height: 160px;  background-color: blue;  

            #content-wrapper   position:absolute;  top:180px; bottom: 0px; width: 100%; background-color: #0000dd;  

            #content width: 100%; height: 100%;  
        </style>
    </head>
    <body>
        <div id="layout">
            <div id="toolbar">

            </div>
            <div id="content-wrapper">
                <iframe id="content" name="content" src="https://google.com/" border="0"></iframe>
            </div>
        </div>
    </body>
</html>

【讨论】:

【参考方案5】:

应该这样做!这是快速预览链接:http://jsfiddle.net/AmVhK/15/show/

<style type="text/css">
    html, body 
        height: 100%;
    margin: 0;
    padding: 0;
    
    #contentiframewrapper, #cblt_content 
    /* max-height: 100%;
    min-height: 99.9%;*/
    height: 99.9%;
    margin: 0;
    padding: 0;
    line-height: 0;
    
    #toolbar 
        height: 100px !important;
        background-color: #CCC;
        text-align: center;
        font-size: 50px;
        vertical-align: middle;
    
</style>
<table   cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td valign="top" id="toolbar">Toolbar
            </td>
        </tr>
        <tr>
            <td  valign="top" >
                <div align="center" id="contentiframewrapper">
                     <iframe  frameborder="0" name="cblt_content" id="cblt_content" src="https://c9.io/" border="0"></iframe>
                </div>
           </td>
    </tr>
    </tbody>
</table>​

我已经在 Chrome 和 IE8 中对其进行了测试,并且它适用于我。它可能会在 IE8 中的 JSFiddle 中出现错误,但如果您将其视为单独的页面(在正常情况下),它不应该。

编辑: 对原代码做了一些小改动。但是,如果您更改工具栏的高度,则必须将保存 iFrame 高度值的&lt;td&gt; 更改为新高度。对于 IE,没有神奇的 % 值(除非你使用 JS,当然你不想要它),它只是反复试验。

【讨论】:

% 的高度不会考虑更大的屏幕。所以虽然它可能很适合你的屏幕..如果我的分辨率是你的两倍(或一半),事情可能 - 并且可能会 - 搞砸了。 尝试弄乱浏览器大小,如果您进入屏幕的 1/3 以下,滚动条会显示(至少这是我所经历的),iFrame 会缩放到更大浏览器尺寸没有任何问题,顺便说一句,我正在使用 15 英寸笔记本电脑,它可能会对上网本造成问题,但没有 JS,我认为这接近于最好的解决方案(不是指我的解决方案,而是使用 % 值高度)。 我想我必须同意。我以前解决过这个问题,但总是用一些 javascript 技巧。 我投了反对票,因为这不是一个好的解决方案。为此使用表格是不必要的,并且在语义上是错误的,并且您尝试建议的高度百分比操场产生的问题比它试图解决的要多。 好吧,店主说“如有必要”可以更改标记,据我个人了解,您可以更改标记,但这并不是最好的选择。我只是为现有的问题提供了一个解决方案,但请告诉我您使用“带表”而不使用 JS 来解决问题?我看到您在这方面知识渊博,所以我可能需要向您学习。【参考方案6】:

这是在 IE8 和 FF17 中测试的解决方案

<!DOCTYPE html>
<html>
    <head>
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <title> - jsFiddle demo</title>

        <style type="text/css">
            *
            
                border: 0;
                line-height: 0;
                margin: 0;
                padding: 0;
            

            html,
            body
            
                height: 100%;
            

            #layout
            
                position: relative;
                width: 100%;
                min-height: 100%;
                            overflow-y: hidden;

                background-color: green;
            

            #toolbar
            
                width: 100%;
                height: 200px;

                background-color: blue;
            

            #content-wrapper
            
                position: absolute;
                top: 200px;
                bottom: 0px;

                width: 100%;

                background-color: red;
            

            #content
            
                width: 100%;
                height: 100%;
            
        </style>
    </head>
    <body>
        <div id="layout">
            <div id="toolbar">

            </div>
            <div id="content-wrapper">
                <iframe id="content" name="content" src="https://c9.io/" border="0"></iframe>
            </div>
        </div>
    </body>
</html>

【讨论】:

我们的答案非常相似,但我输入了一个 overflow-y: hidden;消除这个问题:) 编辑:边框:0;行高:0;在 FF 中固定 100%,宽度在 IE8 中完美(没有 IE9 和 7),当然可以在工具栏中重置行高。 在 FireBug 中看到完美的高度和 line-height: 0 真的很奇怪固定到 Firefox.. IE 需要溢出-y:隐藏;交叉浏览是一门艺术! 是否可以在不使用绝对位置的情况下实现这一点。工具栏的高度会随着用户交互的动画而变化,并且会有所不同。 iframe 应该随之移动,所以我想最好把它留给浏览器。 你可以用 JavaScript 做动态部分来更新工具栏高度和内容包装器顶部,但没有找到没有绝对定位的解决方案!【参考方案7】:

好的,这是我的尝试,iframe 有问题,希望在 IE7 中有水平滚动,但布局很好,我不得不放弃,因为与 IE7 的斗争让我想咬自己的眼睛,希望有人可以从这里扩展。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>iframelayout</title>
        <style>
            html, body 
                margin: 0;
                padding: 0;
                height: 100%;
            

            div, iframe 
                margin: 0;
                padding: 0;
                border: 0;
            

            .container 
                position: relative;
                width: 100%;
                height: 100%;
                background: #222;
            

            .toolbar 
                height: 200px;
                background: #aaa;
            

            .iframe-container 
                position: absolute;
                top: 200px;
                bottom: 0;
                width: 100%;
                background: #555;
                overflow-y: hidden;
            

            .iframe-container iframe 
                position: absolute;
                width: 100%;
                height: 100%;
            
        </style>
    </head>

    <body>
        <div class="container">
            <div class="toolbar">

            </div>
            <div class="iframe-container">
                <iframe src="https://c9.io/" frameborder="0">Your browser is kaput!</iframe>
            </div>
        </div>
    </body>
</html>

【讨论】:

抱歉回复晚了。是否可以在不使用绝对位置的情况下实现这一点。工具栏的高度会随着用户交互的动画而变化,并且会有所不同。 iframe 应该随之移动,所以我想最好把它留给浏览器。 是否可以将.iframe-container top 属性与工具栏一起设置动画? 例如,您可以为设置 .iframe-container top: 200px; 的工具栏动画提供回调。 为工具栏的计算高度 工具栏的高度会随着按下的不同按钮而变化,因为不同的功能集需要不同的标记和高度来显示。 @sv_in 需要灵活高度的工具栏使整个问题变得更加困难,您应该在 OP 中提到这一点。设置高度,没有表格和非常干净的代码就相当简单。当我写 OP 评论时,我不知道您希望工具栏灵活,这是一个游戏规则改变者,将不得不重写解决方案。

以上是关于设置 iframe 以占用页面中的剩余空间的主要内容,如果未能解决你的问题,请参考以下文章

如何设置html元素,使其耗尽剩余的可视垂直空间

JavaFx GridPane 中的相对大小

使 TabBarView 占用所有剩余空间

剩余空间中的自动布局居中视图(以编程方式)

响应式布局:调整 SVG 大小以填充其父级的剩余空间

如何设置管理面板的内容区域以占用剩余宽度[重复]