网页设计技巧:iframe自适应高度的问题

所属分类: 网页制作 / 应用技巧 阅读数: 1255
收藏 0 赞 0 分享
可能有人还没接触到这个问题过,先说明一下,什么是自适应高度吧。所谓iframe自适应高度,就是,基于界面美观和交互的考虑,隐藏了iframe的border和scrollbar,让人看不出它是个iframe。如果iframe始终调用同一个固定高度的页面,我们直接写死iframe高度就可以了。而如果iframe要切换页面,或者被包含页面要做DOM动态操作,这时候,就需要程序去同步iframe高度和被包含页的实际高度了。
顺便说下,iframe在迫不得已的时候才去用,它会给前端开发带来太多的麻烦。
传统做法大致有两个:
方法一,在每个被包含页在本身内容加载完毕之后,执行JS取得本页面的高度,然后去同步父页面的iframe高度。
方法二,在主页面iframe的onload事件中执行JS,去取得被包含页的高度内容,然后去同步高度。
在代码维护角度考虑,方法二是优于方法一的,因为方法一,每个被包含页都要去引入一段相同的代码来做这个事情,创建了好多副本。
两个方法都只处理了静的东西,就是只在内容加载的时候执行,如果JS去操作DOM引起的高度变化,都不太方便。
如果在主窗口做一个Interval,不停的来获取被包含页的高度,然后做同步,是不是即方便,又解决了JS操作DOM的问题了呢?答案是肯定的。
Demo页面:主页面 iframe_a.html ,被包含页面 iframe_b.htm 和 iframe_c.html
主页面代码示例:

复制代码
代码如下:

<iframe id="frame_content" src="iframe_b.html" scrolling="no" frameborder="0"></iframe><script type="text/javascript">
function reinitIframe(){
var iframe = document.getElementById("frame_content");
try{
iframe.height = iframe.contentWindow.document.documentElement.scrollHeight;
}catch (ex){}
}
window.setInterval("reinitIframe()", 200);
< /script>

一直执行,效率会不会有问题?
我做了测试,同时开5个窗口(IE6、IE7、FF、Opera、Safari)执行这个代码,不会对CPU有什么影响,甚至调整到2ms,也没影响(基本维持在0%占用率)。
下面谈谈各浏览器的兼容性问题,如何获取到正确的高度,主要是对body.scrollHeight和documentElement.scrollHeight两个值得比较。注意本文用的是这个doctype,不同的doctype应该不会影响结果,但是假如你的页面没有申明doctype,那还是先去加一个吧。

复制代码
代码如下:

< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "<a href="http://www.w3.org/TR/html4/strict.dtd">http://www.w3.org/TR/html4/strict.dtd</a>">在主页面追加以下测试代码,以输出这两个值,代码示例:
<div><button>Check Height</button></div><script type="text/javascript">
function checkHeight() {
var iframe = document.getElementById("frame_content");
var bHeight = iframe.contentWindow.document.body.scrollHeight;
var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;
alert("bHeight:" + bHeight + ", dHeight:" + dHeight);
}
< /script>被加载页面,可以切换一个绝对定位的层,来使页面高度动态改变。如果层展开,则会撑高页面高度。代码示例:
<div><button>Toggle Overlay</button>
< /div>
< div style="height:160px;position:relative">
< div id="overlay" style="position:absolute;width:280px;height:280px;display:none;"></div>
< /div>
< script type="text/javascript">
function toggleOverlay() {
var overlay = document.getElementById('overlay');
overlay.style.display = (overlay.style.display == 'none') ? 'block' : 'none';
}
< /script>

下面列出以上代码在各浏览器的测试值:

复制代码
代码如下:

(bHeight = body.scrollHeight, dHeight = documentElement.scrollHeight, 红色 = 错误值, 绿色 = 正确值)
/ 层隐藏时 层展开时
bHeight dHeight bHeight dHeight
IE6 184 184 184 303
IE7 184 184 184 303
FF 184 184 184 303
Opera 181 181 300 300
Safari 184 184 303 184

暂且无视Opera比别人少3像素的问题…可以看出,如果没有绝对定位的东西,两个值是相等的,取哪个都无所谓。
但是如果有,那么各个浏览器的表现不太相同,单取哪个值都不对。但可以找到了一条规律,那就是取两个值得最大值可以兼容各浏览器。所以我们的主页面代码就要改造成这样了:

复制代码
代码如下:

function reinitIframe(){var iframe = document.getElementById("frame_content");
try{
var bHeight = iframe.contentWindow.document.body.scrollHeight;
var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;
var height = Math.max(bHeight, dHeight);
iframe.height = height;
}catch (ex){}
}
window.setInterval("reinitIframe()", 200);

