详解DOM对象中clientWidth、offsetWidth等属性

我们有时需要获得鼠标在某盒子中的位置,或者是随意移动某盒子的位置,在这些场景中我们可能经常需要用到clientWidth、offsetWidth、offsetTop啊等等。但是对于初学者来说(包括我),看到这些就头疼,因为感觉意思都相近,但作用却不同,所以今天天我就来捋一捋,搞清楚,后面好干活。好吧,废话不多说,开始吧。

先上一下示例代码,下面要用到。

HTML:                                                              

CSS:

JS:

一、clientWidth和clientHeight

clientWidth和clientHeight的计算方式是一样的,只不过一个为水平方向,一个为垂直方向,接下来我就只用clientWidth来说明情况。clientWidth与只与元素有关,它的计算方式如下。

clientWidth=width(样式中设置的)+左padding+右padding-垂直滚动条宽度。

同理,clientHeight=height+顶部padding+底部padding-水平滚动条宽度。

以下是示例(div#sub-content没有添加margin):

clientwidth

输出:

clientWidth:200+10+10-17(滚动条宽度)=203

二、offsetWidth和offsetHeight

offsetWidth与offsetHeight有个特点,就是这两个属性的值只与该元素有关,与周围元素(父级和子级元素无关)。

它们的大小取决于元素的宽高、padding以及边框border,有无滚动条都没有影响,下面是他们的计算方式。

offsetWidth=width(样式中设置的)+左右padding+左右border

offsetHeight=height(样式中设置的)+上下padding+上下border

以下是示例(#sub-content的高度改为100px):

输出:

三、offsetParent

也许你看到这里会觉得奇怪,怎么突然冒出个offsetParent出来,先别急,后面我要讲offsetTop和offsetLeft,因为这两个和offsetParent离不开关系,所以我就先好后介绍一下offsetParent。

offsetParent属性返回一个对象的引用,这个对象是距离调用offsetParent的元素最近的(在包含层次中最靠近的),并且是已进行过CSS定位的容器元素。 如果这个容器元素未进行CSS定位, 则offsetParent属性的取值为根元素的引用。

  总的来说两条规则:

  1、如果当前元素的父级元素没有进行CSS定位(position为absolute或relative),offsetParent为body。

  2、如果当前元素的父级元素中有CSS定位(position为absolute或relative),offsetParent取最近的那个父级元素。

我们以上面代码为例,可以看到div#content并没有设置定位position,接下来我们要查找div#sub-content的offsetParent,

看下面演示。

输出:

当div#content添加定位position:reletive;样式,并将tagName换为id时

输出:

四、offsetTop和offsetLeft

offsetTop和offsetLeft这两个属性和offsetWidth和offsetHeight不同的是,它们受到offsetParent的影响(offsetParent上面有讲),

MSDN上对offsetLeft的定义是:

The HTMLElement.offsetLeft read-only property returns the number of pixels that the upper left corner of the current element is offset to the left within the HTMLElement.offsetParent node.

指的是offsetLeft只读属性返回当前元素左上角在offsetParent节点内向左偏移的像素数。

从这个定义中我们可以明确地知道offsetLeft与当前元素的margin-left和offsetParent的padding-left有关。也就是说应该是:

offsetLeft=(offsetParent的padding-left)+(中间元素的offsetWidth)+(当前元素的margin-left)。

offsetTop=(offsetParent的padding-top)+(中间元素的offsetHeight)+(当前元素的margin-top)。

我们为上面代码的div#content添加一个子元素div#sub1

并添加样式(说明以下,div#sub-content的高度被我改成了50px)

演示图如下

可以知道,div#sub-content的offsetParent并不是div#content,而是BODY,我们打印一下offsetTop

输出:

112=20(div#content margin-top)+10(div#content border-top)+10(div#content padding-top)+52(#divsub1  height+border) + 20(div#sub-content margin-top)

接下来我们为div#content添加定位position:relative;

最后输出:

可以知道div#sub-content的offsetParent变成div#content。

五、scrollWidth和scrollHeight

scrollWidth和scrollHeight这两个属性用来获取指定元素内容层的真实宽度和高度.

当不存在水平或垂直滚动条时,scrollWidth和scrollHeight等于clientWidth和clientHeight,

当存在水平或垂直滚动条时,请看下面演示(将div#sub-contetn的height设为300px)

输出:

可以看到图中存在垂直方向的滚动条

scrollWidth=clientWidth=width+左右padding-滚动条宽度=203

scrollHeight=20(div#content padding)+40(div#sub-content margin)+20(div#sub-content border)+20(div#sub-content padding)+300(div#sub-content height)=400

可以看出来其实scrollWidth和scrollHeight等于clientWidth和clientHeight还是有很大联系的,当内容层的高宽度超过指定元素的高宽度时,scrollWidth和scrollHeight还得在clientWidth和clientHeight的基础上加上内容层增加高度以及减去相应的滚动条宽度。

也可以这样理解,scrollWidth和scrollHeight即可视区域宽高度+被隐藏区域宽高度。

六、scrollTop和scrollLeft

 scrollLeft:对象的最左边到对象在当前窗口显示的范围内的左边的距离,即在出现了横向滚动条的情况下,滚动条拉动的距离。

scrollTop对象的最顶部到对象在当前窗口显示的范围内的顶边的距离,即在出现了纵向滚动条的情况下,滚动条拉动的距离。

下面的图有些复杂,但可以稍微看看。

最近开了个公众号用于推送前端学习总结,有更多有趣有用的文章在这里推送,请多多关注 。

公众号:菜鸟札记

<think>好的,用户想了解前端DOM中与视图高度和顶部距离相关的属性,特别是scrollTop和offsetTop,还有其他相关属性。我需要先回忆这些属性的定义和用法,然后整理成一个清晰的中文解释。 首先,scrollTop和offsetTop确实容易混淆。scrollTop是元素内容垂直滚动的像素数,而offsetTop是元素相对于offsetParent的顶部距离。需要明确两者的区别,比如scrollTop可读写,offsetTop只读。 接下来,其他相关属性包括scrollHeight、clientHeight、offsetHeight、scrollLeft、clientTop、getBoundingClientRect等。每个属性的含义和典型应用场景都要分别说明,避免遗漏。 用户可能需要这些信息来处理滚动事件、动态布局或元素定位。因此,实际应用场景的例子会帮助他们理解,比如检测滚动到底部、计算元素位置等。需要注意不同属性的兼容性和注意事项,比如clientTop可能受边框影响。 结构上,先分点介绍每个属性,再给出应用示例和注意事项。确保用中文解释,避免专业术语过于晦涩。同时,检查LaTeX格式是否符合要求,但问题中没有数学公式,可能不需要使用。不过要确认是否有行内代码,需要用反引号标注。 最后,总结一下这些属性之间的关系和区别,帮助用户形成整体理解。可能需要提醒一些常见的坑,比如offsetParent的不同情况,或者scrollTop在文档元素和普通元素上的差异。</think>前端DOM中与视图高度和顶部距离相关的属性详解: 一、核心属性解析 1. scrollTop - 作用对象:Element 或 document.documentElement - 含义:获取/设置元素内容垂直滚动距离 - 特性: - 可读写属性 - 当元素未滚动时值为0 - 最大值为`scrollHeight - clientHeight` - 示例: ```js // 获取当前滚动位置 const currentScroll = document.documentElement.scrollTop; // 设置滚动到指定位置 element.scrollTop = 500; ``` 2. offsetTop - 作用对象:Element - 含义:返回元素相对于其offsetParent的顶部距离 - 特性: - 只读属性 - 计算包含元素边框(border) - offsetParent是最近的定位父元素 - 示例: ```js // 获取元素相对于定位父元素的顶部距离 const topPosition = element.offsetTop; ``` 二、相关高度属性 3. scrollHeight - 含义:元素内容的总高度(包含滚动隐藏部分) - 典型应用: ```js // 判断是否滚动到底部 if (element.scrollTop + element.clientHeight >= element.scrollHeight) { // 加载更多内容 } ``` 4. clientHeight - 含义:元素可视区域高度(包含padding但不含border/scrollbar) - 计算公式: clientHeight = CSS height + padding - horizontal scrollbar高度 5. offsetHeight - 含义:元素的布局高度(包含padding + border + scrollbar) - 与clientHeight对比: offsetHeight = clientHeight + 边框 + 滚动条 三、水平方向对应属性 6. scrollLeft - 功能:类似scrollTop,控制水平滚动位置 7. clientWidth / offsetWidth - 水平方向对应clientHeight/offsetHeight 四、特殊属性 8. clientTop - 含义:元素顶部边框的宽度(通常等于border-top-width) - 注意:当文字方向RTL时可能包含滚动条宽度 五、关键方法 9. getBoundingClientRect() - 返回:包含元素位置信息的对象 - 重要属性: - top:元素顶部到视口顶部的距离 - bottom:元素底部到视口顶部的距离 - height:元素高度(同offsetHeight) 六、实际应用场景 1. 滚动监听 ```js window.addEventListener('scroll', () => { const scrollPosition = window.pageYOffset || document.documentElement.scrollTop; }); ``` 2. 元素位置计算 ```js function getElementPosition(el) { const rect = el.getBoundingClientRect(); return { top: rect.top + window.pageYOffset, left: rect.left + window.pageXOffset }; } ``` 3. 滚动控制 ```js // 平滑滚动到指定元素 function scrollToElement(element) { const elementTop = element.offsetTop; window.scrollTo({ top: elementTop, behavior: 'smooth' }); } ``` 注意事项: 1. document.documentElement和document.body在不同浏览器中的表现可能不同 2. 获取窗口滚动位置应使用: ```js const scrollTop = window.pageYOffset || document.documentElement.scrollTop; ``` 3. 元素定位时需考虑offsetParent链 4. CSS transform会影响getBoundingClientRect()的计算结果 这些属性之间的关系可以理解为: - scrollTop 反映内容滚动量 - offsetTop 反映元素在布局中的固定位置 - client* 系列关注可视区域 - offset* 系列关注布局尺寸 - scroll* 系列关注内容整体尺寸 掌握这些属性的区别与联系,能够帮助开发者高效实现滚动监听、动态布局、元素定位等常见需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值