解析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 相关文章推荐
地址栏上的一段语句,改变页面的风格。(教程)
Apr 02 Javascript
使用jQuery设置disabled属性与移除disabled属性
Aug 21 Javascript
在Google 地图上实现做的标记相连接
Jan 05 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
Aug 12 Javascript
js实现不重复导入的方法
Mar 02 Javascript
简单实现JavaScript图片切换效果
Nov 28 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
Dec 30 Javascript
5种JavaScript脚本加载的方式
Jan 16 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
Sep 14 Javascript
layui中layer前端组件实现图片显示功能的方法分析
Oct 13 Javascript
详解VUE里子组件如何获取父组件动态变化的值
Dec 26 Javascript
Vue实现按钮级权限方案
Nov 21 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 提取图片img标记中的任意属性的简单实例
2013/12/10 PHP
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
深入理解JS中的substr和substring
2016/04/26 Javascript
JavaScript的this关键字的理解
2016/06/18 Javascript
什么是JavaScript中的结果值?
2016/10/08 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
浅谈Angular 中何时取消订阅
2017/11/22 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
2018/05/31 Javascript
Jquery异步上传文件代码实例
2019/11/13 jQuery
VUE 动态组件的应用案例分析
2019/12/02 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
2019/12/20 Javascript
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
Linux下将Python的Django项目部署到Apache服务器
2015/12/24 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
Python实现的远程文件自动打包并下载功能示例
2019/07/12 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
在Python 的线程中运行协程的方法
2020/02/24 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
关于css中margin的值和垂直外边距重叠问题
2020/10/27 HTML / CSS
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
商务日语专业毕业生求职信
2013/10/26 职场文书
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
幼儿园实习自我鉴定
2013/12/15 职场文书
励志演讲稿500字
2014/08/21 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
简历自我评价模板
2015/03/11 职场文书
高三教师工作总结2015
2015/07/21 职场文书
小学六年级毕业感言
2015/07/30 职场文书
大学新生入学感想
2015/08/07 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
python如何在word中存储本地图片
2021/04/07 Python
Python3 如何开启自带http服务
2021/05/18 Python
SQL CASE 表达式的具体使用
2022/03/21 SQL Server
Java中生成微信小程序太阳码的实现方案
2022/06/01 Java/Android