这样子,基本解决了兼容性问题。顺便说下,不光绝对定位的层会影响到值,float也会导致两个值的差异。
如果你演示Demo后,会发现,除了IE,其他浏览器中,当层展开后再隐藏,取到的高度值还是维持在展开的高度303,而非隐藏回去的真正值184,就是说长高了之后缩不回去了。这个现象在不同被包含页面之间做切换也会发生,当从高的页面切换到矮页面的时候,取到的高度还是那个高的值。
可以归纳为,当iframe窗体高度高于文档实际高度的时候,高度取的是窗体高度,而当窗体高度低于实际文档高度时,取的是文档实际高度。因此,要想办法在同步高度之前把高度设置到一个比实际文档低的值。所以,在iframe的添加 onload=”this.height=100″,让页面加载的时候先缩到足够矮,然后再同步到一样的高度。
这个值,在实际应用中决定,足够矮但又不能太矮,否则在FF等浏览器里会有很明显的闪烁。DOM操作的时候主页面无法监听到,只能DOM操作完了之后把高度变小了。
在我的一个实际项目中,在成本和收益之间权衡,我并没有做这个事情,因为每个DOM函数中都要插入这个代码,代价太高,其实层缩回去不缩掉也不是那么致命。包括Demo里,也没有去做这个事情。如果读者有更好的方法,请告诉我。
这是最终的主页面的代码:
[/code]
<iframe id="frame_content" src="iframe_b.html" scrolling="no" frameborder="0"></iframe>
< script type="text/javascript">
function reinitIframe(){
var iframe = document.getElementById("frame_content");
try{
var bHeight = iframe.contentWindow.document.body.scrollHeight;
var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;
var height = Math.max(bHeight, dHeight);
iframe.height = height;
}catch (ex){}
}
window.setInterval("reinitIframe()", 200);
< /script>
[/code]
更多精彩内容其他人还在看

网页心得:网页色彩的搭配

网页的色彩是树立网站形象的关键之一,色彩搭配却是网友们感到头疼的问题。网页的背景,文字,图标,边框,超链接...,应该采用什么样的色彩,应该搭配什么色彩才能最好的表达出预想的内涵呢?这里谈一些心得,希望对你有所启发。 首先我们先来了解一些色彩的基本知识:
收藏 0 赞 0 分享

设计理论:字体设计的基本知识

文字,是人类思想感情交流的必然产物。随着人类文明的进步,它由简单而复杂,逐步形成了科学的完美而规范化的程式。它既具有人类思想感情的抽象意义与韵调和音响节律,又具有结构完整,章法规范,而又变化无穷的鲜明形象。尤其是象形文字,更是抽象与具象的紧密结合,其文字
收藏 0 赞 0 分享

设计理论:内容呈现建议十条

围绕文字、符号、链接三个方面,主要是中文,草拟的个人行文经验: 文字避免写错。应付挑剔的读者是一个方面,某些关键词的错误,有可能就避过了搜索引擎抓取。 文字密度节奏的控制。段落在四行左右比较合适,宜少不宜多,同时避免文字量大的段落连续堆积,
收藏 0 赞 0 分享

导航设计与信息架构

大部分时候我们讲导航,讲的是导航对内容和结构的一种表现。就是说我们在讨论导航的时候,更多的去关注怎么与之交互,以及视觉上是怎么好看。但是导航,不仅仅局限于交互方式和视觉形式。 被狭义化的导航 回想一下我们是如何设计导航的?难道不正是根据内容、根据内容
收藏 0 赞 0 分享

设计理论:文本达意和可用性

在文本的设计中,我们通常关注的是文字的排版,如何排版才能让我们的文字看起来更美观,更容易阅读;然而,文字本身所表达的意思与此同等重要,因为我们把排版做好的根本意义还是要用户更容易读明白所表达的内容。 一、下面我们就设计中的几点,通俗的讨论一下这块的重要
收藏 0 赞 0 分享

土豆网(tudou.com)前端概况

一、分工和流程 在土豆网,以项目开发为核心,谁都可以带项目,担任项目经理。 一个典型的土豆网项目中,当进入正式开发阶段,通常参与者包括:1名设计师,1-2名前端工程师,1到多名后台工程师,1-2名系统运维管理员。 其中,前三者的工作都是可以并发的,最终整合通常是
收藏 0 赞 0 分享

网页制作应注意的几个事项

--主页备份 1、txt 文本 2、scan 扫描图片 3、psd 设计原图(包括AI、Flash、Banner等等) 4、htm 网页文件 5、htm_old* 旧的网页文件备份 --html的目录结构 1、打开网页排版软件D
收藏 0 赞 0 分享

TOM.COM网站首页改版的体验感受

没有任何征兆的在cnBeta上看到关于TOM.COM网站改版的新闻,说是页面可以自定义了。这给我的第一想法就是:TOM.COM开始像一些Web2.0的网站学习开始走WEB2.0的道路了。于是链接进去体验了一把,下面说说我的体验感受: 1、对于这个自定义页面的功能,新鲜感上没
收藏 0 赞 0 分享

网页设计从业者必看的职业规划

原创文章,转载请注明作者和出处! 网页设计毫无疑问是一门技术,职业定位是网站设计、网站美工、网络编辑等,许多较高水平的技术人员能获得不错的职位和薪金,但大部分人可能并不能达到这个水平,比如美工这个职位,较好些的网站都要求美工需要具有美术的功底、手绘的能
收藏 0 赞 0 分享

肤浅网页设计

一直以来,我深信yahoo的网页设计是很棒的。但是,我的确说不出具体的理由,因为实在有太多的网站比它好看得多。我之所以觉得它好,是因为它是世界第一大站,它手下有无数世界级的设计师,这种设计是厚积薄发的结果。所以,对yahoo设计的认同,其实是一种对权威的盲目敬畏。
收藏 0 赞 0 分享
查看更多