window.innerWidth、document.body.clientWidth和html的大小的区别
首先,我们知道document.body指向的就是body元素,如此,我们就可以以document.body来获取body的大小。何以知之?如下代码:
var body = document.querySelector('body');
console.log(body == document.body);
结果显示的是true。
同样的document.documentElement指向的是html元素。
html代码如下:
<div id = 'div' style = 'width:200px;height: 200px;background: red;'>
</div>
如图效果:

1.获取html的大小
如下代码:
var html = document.querySelector('html');
// 获取html元素的宽度
console.log("html-width:" +document.defaultView.getComputedStyle(html,null).width);
// 获取html元素的高度
console.log("html-height:" + document.defaultView.getComputedStyle(html,null).height);
结果显示:html-width:1366px,html-height:216px
2.获取body的大小
代码如下:
console.log("clientWidth:" + document.body.clientWidth);
console.log("clientHeight:" + document.body.clientHeight);
结果显示:body-width:1350px,clientHeight:200。
3.使用能够window.innerWidth获取
代码如下:
console.log("innerWidth:" + window.innerWidth);
console.log('innerHeight:' + window.innerHeight);
结果显示:innerWidth:1366,innerHeight:608
从以上的实验,可以知道,使用window.innerWidth/window.innerHeight获得的绝非是有些人所说的html的大小。
首先从width来看,为什么可见window.innerWidth和html的宽度是相等的。但是问什么body的width却是比二者都小呢?
其实答案很简单,因为body天生就有margin,不信的话,我们把body染色,代码如下:
html.style.backgroundColor = 'white';
body.style.backgroundColor = 'red';
之所以第一行给了html的背景色。其深入原因请见张大神的对html与body的一些研究与理解。效果如图:
body的margin未修改:

body的margin修改后:

那么滚动条是否会对三者的宽度有什么影响呢?
假如我们使浏览器增加一个垂直的滚动条。
三者的宽度如下(此时body的margin为0):
html-width:1349px,body-width:1349px,innerWidth:1366。
可见html是不把滚动条的宽度算在内的。而innerWidth是把滚动条的宽度算在内的。
然后我们再来看height的大小。首先是不出现滚动条的情况(为便于实验,此时body的margin设置为0)。
html-height:200px,body-height:200px,innerHeight:608
这种情况下,html和body的高度是一致的,就是我们所设置的div的高度。而innerHeight则是不一致的。高了很多。
而当出现滚动条的时候(将div的高度设置为2000px,结果如下:
html-height:2000px,body-height:2000px,innerHeight:608。此时可以看到,html和body的高度会随之改变,但是innerHeight依旧没有改变。
总结
最后我们就知道了,一般情况下,html和body的宽高都是相等的,除非是body的margin的影响。其宽高不包括滚动条。而innerHeight和innerWidth代表的永远是窗口的大小,窗口变大,他们的值就会变大,窗口变小,他们的值也就会变小,而且它的值包括滚动条的宽度,有可能比body和html的值大,也可能小。完全在于body中的元素的尺寸。所以在我看来,因为innerWidth存在兼容性问题,所以无法有个方法能够兼容所有浏览器获得窗口的大小,主要是窗口的高度不能够获得。
window.innerWidth、document.body.clientWidth和html的大小的区别的更多相关文章
- window.innerWidth和document.body.clientWidth的区别
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js获取浏览器基本信息:document.body.clientWidth/clientHeight/scrollWidth/scrollTop。(转)
js获取浏览器基本信息:document.body.clientWidth/clientHeight/scrollWidth/scrollTop. 分类: js.jquery.ext.js技术2011 ...
- document.body、document.documentElement和window获取视窗大小的区别
来源:http://www.ido321.com/906.html 在w3school关于window对象的介绍中,介绍了获取浏览器窗口大小的三种方法(浏览器的视口,不包括工具栏和滚动条). 对于In ...
- JS在window和document的应用
页面跳转: window.location.href('地址') window.open('地址', '_self') 打开新窗口: window.open('地址', '_blank') 只显示地址 ...
- document.documentElement.clientWidth
document.documentElement.clientWidth 摘自:http://blog.sina.com.cn/s/blog_6f1f9ead0100n1f6.html 关于获取各种浏 ...
- Window与Document
Window 表示一个包含DOM文档的窗口,其 document 属性指向窗口中载入的 DOM文档.使用 document.defaultView 属性可以获取指定文档所在窗口.window作为全局变 ...
- window、document、html、body、element的事件属性比较
在分析jQuery的事件的时候有提到绑定事件的方式: Dean Edwards的跨浏览器事件绑定使用的方式是 element["on" + type] = handleEvent; ...
- 拉动滚动条追加内容,无限延伸document高度 $(window).scroll(function(){if($(window).scrollTop() + $(window).height() == $(document).height()) { $("body").append(html) } })
$(document).ready(function() { // endless scrolling $(window).scroll(function() { if($(window).scrol ...
- 客户端JavaScript(window、document、element)
一.window对象是所有客户端JavaScript特性和API的主要接入点,用window来引用它. 属性:location属性(引用Location对象,当前显示在窗口的URL).document ...
随机推荐
- QML引擎的演进,第一部分
原文链接:Lars Knoll – Evolution of the QML engine, part 1 QML作为一项技术对于Qt的成功变得越来越重要.它允许创建流畅的动画界面,与现今的市场预期相 ...
- MIME Type
一.首先,我们要了解浏览器是如何处理内容的.在浏览器中显示的内容有 HTML.有 XML.有 GIF.还有 Flash --那么,浏览器是如何区分它们,决定什么内容用什么形式来显示呢?答案是 MIME ...
- Linux课程实践四:ELF文件格式分析
一.ELF文件格式概述 1. ELF文件 ELF:Executable and Linking Format,是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东 ...
- transfromjs动画效果
记得以前facebook做过一款HTML5游戏.开场动画是一块软体类似豆腐的东西一起摇摆.类似的效果如下面的gif所示: facebook当时使用的是createjs下的子项目easeljs和twee ...
- Web开发必知的八种隔离级别
ACID性质是数据库理论中的奠基石,它定义了一个理论上可靠数据库所必须具备的四个性质:原子性,一致性,隔离性和持久性.虽然这四个性质都很重要,但是隔离性最为灵活.大部分数据库都提供了一些可供选择的隔离 ...
- (转) PowerDesigner逆向工程导入MYSQL数据库总结
PowerDesigner逆向工程导入MySQL数据库总结 由于日常数据建模经常使用PowerDesigner,使用逆向工程能更加快速的生成模型提高效率,所以总结使用如下: 1. 安装MYS ...
- thinkphp 添加 修改删除
在 MainController.class.php 添加 public function zhuCe() { //时间两个逻辑 // 1 显示页面 2向数据库添加 if(empty($_POST)) ...
- 逐个访问URL的每个查询字符串参数
下面介绍一个函数,用于处理location.search的结果,以解析查询字符串,然后返回包含所有参数的一个对象. 比如 www.baidu.com?q=javascript&num=10 ...
- CSS控制文字,超出部分显示省略号
http://www.daqianduan.com/6179.html <p style="width: 300px;overflow: hidden;white-space: now ...
- 【译】RabbitMQ:发布-订阅(Publish/Subscribe)
在前一篇教程中,我们创建了一个工作队列,我们假设在工作队列后的每一个任务都只被调度给一个消费者.在这一部分,我们将做一些完全不一样的事情,调度同一条消息给多个消费者,也就是有名的“发布-订阅”模式.为 ...