解析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 相关文章推荐
推荐20家国外的脚本下载网站
Apr 28 Javascript
JS实现弹性菜单效果代码
Sep 07 Javascript
bootstrap-treeview自定义双击事件实现方法
Jan 09 Javascript
使用JQuery 加载页面时调用JS的实现方法
May 30 Javascript
jQuery插件WebUploader实现文件上传
Nov 07 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
Jan 16 Javascript
vuejs前后端数据交互之从后端请求数据的实例
Aug 11 Javascript
JS判断两个数组或对象是否相同的方法示例
Feb 28 Javascript
微信小程序云开发之使用云函数
May 17 Javascript
详解ES6 CLASS在微信小程序中的应用实例
Apr 24 Javascript
JS实现手写 forEach算法示例
Apr 29 Javascript
何时使用Map来代替普通的JS对象
Apr 29 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和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
php parse_str() 函数的定义和用法
2016/05/23 PHP
PHP实现根据数组某个键值大小进行排序的方法
2018/03/13 PHP
超清晰的document对象详解
2007/02/27 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
2015/01/01 NodeJs
JSON遍历方式实例总结
2015/12/07 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
vue.js入门教程之绑定class和style样式
2016/09/02 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
小程序实现分类页
2019/07/12 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
原生js中运算符及流程控制示例详解
2021/01/05 Javascript
[05:45]Ti4观战指南(下)
2014/07/07 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
Python查看多台服务器进程的脚本分享
2014/06/11 Python
python定时检查某个进程是否已经关闭的方法
2015/05/20 Python
Python实现的文本简单可逆加密算法示例
2017/05/18 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
python lxml中etree的简单应用
2019/05/10 Python
pycharm访问mysql数据库的方法步骤
2019/06/18 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
2014年度党员自我评议
2014/09/13 职场文书
任命书标准格式
2015/03/02 职场文书
2015新员工工作总结范文
2015/10/15 职场文书
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers
Apache Pulsar结合Hudi构建Lakehouse方案分析
2022/03/31 Servers
Java版 简易五子棋小游戏
2022/05/04 Java/Android