最近工作中遇到了iframe自适应高度的问题。

如果在iframe中写定高度height的属性,并且iframe中内容高度小于给定的height时,会在手机浏览器中莫名的产生下拉框,造成体验度下降。

但是如果不去设定height的属性,iframe的高度始终维持在150px,这样的话我们只能够通过js动态的去改变iframe的高度,实现iframe的高度自适应。

高度自适应的本质就是通过内容高度,去设定iframe高度。

然而因为iframe中内容的背景色不一定和父级页面的一致,所以我们在内容高度小于屏幕高度时,使用屏幕高度为iframe的高度。

因而我们通过比较屏幕高度和iframe中内容高的方式,来确定我们iframe最终的显示高度。

父级页面中的iframe代码如下:

<iframe allowtransparency="true" id="content" name="content" src="xxx.html"  scrolling="no" frameborder="0" ></iframe>

获取屏幕尺寸的代码:

function getScreenSize(winObj){
    var size = {
            width : 0,
            height : 0
    }
    // 获取窗口宽度
    if (winObj.innerWidth){
        size.width = winObj.innerWidth;
    }else if ((winObj.document.body) && (winObj.document.body.clientWidth))
        size.width = winObj.document.body.clientWidth;
    // 获取窗口高度
    if (winObj.innerHeight)
        size.height = winObj.innerHeight;
    else if ((winObj.document.body) && (winObj.document.body.clientHeight))
        size.height = winObj.document.body.clientHeight;
    // 通过深入 Document 内部对 body 进行检测,获取窗口大小
    if (winObj.document.documentElement && winObj.document.documentElement.clientHeight
            && winObj.document.documentElement.clientWidth)
    {
        size.height = winObj.document.documentElement.clientHeight;
        size.width = winObj.document.documentElement.clientWidth;
    }
    return size;
}

因为是每次iframe中内容改变的时候,需要iframe的高度自适应,所以我的自适应代码加在iframe中的页面中在页面加载结束后运行:

window.onload = function(){
    //    获取自己在父级页面中的frame节点
    var contentFrame = parent.document.getElementById('content');
    //    获取屏幕高度
    var parentScrHeight = getScreenSize(window.parent).height;
    //    获取自己的内容高度
    var contentHeight = document.body.clientHeight;
    //    若是屏幕高,使用frame内容高度
    //    若是frame内容高,使用屏幕高度
    contentFrame.style.height = parentScrHeight < contentHeight ?
            contentHeight + "px" : parentScrHeight + "px";
};

以上步骤就完成了通过js控制iframe自适应的功能。

注: 当页面中有需要动态加载内容是,页面内容高度会进行改变,这时就需要将以上onload中的内容封装为方法:

 function changeParent(){
      //    获取自己在父级页面中的frame节点
     var contentFrame = parent.document.getElementById('content');
     //    获取屏幕高度
     var parentScrHeight = getScreenSize(window.parent).height;
     //    获取自己的内容高度
     var contentHeight = document.body.clientHeight;
     //    若是屏幕高,使用frame内容高度
     //    若是frame内容高,使用屏幕高度
     contentFrame.style.height = parentScrHeight < contentHeight ?
             contentHeight + "px" : parentScrHeight + "px";
 }

当每次页面进行内容改变时,就可以调用chagneParent方法进行动态的自适应改变。

