解析offsetHeight,clientHeight,scrollHeight之间的区别


Posted in Javascript onNovember 20, 2013

在网上搜了一下,结论非常笼统,讲IE从不讲版本,因此自己做了测试并上传结论。以下结论皆是在标准模式下测试通过的,没有测试quirk模式。

clientHeight

大部分浏览器对 clientHeight 都没有什么异议,都认为是内容可视区域的高度,也就是说页面浏览器中可以看到内容的这个区域的高度,即然是指可看到内容的区域,滚动条不算在内。但要注意padding是算在内。其计算方式为clientHeight = topPadding + bottomPadding+ height - scrollbar.height。

offsetHeight
在IE6,IE7,IE8以及最新的的FF, Chrome中,在元素上都是offsetHeight = clientHeight + 滚动条 + 边框。

scrollHeight
scrollHeight是元素的padding加元素内容的高度。这个高度与滚动条无关,是内容的实际高度。

计算方式 :scrollHeight = topPadding + bottomPadding + 内容margix box的高度。

在浏览器中的区别在于:

IE6、IE7 认为scrollHeight 是网页内容实际高度,可以小于clientHeight。

FF、Chrome 认为scrollHeight 是网页内容高度,不过最小值是clientHeight。

注: 以上都是对于一般元素而方言的,body和documentElement的clientHeight, offsetHeight和scrollHeight在各个浏览器中的计算方式又不同。在所有的浏览器中,如果你想获取整个视窗的高度,你得用documentElement.clientHeight,因为body.clientHeight是由它的内容决定的。 关于body和documentElement的这些属性,则完全是另外一回事:

FF19

在body上设置overflow:scroll就是设置浏览器的滚动条,导致body.clientHeight永远都等于body.scrollHeight。

body
clientHeight:body.padding+ body.height(css设置或内容撑的);

offsetHeight:clientHeight+ body.border;

scrollHeight== clientHeight。

documentElement
clientHeight= window视窗高度 -scrollbar.width。

offsetHeight= body.offsetHeight  + body.margin。

scrollHeight= 内容的高度(与body的height样式无关),但最小值是documentElement.clientHeight。

元素上
offsetHeight= padding + border + height。

clientHeight= padding + height - scrollbar.width。

scrollHeight>= clientHeight

从结果分析,FF认为scrollHeight的最小高度是clientHeight。

offsetLeft = 元素border左上角到window视窗原点的距离 或 到offsetParent的borderbox顶部的距离。

Chrome
body
clientHeight= body.padding + body.height(css设置或内容撑大);

offsetHeight = body.clientHeight + body.border;

scrollHeight= body.padding + 内容的高度(与height样式无关),但最小值是documentElement.clientHeight。

documentElement
clientHeight= window视窗高度 ? 滚动条高度。

offsetHeight  = body.offsetHeight + body.margin;

scrollHeight  = 内容的高度(与body上的height无关),但最小值是documentElement.offsetHeight。

元素上
offsetHeight = padding + border + height。

clientHeight = padding + height - scrollbar.width。

scrollHeight >= clientHeight

Safari 5
body
clientHeight= body.padding + body.height(CSS或内容撑的);

offsetHeight= clientHeight + border;

scrollHeight= body.padding + 内容的高度(与height样式无关),但最小值是documentElement.clientHeight。

documentElement
clientHeight = window窗口大小 ? 滚动条大小

offsetHeight = body.offsetHeight + body.margin

scrollHeight= 内容的高度(与body上的height无关),但最小值是documentElement.offsetHeight。

IE8
在IE8下,滚动条的大小是17个像素。

body
clientHeight= body.padding + body.height(css设置或内容撑大)

offsetHeight = clientHeight + body.border

scrollHeight =内容的高度(与body上的height无关),但最小值是clientHeight。

documentElement
clientHeight = 窗口大小(除去滚动条后)

offsetHeight = clientHeight + 滚动条大小 + body.border

scrollHeight=内容的高度(与body上的height无关),但最小值是body.offsetHeight+ margin。

元素上
offsetHeight = padding + border + height。

clientHeight = padding + height - scrollbar.width。

scrollHeight >= clientHeight

从结果分析,FF认为scrollHeight的最小高度是clientHeight。

offsetLeft = 元素border左上角到画布原点的距离 或 到offsetParent的borderbox顶部的距离。

IE7
在IE7中,body上设置的滚动条并不是窗口的滚动条,这个需要注意。

body
clientHeight= body.padding + height(css设置或内容撑大)? body上的滚动条。

