offsetHeight、clientHeight、scrollHeight 获取dom元素的各种位置

444 阅读3分钟

前言

offsetHeight、offsetWidth、offsetLeft、offsetTop
clientHeight、clientWidth、clientLeft、clientTop
scrollHeight、scrollWidth、scrollLeft、scrollTop
这些获取元素位置的属性可以帮助我们完成像图片懒加载、下拉触底加载更多等场景。但对我而言,我知道他们都是获取距离的,但是不清楚它们之间的具体区别。下面我们结合图片和文字来重新认识一下这些似曾相识的属性。

offset系列

offset翻译过来就是偏移量,我们借助offset的相关属性可以动态的得到目标元素的位置、大小信息。

常用属性如下

属性作用
element.offsetParent返回作用该元素带有定位的父级元素 如果父级元素都没有定位则返回body
element.offsetTop返回当前元素距离带有定位的父元素上方的距离(如果无父元素或者父元素无定位则返回body的距离)
element.offsetLeft返回当前元素距离带有定位的父元素左边的距离(如果无父元素或者父元素无定位则返回body的距离)
element.offsetWidth返回模板元素的宽度(padding+border+自身宽度)
element.offsetHeight返回模板元素的高度(padding+border+自身高度)

注意:通过以上方法获取的数据均不带单位

当父元素具有定位时,offsetTop和offsetLeft表现形式如下

offset和style的区别

通过element.style同样可以获取到元素的宽高属性,那么style和offset有什么区别呢

offset的特点style的特点
offset可以得到任意样式表中的样式值style只能得到行内样式表中的样式值
offset系列获得的数值是没有单位的(数值)style.widht获取到的值是具有单位的(100px 字符串)
offsetWidth等属性是只读的style.width的属性是可赋值的
offsetWidth包含padding+border+widthstyle.widht不包含padding和border

通过以上总结可得,当我们想要获取元素大小位置时,使用offset更合适

当我们想要改变元素的相关属性时,使用style更为合适

client系列

使用client相关属性也可以获取到元素可视区的相关信息。常用的属性如下

client系列属性作用
element.clientTop返回元素上边框的大小
element.clientLeft返回元素左边框的大小
element.clientWidth返回元素宽度(padding+width)
element.clientHeight返回元素高度(padding+height)

通过上方属性可知,client与offset的主要区别就是clientWidth和clientHeight返回的值不包括border。 专门提供了clientTop和clientLeft这两个属性来获取边框的相关信息

Scroll系列

scroll系列的相关属性在开发中也经常会用到,动态的获取元素的大小,滚动距离。通常我们会监听元素的滚动事件来获取scroll属性。

scroll系列属性作用
element.scrollTop返回被卷去的上侧距离(可修改)
element.scrollleft返回被卷去的左侧距离(可修改)
element.scrollWidth返回自身实际的宽度,不含边框
element.scrollHeight返回自身实际宽度,不含边框

图解

image.png

offset、client、scroll相关属性总结

  • offset系列经常用于获取元素的位置 offsetLeft offsetTop

  • scroll经常用于获取滚动距离 scrollTop scrollLeft

  • client经常用于获取元素大小 clientWidth clientHeight

  • 想要修改元素的大小相关属性时,使用style直接修改