首先,我们知道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的大小的区别的更多相关文章

  1. window.innerWidth和document.body.clientWidth的区别

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. js获取浏览器基本信息:document.body.clientWidth/clientHeight/scrollWidth/scrollTop。(转)

    js获取浏览器基本信息:document.body.clientWidth/clientHeight/scrollWidth/scrollTop. 分类: js.jquery.ext.js技术2011 ...

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

    来源:http://www.ido321.com/906.html 在w3school关于window对象的介绍中,介绍了获取浏览器窗口大小的三种方法(浏览器的视口,不包括工具栏和滚动条). 对于In ...

  4. JS在window和document的应用

    页面跳转: window.location.href('地址') window.open('地址', '_self') 打开新窗口: window.open('地址', '_blank') 只显示地址 ...

  5. document.documentElement.clientWidth

    document.documentElement.clientWidth 摘自:http://blog.sina.com.cn/s/blog_6f1f9ead0100n1f6.html 关于获取各种浏 ...

  6. Window与Document

    Window 表示一个包含DOM文档的窗口,其 document 属性指向窗口中载入的 DOM文档.使用 document.defaultView 属性可以获取指定文档所在窗口.window作为全局变 ...

  7. window、document、html、body、element的事件属性比较

    在分析jQuery的事件的时候有提到绑定事件的方式: Dean Edwards的跨浏览器事件绑定使用的方式是 element["on" + type] = handleEvent; ...

  8. 拉动滚动条追加内容,无限延伸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 ...

  9. 客户端JavaScript(window、document、element)

    一.window对象是所有客户端JavaScript特性和API的主要接入点,用window来引用它. 属性:location属性(引用Location对象,当前显示在窗口的URL).document ...

随机推荐

  1. linux命令行下载jdk

      官网JDK7下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 在里面 ...

  2. 【转】关于LinQ的动态Or查询

    /// <summary> /// 构造函数使用True时:单个AND有效,多个AND有效:单个OR无效,多个OR无效:混合时写在AND后的OR有效 /// 构造函数使用False时:单个 ...

  3. 写了cookie阻止通过输入地址直接访问下一个html,但是直接输入地址访问时,会闪一下下一个页面,怎么回事啊????、

    描述:做了两个页面login.html   index.html  在index的body加了onload事件,调用一个js,js中有cookie的判断,防止没有登录就打开index.html,如果没 ...

  4. python之路-Day11

    引子 到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这哥俩的优势和劣势都非常的明显,我们一起来回顾下 协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程: ...

  5. 简单C语言文法

    <程序>→<外部声明>|<程序><外部声明> <外部声明>→<函数定义>|<声明> <函数定义>→< ...

  6. gridview填充剩下的空间

    设置不要在控间中滑动: public class DeliverGridView extends GridView { public DeliverGridView(Context context, ...

  7. jQuery HTML 操作

    jQuery 包含很多供改变和操作 HTML 的强大函数. 改变 HTML 内容 语法 $(selector).html(content) html() 函数改变所匹配的 HTML 元素的内容(inn ...

  8. cocos2dx中常见设计模式

    1.单例设计模式:导演类 2.观察者模式: 被观察者含有一个数组,里边存放了所有观察者的引用,在被观察者的状态发生改变的时候,通过调用观察者的函数来通知观察者,实现了信息的传递.  事件监听器:就是采 ...

  9. Chain Of Responsibility(职责连)-对象行为型模式

    1.意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 2.动机 给多个对象处理一个请求的机会,从而 ...

  10. [转载]Matlab生成Word报告

    最近在进行一批来料的检验测试,一个个手动填写报告存图片太慢了,就有了种想要使用Matlab在分析完后数据可以自动生成PDF报告的想法,于是就去网上搜索了相关的资料,发现Matlab中文论坛上有xiez ...