今天我想来探索一下几个经常搞混淆的概念,比如:
clientWidth
,offsetWidth
,scrollWidth
有什么区别?clientHeight
,offsetHeight
,scrollHeight
有什么区别?clientTop
,offsetTop
,scrollTop
有什么区别?clientLeft
,offsetLeft
,scrollLeft
有什么区别?上面这些属性和
style.width
,style.height
,style.left
,style.top
有什么区别?div.clientXXX
和document.body.clientXXX
有没有区别?不同浏览器之间有没有什么不同?(主要是chrome,firefox,Edge)
要解答以上问题,最直接的方式是写一个demo测试一下,下面放出测试代码。
1 | <!DOCTYPE html> |
额外说明
在所在容器的css属性是
box-sizing: content-box(默认)
时,style.width
实际上是:实际内容宽度 + 浏览器默认滚动条宽度(在chrome和firefox上测试了都等于17px),而clientWidth
这时等于= 实际内容(style.width - 浏览器滚动条默认宽度) + padding(即paddingLeft + paddingRight),不包括滚动条宽度,因此此时clientWidth != style.width
;在所在容器的css属性是box-sizing: border-box
时,这时style.width
等于offsetWidth
,即实际内容宽度 + padding + border,而这时clientWidth
等于 = 实际内容 + padding,但是这时实际内容时多少呢?实际内容等于 = (style.width - border - padding - 浏览器滚动条默认宽度)在css属性是
box-sizing:content-box(默认)
时,jquery.width() = style.width , jquery.outerWidth() = dom.offsetWidth
; 在css属性是box-sizing:border-box
时,jquery.width() = style.width - border - padding , jquery.outerWidth() = dom.offsetWidth