特色栏目

ASP源码

PHP源码

.NET源码

JSP源码

游戏频道
专题合集
关闭菜单
首页> 网页特效> 三谈Iframe自适应高度

三谈Iframe自适应高度

时间:2010-10-07 18:50:40 作者:互联网

为什么是三谈

为什么是三谈呢?一是因为这真的是一个被说烂的话题,二是因为太师傅在n年前就写过这篇再谈iframe自适应高度。之所以再提该问题,是因为之前项目中确实遇到了这个问题的方方面面,有必要总结一下。希望对各位有帮助,有错误请指正。

同域、子页面高度不会动态增加

这种情况最简单,直接通过脚本获取字页面实际高度,修改iframe元素高度即可。但有二点必须注意:

如果页面内有绝对定位或者没有清浮动的元素,情况有些复杂,不同浏览器处理结果不同,甚至包括Webkit内核的浏览器,具体请看这个Demo。所以你要么进行浏览器检测,要么用Math.max计算一个最大值,要么你想别的方法。

iframe所包含页面可能非常大,需要很长的加载时间,为此直接计算高度的时候,很可能页面还没下载完,高度计算就会有问题。所以最好在iframe的onload事件中计算高度。这里还要注意的是,IE下必须使用微软事件模型ob***ttachEvent来绑定onload事件。而别的浏览器直接ob***nload = function(){}也可以。

(function(){
    var _reSetIframe = function(){
        var frame = do***ent.getElementById("frame_content_parent")
        try {
            var frameContent = fr***.contentWindow.document,
                bodyHeight = Math.max
(fr***Content.body.scrollHeight,
fr***Content.documentElement.scrollHeight);
            if (bodyHeight != fr***.height){
                fr***.height = bodyHeight;
            }
        }
        catch(ex) {
            fr***.height = 1800;
        }
    }
    if(fr***.addEventListener){
        fr***.addEventListener
("load",function(){setInterval(_reSetIframe,200);},false);
    }else{
        fr***.attachEvent("onload",function(){setInterval(_reSetIframe,200);});
    }
})();

同域、子页面高度会动态增加、脚本可能完全失效

第二个例子中,考虑到了脚本出错的情况,但是万一脚本根本不执行了呢,那iframe中的内容就会因为iframe的高度不够而显示不了。为此我们通常事先设置一个足够的高度,为了前端控制方便,我觉得写在CSS文件中比较合适,需要修改时只改CSS就行了。这里我设置了selector{ height:1800px; }。需要注意的是,写在样式表里的样式,不能直接用no***style[property]来取,对于微软模型,要用no***currentStyle[property](题外话:悲剧的IE模型不支持CSS伪类),对于W3C模型,要用wi***w.getComputedStyle(node,null)[property]来取。我这里图方便直接用了YUI。

这里又有一个问题,设置iframe的高度大于其包含页面的高度时,各个浏览器的处理不一样。例如在Firefox下,必须计算body元素的高度,而html元素的高度等于iframe的高度,然而当恰巧这个页面又有绝对定位、未清浮动元素时,又不能通过body元素来取,显然第一种方法缺点更小一些。具体请看这个Demo

相关文章

相关应用

热门文章

猜你喜欢

返回顶部