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

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

大家好,又见面了,我是你们的朋友全栈君。

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

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

HTML:                                                              

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

CSS:

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

JS:

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

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

一、clientWidth和clientHeight

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

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

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

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

clientwidth

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

输出:

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

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

 

二、offsetWidth和offsetHeight

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

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

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

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

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

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

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

输出:

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

三、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,

看下面演示。

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

输出:

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

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

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

输出:

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

 

四、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

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

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

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

演示图如下

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

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

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

输出:

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

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;

最后输出:

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

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

 

五、scrollWidth和scrollHeight

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

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

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

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

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

输出:

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

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

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对象的最顶部到对象在当前窗口显示的范围内的顶边的距离,即在出现了纵向滚动条的情况下,滚动条拉动的距离。

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

 

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

 

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

 

最近开了个公众号用于推送前端学习总结,有兴趣的可以关注一下。

公众号:菜鸟札记

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163013.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月22日 下午5:46
下一篇 2022年7月22日 下午5:46


相关推荐

  • 【JS字符串方法】JS字符串方法

    【JS字符串方法】JS字符串方法字符串的 ES5 和 ES6 方法 ES5String fromCharCode 该方法的参数是一系列 Unicode 码点 返回对应的字符串 charAt 该方法返回指定位置的字符 参数是从 0 开始编号的位置 charCodeAt 方法返回给定位置字符的 Unicode 码点 十进制表示 相当于 String fromCharCode 的逆操作 concat 方法用于连

    2025年10月28日
    7
  • JAVA Calendar具体解释

    JAVA Calendar具体解释

    2021年12月8日
    50
  • 2021阿里笔试题

    2021阿里笔试题n个人,初始序号为a[i],当某个人的序号是某个整数的平方时,则获胜。现在发放一定数量的券,每张券可以是自己的序号加一或减一。求让一半的人获胜至少需要多少张券。//testali.cpp:定义控制台应用程序的入口点。//#include”stdafx.h”#include<math.h>#include<iostream>#include<math.h>#include<vector>#include<algori

    2022年5月23日
    45
  • 二维数组赋值 java_java二维数组的赋值方法「建议收藏」

    二维数组赋值 java_java二维数组的赋值方法「建议收藏」在java数组中,我们想要知道其长度,可以通过赋值的方法来实现。在正式开始对数组赋值前,我们要明确其中的下标问题。在准备步骤上,先找到高维的位置,再确定低纬的下标,就可以进行相关的赋值操作了。下面就具体的二维数组赋值,我们先简单分析赋值的概念,然后带来具体的赋值实例。1.赋值概念使用双下标访问二维数组中的元素:第一个下标代表:行号(高维下标)。第二个下标代表:列号(低维下标)。2.赋值实例(1)赋…

    2022年5月6日
    161
  • netty权威指南学习

    netty权威指南学习1、Bio工程结构maven工程文件结构:│nettyArticle.iml│pom.xml│├─.idea│compiler.xml│misc.xml│vcs.xml│workspace.xml│├─src│├─main││├─java│││└─com│││└─jad…

    2022年10月2日
    2
  • python升序和降序排序_sql升序和降序(orderby升序和降序排列显示)

    python升序和降序排序_sql升序和降序(orderby升序和降序排列显示)sql 升序和降序排列作者 王伟同学任编 郭芮 Pandas 是用于数据处理和数据分析的非常方便的类库 这也是每个 Pythoner 进行数据分析的必备工具 但是不可否认的是 并不是所有的程序员都会使用 Python 也不是所有的 Python 用户都会使用 Pandas 但是好消息是 有了 pandassql 您可以使用 SQL 来操纵 DataFrame 导入相关库将 numpy 作为 np 导入 pandas 作为 pdfro

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号