offsetHeight, clientHeight与scrollHeight的区别
在网上搜了一下,结论非常笼统,讲IE从不讲版本,因此自己做了测试并上传结论。以下结论皆是在标准模式下测试通过的,没有测试quirk模式。
clientHeight
大部分浏览器对 clientHeight 都没有什么异议,认为是元素可视区域的高度,也就是说元素或窗口中可以看到内容的这个区域的高度,即然是指可看到内容的区域,滚动条不算在内。但要注意padding是算在内。其计算方式为clientHeight = topPadding + bottomPadding+ height - 水平滚动条高度。
offsetHeight
在IE6,IE7,IE8, IE9以及最新的的FF, Chrome中,对于一般元素,都是offsetHeight = padding + height + border = clientHeight + 滚动条 + 边框。
scrollHeight
scrollHeight的争议比较大,有些浏览器认为scrollHeight可以小于clientHeight,有些认为scrollHeight至少应该等于clientHeight。但有一点是一样的,就是scrollHeight >= topPadding + bottomPadding + 内容margin box的高度。
在浏览器中的区别在于:
IE6、IE7 认为scrollHeight 是内容高度,可以小于clientHeight。
FF 认为scrollHeight 是内容高度,不过最小值是clientHeight。
注: 以上都是对于一般元素而方言的,body和documentElement的clientHeight, offsetHeight和scrollHeight在各个浏览器中的计算方式又不同。
在所有的浏览器中,如果你想获取视窗可见部分的高度,应该使用documentElement.clientHeight,因为body.clientHeight是由它的内容决定的。
FF30
注意:Firefox30中,水平滚动条的宽度是17个像素。
body
offsetHeight = body.padding + body.border + body.height(CSS设置或内容撑的);
clientHeight = body.padding + body.height(CSS设置或内容撑的);
scrollHeight >= clientHeight;
documentElement
offsetHeight = body.offsetHeight + body.margin;
clientHeight = window窗口可见高度;
scrollHeight >= clientHeight
因此,只是获取窗口可见高度,在FF中得用documentElement.clientHeight,获取整个页面的高度,则应该用documentElement.scrollHeight。
元素
offsetHeight = padding +border + height;
clientHeight = padding +height -水平滚动条的高度。
scrollHeight >=clientHeight
总结:从body, documentElement, 元素的结果分析,FireFox认为scrollHeight的最小高度是clientHeight。
offsetLeft = 元素border左上角到window视窗原点的距离 或 到offsetParent的border box顶部的距离。
Chrome 39
注意:Chrome39中,水平滚动条的宽度是17个像素。
body
offsetHeight = body.padding+ body.border + body.height(CSS设置或内容撑大);
clientHeight= body.pdding + body.height(CSS设置或内容撑大);
scrollHeight >= offsetHeight; 并且scrollHeight >= window窗口可见高度;
如果body没有内容(空的):
body.offsetHeight == documentElement.offsetHeight;
body.clientHeight ==documentElement.clientHeight;
body.scrollHeight ==documentElement.scrollHeight;
而且以上属性的值都是浏览器的视窗高度。
documentElement
offsetHeight = scrollHeight = body.offsetHeight+ body.margin;
clientHeight = window视窗可见高度;
如果body内容过短,则documentElement的offsetHeight和scrollHeight将比clientHeight小。
因此,只是获取页面窗口可视部分高度,在Chrome中用documentElement.clientHeight;获取整个页面内容最大高度(如果比窗口小,取窗口的高度),则应该用body.scrollHeight;获取页面内容的实际高度,应该使用body.offsetHeight()。
元素
offsetHeight = padding + border + height;
clientHeight = padding + height -水平滚动条的高度;
scrollHeight >= clientHeight;
offsetLeft = 元素border左上角到画布原点的距离 或 到offsetParent的border box顶部的距离。
IE9
注意:IE9中,滚动条的宽度是17个像素。
body
offsetHeight = body.padding +body.border + body.height(CSS设置或内容撑大);
clientHeight = body.padding + body.height(CSS设置或内容撑大);
scrollHeight >= clientHeight;
documentElement
offsetHeight = clientHeight + 水平滚动条的高度;
clientHeight = window窗口可见高度
scrollHeight >= clientHeight并且scrollHeight >= body.offsetHeight
因此,只是获取window窗口可见高度,在IE9中得用documentElement.clientHeight,获取整个页面内容的高度,则应该用documentElement.scrollHeight。
元素
offsetHeight = padding +border + height。
clientHeight = padding +height - 滚动条的宽度。
scrollHeight >=clientHeight;
总结:从body, documentElement, 元素的结果分析,IE9认为scrollHeight的最小高度是clientHeight。
从结果分析,IE9认为scrollHeight的最小高度是clientHeight。
IE8
注意:IE8中,滚动条的宽度是17个像素。
body
offsetHeight = body.padding +body.border + body.height(CSS设置或内容撑大);
clientHeight = body.padding + body.height(CSS设置或内容撑大);
scrollHeight >= clientHeight;
documentElement
offsetHeight = clientHeight + 水平滚动条的高度 + body.border
clientHeight = window窗口可见高度
scrollHeight >= clientHeight并且scrollHeight >= body.offsetHeight
因此,只是获取窗口可见高度,在IE8中得用documentElement.clientHeight,获取整个页面内容高度,则应该用documentElement.scrollHeight。
元素上
offsetHeight = padding +border + height。
clientHeight = padding +height – 水平滚动条高度。
scrollHeight >=clientHeight
从结果分析,IE8认为scrollHeight的最小高度是clientHeight。
offsetLeft = 元素border左上角到画布原点的距离 或 到offsetParent的border box顶部的距离。
IE7
注意:IE7中,滚动条的宽度是17个像素。
body
offsetHeight = body.padding + body.border+ body.height(CSS设置或内容撑大);
clientHeight = body.height +body.padding – 水平滚动条高度;
scrollHeight = 内容margin box的高度;
documentElement
offsetHeight = clientHeight =window视窗可见高度;
scrollHeight = body.offsetHeight+ body.margin;
因此,只是获取窗口可见部分高度,在IE7中得用documentElement.clientHeight,获取整个页面内容的大小,则用documentElement.scrollHeight。
元素
offsetHeight = padding +border + height。
clientHeight = padding +height - scrollbar.width。
scrollHeight = padding + 内容margin box的高度
从结果分析,IE7认为scrollHeight 可以小于clientHeight。
offsetLeft = 元素border box左上角到父容器(不是offsetParent)的border box左上角的距离。
IE6
body
offsetHeight = body.padding +内容margin box的高度。
clientHeight = scrollHeight
documentElement
offsetHeight=画布高度,但offsetHeight>= clientHeight
clientHeight = window窗口可见高度。
scrollHeight = 内容的高度
因此,只是获取页面窗口的大小,在IE6中得用documentElement.clientHeight,获取整个页面内容的大小,则应该用documentElement.offsetHeight。
元素
offsetHeight = padding +border + height。
clientHeight = padding +height - scrollbar.width。
scrollHeight = padding + 内容margin box的高度
从结果分析,IE6认为scrollHeight 可以小于clientHeight。
offsetLeft = 元素border box左上角到父容器(不是offsetParent)的border box左上角的距离。
结论
l IE6、IE7认为scrollHeight可以小于clientHeight;
l IE8、IE9和Firefox认为scrollHeight>=clientHeight;
l 取窗口可见部分高度,统一用documentElement.clientHeight即可;
l 取页面内容的高度(如果内容高度比窗口高度小,取窗口高度),则用documentElement.scrollHeight,只有Chrome需要使用body.scrollHeight。
同理
clientWidth、offsetWidth 和scrollWidth 的解释与上面相同,只是把高度换成宽度即可。
- /**
- * Figure out if current document is in quirks mode.
- * @param a: document object
- */
- function isQuirksMode(doc) {
- // In IE6,IE7,IE8,IE9,IE10 Firefox and Chrome browsers, document.compatMode has two values: "BackCompat", "CSS1Compat".
- return doc.compatMode && doc.compatMode.indexOf("CSS") != -1;
- }
- /**
- * Get the visible height of the whole document or window.
- */
- function getDocumentClientHeight(doc) {
- // in IE quirks mode, documentElement.clientHeight == 0
- return isQuirksMode(a) ? doc.body.clientHeight : doc.documentElement.clientHeight;
- }
- /**
- * Get the page height, if content's height is smaller than window's height, use window's height.
- */
- function getPageHeight(doc) {
- // for IE and Firefox, use documentElement.scrollHeight, Chrome use body.scrollHeight.
- return Math.max(doc.documentElement.scrollHeight, doc.body.scrollHeight);
- }
offsetHeight, clientHeight与scrollHeight的区别的更多相关文章
- clientHeight ,offsetHeight,style.height,scrollHeight有区别与联系
style.height 包括 元素的滚动条,不包括边框clientHeight 不包括元素的滚动条和边框,只有在没有元素的滚动条的情况下,style.height相等于clientHeightoff ...
- offsetTop,offsetHeight,clientHeight,scrollHeight,scrollTop区别
这些高度相信很多同学都搞不清楚吧.这里我通过本地测试,发现了区别. 以聊天窗口为例. 元素(class='content')高度444px,其中上下padding分别是10px,margin为0.距离 ...
- 关于height、offsetheight、clientheight、scrollheight、innerheight、outerheight的区别
二.也是平时经常用到的offsetheight 它返回的高度是内容高+padding+边框,但是注意哦,木有加margin哦,当然一般也木有啥需要把margin加进去的,以上代码为例,结果显示上图h2 ...
- 关于height、offsetheight、clientheight、scrollheight、innerheight、outerheight的区别一览
平时,不管在pc端页面还是移动端页面,因为我们一般很少会设置某个块的的高度,但是呢,我有时候有需要取到这些高度以便于我们方便进行判断和下一步的编写.一般这个时候我都是直接的获取一个块的高度.heigh ...
- 各种高度的区别及height、clientHeight、scrollHeight、offsetHeight的区分
1.height.clientHeight.scrollHeight.offsetHeight 我们来实现test中的onclick事件 function justAtest() { ...
- innerHeight,clientHeight,offsetHeight,scrollWidth等的区别和用法
要理解这几个属性,首先要搞明白body,documentElement的区别 1.body是DOM对象里的body子节点,即<body>标签2.documentElement是整个节点树的 ...
- 彻底搞清楚DOM元素的height,offsetHeight,clientHeight,scrollHeight
测试用例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- height、clientHeight、scrollHeight、offsetHeight区别
转自 http://www.cnblogs.com/yuteng/articles/1894578.html 我们来实现test中的onclick事件 function justAtest() ...
- 关于offsetTop offsetHeight clientHeight scrollHeight scrollTop的区别研究
我是以chrome浏览器做的研究. 先看一段代码: <script> window.addEventListener('DOMContentLoaded',function(){ var ...
随机推荐
- 记CentOS-7-x86_64-DVD-1503与Windows7单硬盘双系统的安装
我最初的设想是:Win引导CentOS,最后却变成了CentOS引导Win了.算是‘弄拙成巧’了吧. 因为我打算用U盘刻录镜像直接从U盘启动,所以不需要网上一些教程里面的繁琐的win下引导CentOS ...
- IOS开发之Bug--遇到一个类型不确定的bug
下面的问题不大,是我在开发中遇到的问题: 然后我就google搜一下这个报错 . 下面就解决了:
- css解决方案
1,Flexbox(更优雅的布局) ①居中:{display:flex; justify-content:center; align-items:center;}②设定flex-grow属性的话,会自 ...
- Linux tmp目录自动清理总结
在Linux系统中/tmp文件夹下的文件是会被清理.删除的,文件清理的规则是如何设定的呢? 以Redhat为例,这个主要是因为作业里面会调用tmpwatch命令删除那些一段时间没有访问的文件. 那么什 ...
- javascript - 封装原生js实现ajax
1 /* * ajax方法 */ var Ajax = function() { var that = this; //创建异步请求对象方法 that.createXHR = function() { ...
- asp.net mvc 之旅—— 第四站 学会用Reflector调试我们的MVC框架代码
我们知道,现在能调试.net程序通常有两个,第一个是ILSpy,还是一个是Reflector,这两个小反编译软件算是我们研究底层代码中所拥有的一把 锋利小尖刀~~~,比如你看到的ILSpy这样的界面图 ...
- Windows驱动——虚拟机 虚拟串口 双机调试
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- 为什么 MySQL 回滚事务也会导致 ibd 文件增大?
一个简单的测试: start transaction; insert into tb1 values(3, repeat('a', 65000),'x',1); --commit; rollback; ...
- Shelve Instance 操作详解 - 每天5分钟玩转 OpenStack(38)
Instance 被 Suspend 后虽然处于 Shut Down 状态,但 Hypervisor 依然在宿主机上为其预留了资源,以便在以后能够成功 Resume. 如果希望释放这些预留资源,可以使 ...
- 令人崩溃的@requestBody乱码一例
这个问题真是让我心力憔悴了...在客户现场对接就是乱码,StringHttpConverter怎么配置都不行... 场景其实很简单:客户那头post一个http请求,包体是json字符串,我这头spr ...