关于高度(宽度),几个比较麻烦的问题
1. offsetHeight,cilentHeight和scrollHeight的区别
关于这三个属性在stackoverflow上有一个回答,表达相当的明白。
- clientHeight
元素可视区域的高度,包括元素可见部分的height和padding-top以及padding-bottom,不包括边框,滚动条。 - offsetHeight
在clientHeight的基础上,加上了border-top,border-bottom的大小以及滚动条的高度 - scrollHeight
元素整个内容的高度,包括元素的height和padding-top以及padding-bottom
附上原回答的图:
2. 滚动条
以高度为例。
考虑到兼容性、混杂模式等等问题,获取当前滚动条偏移量的方法一共有4种
- document.documentElement.scrollTop
除了IE6/7/8的混杂模式以外,所有浏览器均支持 - document.body.scrollTop
IE6/7/8的混杂模式时使用 - window.pageYOffset
除了IE6/7/8,所有浏览器均支持 - window.scrollY
MDN说,window.pageYOffset
是window.scrollY
的别名,但为了浏览器兼容问题,请使用window.pageYOffset
…..
看起来很麻烦,但如果抛弃IE8及之前版本的话,可以直接使用window.pageYOffset
MDN提供的完整的兼容性方案:
1 | var supportPageOffset = window.pageXOffset !== undefined; |
3. screen的偏移量
这是一个firefox和IE产生的小问题,影响不大而且实际应用比较少(大概)
firefox不支持screenTop
而IE不支持screenY
(何必呢…)
这个倒是好办: let screenY = window.screenY || window.screenTop
,水平方向同理。
4. 窗口大小
说起窗口大小,第一反应是window.innerHeight
和window.innerWidth
,这两个属性是浏览器窗口的内部尺寸,不包括状态栏工具栏等等东西,就是你能看到的窗口范围,但是它包括了滚动条的大小….
需要注意的是,IE6/7/8表示我们不支持这两个属性,要照顾这三兄弟的话,得用到第一个问题的clientHeight
属性。
这属性明摆着,大家都支持,但是也如第一个问题中提到的,这个属性不包括了滚动条的宽或者高。
最后
浏览器兼容性导致了很多问题,网上的解释又是各有各的,我在搞清楚这些属性的区别的时候头好晕…
在看关于这些东西的时候产生的问题我都写了下来,以后有新的问题还会总结在这里
在这里附一篇文章,大漠老师翻译的,对viewports问题解释了很多,也是从这里搞清了不少东西。