iframe自适应高度的问题的更多相关文章

  1. jquery 清空 iframe 的内容,,iframe自适应高度

    $(iframe).contents().find("body").html(""); iframe自适应高度 $("#AllDescription& ...

  2. 真正的让iframe自适应高度 兼容多种浏览器随着窗口大小改变

    今天有朋友问到我关于"iframe自适应高度"的问题,原本以为是很简单的问题,没想到折腾了20分钟才搞定.期间遇到几个问题,要么是高度自适应了,但是当窗口改变时会出现滚动条.也就是 ...

  3. jquery iframe自适应高度[转]

      经典代码 iFrame 自适应高度,在IE6/IE7/IE8/Firefox/Opera/Chrome/Safari通过测试. 很古老的方法: <iframe src="../In ...

  4. js实现iframe自适应高度

    转自:http://www.jb51.net/article/15780.htm 对于自适应高度的代码有很多,可效率什么的考虑进来好代码就不多见了,不过思路倒是差不多的! 不带边框的iframe因为能 ...

  5. 网页制作技巧:iframe自适应高度

    转自:http://www.enet.com.cn/article/2012/0620/A20120620126237.shtml 通过Google搜索iframe 自适应高度,结果5W多条,搜索if ...

  6. Iframe 自适应高度的方法!

    第一种方法:代码简单,兼容性还可以,大家可以先测试下. function SetWinHeight(obj) { var win=obj; if (document.getElementById) { ...

  7. iframe自适应高度的多种方法小结

    转自:http://www.jb51.net/article/15780.htm 不带边框的iframe因为能和网页无缝的结合从而不刷新页面的情况下更新页面的部分数据成为可能,可是 iframe的大小 ...

  8. iframe自适应高度的多种方法方法小结

    对于自适应高度的代码有很多,可效率什么的考虑进来好代码就不多见了,不过思路倒是差不多的  不带边框的iframe因为能和网页无缝的结合从而不刷新页面的情况下更新页面的部分数据成为可能,可是 ifram ...

  9. [转载]再谈iframe自适应高度

    Demo页面:主页面 iframe_a.html ,被包含页面 iframe_b.htm 和 iframe_c.html 下面开始讲: 通过Google搜索iframe 自适应高度,结果5W多条,搜索 ...

  10. iframe自适应高度的多种方法方法小结(转)

    对于自适应高度的代码有很多,可效率什么的考虑进来好代码就不多见了,不过思路倒是差不多的不带边框的iframe因为能和网页无缝的结合从而不刷新页面的情况下更新页面的部分数据成为可能,可是 iframe的 ...

随机推荐

  1. js触摸屏案例

    js 手机端触发事事件.javascript手机端/移动端触发事件   处理Touch事件能让你跟踪用户的每一根手指的位置.你可以绑定以下四种Touch事件: 1 2 3 4 touchstart:  ...

  2. asp.net 跨页面传值常用方法

    常用方法有以下: 1.queryString 2.form-post控件传递 3.cookie 4.application 5.session querystring: http://website. ...

  3. ArrayList、Vactor以及LinkList的区别

    ArrayList:底层数据结构是数组结构,你就可以把它看成是一个可变大小的且只能装对象的数组.因为数组有索引(角标)所以ArrayList的查询速度快,而添加删除元素速度稍慢.因为,你每删除或者添加 ...

  4. iOS开发那些事儿(四)the dark arts of the Objective-C runtime

    一."Black Magic":Method Swizzling 利用 Runtime 特性把一个方法的实现与另一个方法的实现进行替换,也可以用runtime的四维理解——修改Di ...

  5. CSS实例:水平居中和垂直居中的多种解决方案

    1.单行垂直居中 文字在层中垂直居中vertical-align 属性是做不到的.我们这里有个比较巧妙的方法就是:设置height的高度与line-height的高度相同! Example Sourc ...

  6. eclipse 各种版本spring插件安装

    一.安装之前先得知道怎么下载吧: 一般网上找到的资料是到这里就GG了的 --> http://spring.io/tools/sts/all 很明显这点版本是不够我们需要的,假如我们的eclip ...

  7. 01UITextField基础知识

    文字属性 文字属性包括:text; placeholder(默认使用70%灰色):font:textColor;textAligment. 文字大小 文字大小包括:adjustsFontSizeToF ...

  8. bash快捷建-光标移到行首、行尾等

    转自:http://digdeeply.org/archives/12131599.html ctrl键组合ctrl+a:光标移到行首.ctrl+b:光标左移一个字母ctrl+c:杀死当前进程.ctr ...

  9. 项目与软件推荐之编辑器-QOwnNotes(刺激自己)

    项目与软件推荐之编辑器-QOwnNotes 今天推荐一款软件 QOwnNotes,是一款普通文本笔记软件.以某个路径为目录,罗列出目录下所有的 md 文件或者 txt 文件. 有如下亮点: 启动速度快 ...

  10. ab压力测试报错: apr_socket_recv: Connection reset by peer (104)

    使用ab对网站进行压力测试,开始设置并发500,可以正常使用,当设置并发为1000,则报错: apr_socket_recv: Connection reset by peer (104) 改服务端a ...