document.body、document.documentElement和window获取视窗大小的区别

2015-3-27 
$(window).height(); 才是窗口的宽高,而且一直不变 
document.body.clientHeight,在文档内容有滚动条的时候远大于$(window).height(); 

实际例子,向下滑动判断 
$(document).height() - $(window).scrollTop() - $(window).height() < 150 



2015-3-17 

踩了一个大坑,在UC浏览器,window.innerHeight与document.body.clientHeight根本不相等,导致获取错误的高度。 
结论:直接使用document.body.clientHeight即可。 


另外,screen.availHight是屏幕分辨率1920x1080之类,并不是屏幕viewport尺寸。 




一、理论  
在w3school关于window对象的介绍中,介绍了获取浏览器窗口大小的三种方法(浏览器的视口,不包括工具栏和滚动条)。 

对于Internet Explorer、Chrome、Firefox、Opera 以及 Safari: 
window.innerHeight – 浏览器窗口的内部高度 
window.innerWidth – 浏览器窗口的内部宽度 


对于 Internet Explorer 8、7、6、5: 
document.documentElement.clientHeight 
document.documentElement.clientWidth 
或者 
document.body.clientHeight 
document.body.clientWidth 


二、测试办法  

Java代码   收藏代码
  1. <!doctype html>  
  2. <html lang="en">  
  3. <head>  
  4. <meta charset="UTF-8">  
  5. <meta name="Author" content="">  
  6. <meta name="Keywords" content="">  
  7. <meta name="Description" content="">  
  8. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
  9. <meta http-equiv="Cache-Control" content="no-cache">  
  10. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">  
  11. <meta name="MobileOptimized" content="320">  
  12. <title>Document</title>  
  13.   
  14. <style type="text/css">  
  15. .test  
  16.  {  
  17.         width:100px;  
  18.        height:100px;  
  19.        background:red;  
  20.    }  
  21.    #data  
  22.    {  
  23.        width:200px;  
  24.        height:100px;  
  25. }  
  26. </style>  
  27. </head>  
  28. <body>  
  29. <div class="test">test</div>  
  30. <div id="data"></div>  
  31. <script type="text/javascript">  
  32. var w=window.innerWidth  
  33.     || document.documentElement.clientWidth  
  34.     || document.body.clientWidth;  
  35.     var h=window.innerHeight  
  36.     || document.documentElement.clientHeight  
  37.     || document.body.clientHeight;  
  38.      
  39.     var data = document.getElementById('data');  
  40.     data.innerHTML = "正常文档流情况:"+"<br/>";  
  41.    data.innerHTML += "h="+h+"<br/>";  
  42.    data.innerHTML += "w="+w+"<br/>";  
  43.    data.innerHTML += "document.body.clientHeight="+document.body.clientHeight+"<br/>";  
  44.    data.innerHTML += "document.body.clientWidth="+document.body.clientWidth+"<br/>";  
  45.    data.innerHTML += "window.innerWidth="+window.innerWidth+"<br/>";  
  46.    data.innerHTML += "window.innerHeight="+window.innerHeight+"<br/>";  
  47.    data.innerHTML += "document.documentElement.clientHeight="+document.documentElement.clientHeight+"<br/>";  
  48.    data.innerHTML += "document.documentElement.clientWidth="+document.documentElement.clientWidth+"<br/>";  
  49. </script>  
  50. </body>  
  51. </html>  


结果(例子): 
正常文档流情况: 
h=652 
w=1280 
document.body.clientHeight=200 
document.body.clientWidth=1264 
window.innerWidth=1280 
window.innerHeight=652 
document.documentElement.clientHeight=652 
document.documentElement.clientWidth=1280 


经测试结论1: 
document.body.clientWidth/Height:的宽高偏小,高甚至默认200。 
document.documentElement.clientWidth/Height 和 window.innerWidth/Height 的宽高始终相等。 


测试结论2: 
给.test添加左浮动:float:left,让其脱离正常文档流,看看结果:除了document.body.clientHeight变成了100,其他基本保持不变。 


测试结论3: 
但是给.data也添加float:left,在对应的浏览器中,document.body.clientHeight变成了0,其他基本保持不变。不信可以自己试试。 



三、如何使用知识来改进  
1,向显示在移动端怎么办? 
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"> 

2,如果希望clientWidth/Height与 documentElement.clientWidth、innerWidth 一样怎么办? 
设置如下css 
body { 
height: 100%; 
overflow: hidden; 

body, div, p, ul { 
margin: 0; 
padding: 0; 

最关键的是:body的height:100%影响document.body.clientHeight的值。 
body的margin:0,padding:0影响document.body.clientWidth的值。 

所以,需要js+css才能得到正确的结果。


转载自:http://zccst.iteye.com/blog/2188766

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值