- 浏览: 119248 次
- 性别:
- 来自: 合肥
文章分类
- 全部博客 (86)
- Web Page (23)
- Java (5)
- Web Security (7)
- Cache (0)
- Message (0)
- CAS (3)
- 开源系统 (2)
- my systems (2)
- Apache Chemistry and Jackrabbit (1)
- Jquery (1)
- spring (8)
- 虚拟主机部署 (3)
- ORM (3)
- myeclipse eclipse (5)
- full index (1)
- 公式编辑器 (1)
- 网页编辑器 (1)
- junit4 (1)
- 飞鸽传书 (1)
- centos install (1)
- maven (1)
- hibernate (1)
- tomcat (5)
- eclipse (4)
- 工具 (1)
- mysql (2)
- tomcat jndi + spring配置 (1)
- goagent (0)
- html video (1)
- ckeditor (0)
- getResourceAsStream (1)
- online education project (1)
- Mac (1)
- Chrome (1)
- dev-tool (1)
最新评论
-
107x:
谢谢分享
Eclipse下使用maven开发web项目 -
a604346146:
如果你关闭该界面时,session没有注销,你不能再登录进去, ...
spring security 同步session控制 -
Jekey:
...
已有windows 7下硬盘安装CentOS 6.x
转自:http://www.kuqin.com/webpagedesign/20080516/8536.html
下面开始讲:
通过Google搜索iframe 自适应高度,结果5W多条,搜索iframe 高度自适应,结果2W多条。
我翻了前面的几十条,刨去大量的转载,有那么三五篇是原创的。而这几篇原创里面,基本上只谈到如何自适应静的东西,就是没有考虑到JS操作DOM之后,如何做动态同步的问题。另外,在兼容性方面,也研究的不彻底。
这篇文章,希望在这两个方面再做一些深入。
可能有人还没接触到这个问题过,先说明一下,什么是高度自适应吧。所谓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" "http://www.w3.org/TR/html4/strict.dtd">
在主页面追加以下测试代码,以输出这两个值,代码示例:
<div><button onclick="checkHeight()">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 onclick="toggleOverlay()">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, 红色 = 错误值, 绿色 = 正确值)
184 | 184 | 184 | 303 |
184 | 184 | 184 | 303 |
184 | 184 | 184 | 303 |
181 | 181 | 300 | 300 |
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里,也没有去做这个事情。如果读者有更好的方法,请告诉我。
这是最终的主页面的代码:
<iframe id="frame_content" src="iframe_b.html" scrolling="no" frameborder="0" onload="this.height=100"></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>
附Demo页面: 主页面 iframe_a.html ,被包含页面 iframe_b.htm 和 iframe_c.html
发表评论
-
CSS 的 margin 很困難
2014-04-21 14:24 1533转自:http://xxxxxly.in/posts/ ... -
禁止浏览器自动填充用户名密码
2014-02-18 22:37 935有时页面字段不希望浏览器自动填充用户名和密码,可以在< ... -
Struts标签中的字符串格式化输出
2013-07-11 08:49 1144转自: http://blog.csdn.net/bzkfn ... -
Eclipse下使用maven开发web项目
2012-07-17 09:37 2234摘抄自: http://www.noday.net/artic ... -
eclipse下struts的maven项目报 Missing artifact com.sun:tools:jar错
2012-07-11 17:51 1855如果项目中使用struts2和mave, 则pom文件可能如下 ... -
onsubmit=return false阻止form表单提交javascript_1
2011-12-01 01:22 1091摘自:http://jackaudrey.blog ... -
防止表单自动提交,以及submit和button提交表单的区别
2011-12-01 01:21 6453转自:http://jackaudrey.blog ... -
Iframe 自适应3
2011-11-30 20:27 922Iframe跨域自适应高度(兼容IE/Fi ... -
ckeditor中文文档——开发者文档(3)配置--配置设置
2011-11-30 13:58 2007---- 摘自:http://blog.csdn.net/lh ... -
为CKEditor添加Readonly按钮和Upload Image按钮
2011-11-30 08:29 1702问题内容 转自:http://cjkz.52bianc ... -
jsp中ckeditor的运用实例及配置
2011-11-22 13:33 727转自: http://hi.baidu.com/%B7%E7 ... -
页面回发后,让页面自动滚动到指定位置的一种简单的方法
2011-11-21 21:39 1088页面回发后,让页面自动滚动到指定位置的一种简单的方法 ... -
常用图标
2011-08-30 17:17 715验证表单 -
表单验证提示信息
2011-08-30 17:14 2033<!DOCTYPE html PUBLIC " ... -
tip help--js带箭头的提示框
2011-08-30 16:56 1631<!DOCTYPE html PUBLIC " ... -
div move
2011-08-30 16:17 827<!DOCTYPE html PUBLIC " ... -
验证码Jcaptcha .
2011-08-30 15:58 753http://blog.csdn.net/sz_bdqn/ar ... -
十大最佳Ajax教程(转)
2011-07-12 10:15 839转自:http://news.csdn.net/a/20100 ... -
iframe高度自适应2
2011-07-10 22:09 627http://www.fufuok.com/adaptive- ... -
(转)16个Javascript表单事件脚本(表单验证、选择)
2011-07-09 22:58 93016个JavaScript 表单事件脚本, 含jQu ...
相关推荐
"Iframe 高度自适应,js 控制 Iframe 高度自适应" Iframe 高度自适应是指在网页中嵌入的 iframe 元素能够根据其内容自动调整高度,以适应不同的浏览器和屏幕尺寸。js 控制 Iframe 高度自适应是指使用 JavaScript ...
这种技术常被用来实现...以上就是关于“Iframe高度自适应浏览器高度”的主要知识点,实践中可能需要结合具体场景和需求选择合适的方法。在实际应用中,还要考虑到兼容性问题,确保在不同浏览器和设备上都能正常工作。
iframe高度自适应代码及演示页面。 适合新手,用到iframe,并且需要高度自适应的人士。 老手自动绕行,又没什么技术含量。。。 解压之后,打开iframe-auto.html之后查看效果. 如果不能查看,检查是否允许执行js
### iframe高度自适应技术详解 在网页开发过程中,经常会遇到需要在一个页面中嵌入另一个页面的需求,这通常通过HTML的`iframe`元素实现。然而,一个常见的问题是当嵌入的内容高度变化时,如何使`iframe`的高度能够...
然而,`<iframe>`的高度自适应问题常常困扰着开发者,尤其是当`<iframe>`内部的内容动态加载或者变化时,如何让`<iframe>`自动调整其高度以适应内容,而不会导致滚动条溢出或内容被截断,成为了一个常见需求。...
// 调整iframe高度 }); ``` `iframe`内部示例代码: ```javascript window.onload = function() { var height = document.documentElement.scrollHeight || document.body.scrollHeight; parent.post...
iframe包含的页面的高度,兼容性好,iframe高度自适应
jsp 页面 iframe 高度自适应的 js 代码详解 jsp 页面 iframe 高度自适应的 js 代码是指在 jsp 页面中使用 iframe 元素,並且使其高度能够自适应内容的高度。这种技术在实际应用中非常有用,例如在某些网页中,我们...
标题提到的“iframe自动适应高度(完美自适应高度嵌套代码)”提供了一个解决方案,它能够确保`iframe`在各种主流浏览器中都能正确地自适应内容高度,包括360浏览器、IE6-9、遨游、火狐以及搜狗浏览器。 在传统的`...
这个简单的JavaScript解决方案能帮助我们实现`iframe`的高度自适应,使得内容始终完全显示,避免滚动条的出现。然而,实际应用中可能还会遇到其他复杂情况,如延迟加载、动态插入的`iframe`等,这时可能需要结合更多...
同时,`iframe`内容的动态加载可能使得其高度不固定,如果不能自适应高度,可能会导致页面布局出现问题。本模板将介绍如何处理`iframe`的跨域和自适应高度这两个关键问题。 首先,让我们了解`iframe`跨域。由于同源...
用jQuery实现iframe高度自适应 <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> $(document).ready(function() { function resizeIframe() { var iframe = $('#myIframe'); if ...
完美解决跨域iframe的高度自适应,完美解决跨子域iframe的高度自适应,嵌入几个页面解决跨域iframe的高度自适应。。。
然后通过`document.all['myframe']`获取到`iframe`元素,并通过`myframe.document.body.scrollHeight`获取内部文档的实际高度,最后将这个高度设置给`iframe`元素的`height`属性,从而实现高度自适应。 #### 四、...
这个库允许的高度与同跨域iframe来适应他们所包含的内容的宽度自动调整大小。它最常见的问题与使用iframes提供一系列的功能,其中包括: 高度和宽度大小的iframe内容大小。 作品以多个嵌套的iframe。 跨域iframe域...
`iframe`的使用涉及到许多关键点,尤其是高度自适应和多浏览器兼容性,这在实际项目中至关重要。本篇文章将详细讲解如何实现`iframe`的高度自适应以及在不同浏览器之间的兼容性处理。 一、`iframe`基本使用 `iframe...
### 解决IE、Firefox、Chrome、Safari浏览器中iframe显示高度自适应问题 在Web开发中,`iframe`(Inline Frame)元素常被用于嵌入另一个HTML文档到当前页面中,这种技术为开发者提供了极大的便利,例如加载广告、...
如果需要在不同设备和屏幕尺寸上保持`iframe`的高度自适应,可以结合媒体查询(media queries)和上面提到的技术,确保在各种视口宽度下都能正确显示。 综上所述,`iframe`自适应高度是通过JavaScript、CSS布局...
### iframe高度自适应JS知识点详解 #### 一、概述 在网页开发中,经常会遇到需要将一个页面嵌入到另一个页面中的场景,这时就需要用到`<iframe>`标签。但是,默认情况下,`<iframe>`的高度是固定的,这往往会导致...