最近工作中遇到了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. asp.net linq查询环境搭建

    本文是以sqlserver2008为数据库,vs2013为开发工具来介绍的. 要搭建这样一个数据库的操作环境,首先建立一个类库项目 然后在这个类库项目中添加几个类:DBDataContext数据库上下 ...

  2. SSH框架中一些技巧、处理办法

    1.使用jstree插件时,操作成功直接刷新jstree 该页面(index.jsp)本身使用iframe框架jstree在leftFrame,操作页(add_input.jsp.add_succes ...

  3. HDU 1038 - Biker's Trip Odometer

    算一下路程和速度... #include <iostream> #include <cstdio> using namespace std; const double p=3. ...

  4. [Tree]Binary Tree Preorder Traversal

    Total Accepted: 97599 Total Submissions: 257736 Difficulty: Medium Given a binary tree, return the p ...

  5. typedef用法总结。

    引用贴:http://www.cnblogs.com/csyisong/archive/2009/01/09/1372363.html 首先#define为预处理,与typedef是完全不同的机制.详 ...

  6. Picasso 加载图片到RelativeLayout之解决方案

    Picasso 加载图片到ImageView 或者自己的自定义View都是可以直接调用对应API的,但是用into(0直接也加载到RelatieLayout就不好使了,可以这样来: Picasso.w ...

  7. Almost Prime

    Description Almost Prime time limit per test: 2 seconds memory limit per test: 256 megabytes input: ...

  8. C99新特性

    c99标准允许使用变长数组,变的意思是可以根据变量的值来指定数组的维数,如根据用户的输入值指定数组的大小,印象中以前是不可以的.现在在gcc中是可以的(PS:ansi c标准是C90标准): ==== ...

  9. Log4J使用笔记(转)

    转自:http://www.cnblogs.com/eflylab/archive/2007/01/11/618001.html Log4J是Apache的一个开放源代码的项目.通过使用Log4J,程 ...

  10. Oracle EBS-SQL (WIP-13):检查任务组件未选MRP净值.sql

    select WE.WIP_ENTITY_NAME                                              任务号,         MFG_LOOKUPS_WJS. ...