解析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 相关文章推荐
影响jQuery使用的14个方面
Sep 01 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
Apr 20 Javascript
小巧强大的jquery layer弹窗弹层插件
Dec 06 Javascript
Vue.js组件tab实现选项卡切换
Mar 23 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
Mar 13 Javascript
JS匹配日期和时间的正则表达式示例
May 12 Javascript
react-router JS 控制路由跳转实例
Jun 15 Javascript
vue.js源代码core scedule.js学习笔记
Jul 03 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
Jul 05 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
Sep 30 Javascript
angula中使用iframe点击后不执行变更检测的问题
May 10 Javascript
JavaScript语法约定和程序调试原理解析
Nov 03 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
一个颜色轮换的简单例子
2006/10/09 PHP
php判断并删除空目录及空子目录的方法
2015/02/11 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
js 上传图片预览问题
2010/12/06 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
javascript 获取HTML DOM父、子、临近节点
2014/06/16 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
JavaScript中的ubound函数使用实例
2014/11/04 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
vue组件Prop传递数据的实现示例
2017/08/17 Javascript
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
在Python中使用mechanize模块模拟浏览器功能
2015/05/05 Python
Python实现简单登录验证
2016/04/13 Python
Django基础之Model操作步骤(介绍)
2017/05/27 Python
python3 图片referer防盗链的实现方法
2018/03/12 Python
Python爬虫之网页图片抓取的方法
2018/07/16 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
美工的岗位职责
2013/11/14 职场文书
卫生安全检查制度
2014/02/04 职场文书
关于保护环境的标语
2014/06/09 职场文书
销售人员求职信
2014/07/22 职场文书
八荣八耻演讲稿
2014/09/15 职场文书
班级光棍节联谊会策划书
2014/10/10 职场文书
美丽人生观后感
2015/06/03 职场文书
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
jackson json序列化实现首字母大写,第二个字母需小写
2021/06/29 Java/Android
dubbo集成zipkin获取Traceid的实现
2021/07/26 Java/Android
分享提高 Python 代码的可读性的技巧
2022/03/03 Python