offsetHeight= clientHeight + 滚动条的大小+body.border。

scrollHeight=   内容的高度(与body上的height无关)。

documentElement
clientHeight = window视窗大小(与滚动条的有无无关)

offsetHeight = clientHeight。

scrollHeight = body.offsetHeight + border.margin

元素
offsetHeight = padding + border + height。

clientHeight = padding + height - scrollbar.width。

scrollHeight = padding + 内容marginbox的高度

从结果分析,IE7认为scrollHeight可以小于clientHeight。

offsetLeft = 元素border box左上角到父容器(不是offsetParent)的borderbox左上角的距离。

IE6
在IE6中,与IE7类似, body上设置的滚动条并不是窗口的滚动条。

body
clientHeight = body.padding + body.height

offsetHeight = body.clientHeight + body.border + body上滚动条大小。

scrollHeight =内容的高度(与body上的height无关)。

documentElement
在IE6中,与IE7类似,虽然body上设置的滚动条并不是窗口的滚动条,但它的clientHeight和offsetHeight还算与其它浏览器想统一。

clientHeight = 窗口大小(除去窗口滚动条大小后)

offsetHeight =clientHeight + body.border

scrollHeight = body.offsetHeight + body.margin

元素
offsetHeight = padding + border + height。

clientHeight = padding + height - scrollbar.width。

scrollHeight = padding + 内容margin box的高度

从结果分析,IE6认为scrollHeight可以小于clientHeight。

同理

clientWidth、offsetWidth 和scrollWidth 的解释与上面相同,只是把高度换成宽度即可。

Javascript 相关文章推荐
JavaScript 利用Cookie记录用户登录信息
Dec 08 Javascript
基于jquery的模态div层弹出效果
Aug 21 Javascript
页面元素绑定jquery toggle后元素隐藏的解决方法
Mar 27 Javascript
详解jquery中$.ajax方法提交表单
Nov 03 Javascript
ES6新特性之函数的扩展实例详解
Apr 01 Javascript
浅谈Angular路由守卫
Aug 26 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
Sep 21 Javascript
vue实现a标签点击高亮方法
Mar 17 Javascript
深入浅析Vue中的Prop
Jun 10 Javascript
关于vue编译版本引入的问题的解决
Sep 17 Javascript
JS实现简单的点赞与踩功能示例
Dec 05 Javascript
vuex + keep-alive实现tab标签页面缓存功能
Oct 17 Javascript
JS事件在IE与FF中的区别详细解析
Nov 20 #Javascript
引用 js在IE与FF之间的区别详细解析
Nov 20 #Javascript
JavaScript之IE的fireEvent方法详细解析
Nov 20 #Javascript
JavaScript中setInterval的用法总结
Nov 20 #Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
Nov 20 #Javascript
jquery iframe操作详细解析
Nov 20 #Javascript
JS获取当前日期和时间的简单实例
Nov 19 #Javascript
You might like
PHP自动选择 连接本地还是远程数据库
2010/12/02 PHP
PHP中的session永不过期的解决思路及实现方法分享
2011/04/20 PHP
PHP使用DES进行加密与解密的方法详解
2013/06/06 PHP
PHP中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
Javascript优化技巧(文件瘦身篇)
2008/01/28 Javascript
js 图片轮播(5张图片)
2008/12/30 Javascript
jQuery操作select的实例代码
2012/06/14 Javascript
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
2015/03/26 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
JQuery Ajax 异步操作之动态添加节点功能
2017/05/24 jQuery
JavaScript文件的同步和异步加载的实现代码
2017/08/19 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
详解js访问对象的属性和方法
2018/10/25 Javascript
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
Python中用memcached来减少数据库查询次数的教程
2015/04/07 Python
Python合并字典键值并去除重复元素的实例
2016/12/18 Python
Django 导出 Excel 代码的实例详解
2017/08/11 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
scikit-learn线性回归,多元回归,多项式回归的实现
2019/08/29 Python
keras多显卡训练方式
2020/06/10 Python
HTML5之SVG 2D入门8—文档结构及相关元素总结
2013/01/30 HTML / CSS
H5 canvas实现贪吃蛇小游戏
2017/07/28 HTML / CSS
Html5页面中的返回实现的方法
2018/02/26 HTML / CSS
湖南卫视在线视频媒体平台:芒果TV
2019/10/30 全球购物
幼儿园中班下学期评语
2014/04/18 职场文书
建议书的格式
2014/05/12 职场文书
团队拓展活动方案
2014/08/28 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
2015秋季开学典礼演讲稿
2015/07/16 职场文书
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js