同域iframe的高度自适应

  1. 引子
  2. 父页面里控制子页面
  3. 子页面里控制父页面

 

1、引子

咱们先看一个示例,有两个页面,1.html经过iframe嵌入2.html,两个页面都是同域的javascript

1.htmlhtml

<!DOCTYPE html>
<html>
  <head>
    <meta charset='utf-8' />
    <title>1.html</title>
  </head>
  <body>
     <iframe id="ifr" src="2.html" frameborder="0" width="100%"></iframe>
  </body>
</html>

2.html,不少P元素将高度撑高一些java

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>2.html</title>
  </head>
  <body>
	 <p>这是一个ifrmae,嵌入在http://snandy.github.io/lib/iframe/1.html里 </p>
	 <p>根据自身内容调整高度</p>
	 <p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p>
  </body>
</html>

 

此时,浏览器访问1.html,效果如图git

能够看到,嵌入的iframe出现了滚动条,需求是不想出现滚动条,页面多高就显示多少。咱们不能随便给iframe设个高度,由于你不知道嵌入的iframe会有多高(内容是动态生成的)。github

 

2、解决方法

解决方法其实很简单,无非是给1.html里的iframe设个高度,高度的值即为2.html的内容高度。要注意的是2.html的内容高度须要页面彻底载入(onload)后获取。浏览器

 

有两种方式 函数

A. JS代码写在父页面,即父页面(1.html)里获取子页面(2.html)文档对象,当iframe载入后(load)获取高度,将此高度值赋值给iframe标签测试

开始测试时使用iframe的contentWindow的load事件,但全部浏览器均不执行。最后使用iframe的load事件,在父页面1.html底部加入以下JS代码spa

<script type="text/javascript">
  // 计算页面的实际高度,iframe自适应会用到
  function calcPageHeight(doc) {
      var cHeight = Math.max(doc.body.clientHeight, doc.documentElement.clientHeight)
      var sHeight = Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight)
      var height  = Math.max(cHeight, sHeight)
      return height
  }
  var ifr = document.getElementById('ifr')
  ifr.onload = function() {
      var iDoc = ifr.contentDocument || ifr.document
      var height = calcPageHeight(iDoc)
      ifr.style.height = height + 'px'
  }
</script>

这里有两个细节:htm

1. 取iframe内的文档对象,标准浏览器使用contentDocument属性,IE低版本(IE6,7,8)使用document属性。

2. calcPageHeight函数计算页面的实际高度,标准浏览器使用document.documentElement,低版本IE使用document.body,默认取clientHeight,出现滚动条的取scrollHeight,最后取两个值中最大的。

 

B. JS代码写在子页面,即子页面在window load后计算高度,将此高度值赋值给父页面的iframe

在子页面(2.html)底部加入以下代码

<script>
	// 计算页面的实际高度,iframe自适应会用到
	function calcPageHeight(doc) {
	    var cHeight = Math.max(doc.body.clientHeight, doc.documentElement.clientHeight)
	    var sHeight = Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight)
	    var height  = Math.max(cHeight, sHeight)
	    return height
	}
	window.onload = function() {
		var height = calcPageHeight(document)
		parent.document.getElementById('ifr').style.height = height + 'px' 		
	}
</script>

  

经过这两种方式均可以实现iframe的高度自适应,能够看到从新设置iframe的高度后,其滚动条都去掉了。

线上示例:http://snandy.github.io/lib/iframe/1.html

 

相关:

http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-78799536

http://msdn.microsoft.com/en-us/library/ie/cc196985(v=vs.85).aspx

相关文章
相关标签/搜索