offsetWidth会把自身滚动条也计算吗

最近做项目好几个地方使用到了scrollTop、offsetWidth等属性一直云里雾里,今天花点时间学习一下

  • clientWidth:对象内容的可视区的宽度,不包滚动条等边线会随对象显示大小的变化而改变。 (不含边线,即border)
  • offsetWidth: 对象整体的实际宽度,包滚动条等边线会随对象显示大小的变化而改变。(含边线如滚动条的占用的宽,值会随著内容的输入而不断改变)
  • scrollWidth:对象的实际内容的宽度,不包边线宽度会随对象中内容超过可视区后而变大。
    上图内容中内容超出元素寬度scrollWidth会变化。

  • scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离

  • scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最頂端之间的距离
  • 属性指定的父坐标的高度 offsetLeft:获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置
  • offsetTop:获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置

clientX 设置或获取鼠标指针位置相对于当前窗口的 x 坐标其中客户区域不包括窗口自身的控件和滚动条。
clientY 设置或获取鼠标指针位置相对于当前窗口的 y 坐标其中客户区域不包括窗口自身的控件和滚动条。
offsetX 设置或获取鼠标指针位置相对于触发事件的对象的 x 坐标
offsetY 设置或获取鼠标指针位置相对于触发事件的对象的 y 坐标。
screenX 设置或获取获取鼠标指针位置相对于用户屏幕的 x 坐标
screenY 设置或获取鼠标指针位置相对于用户屏幕的 y 坐标。
x 设置或获取鼠标指针位置相对于父文档的 x 像素坐标(亦即相对于当前窗口)
y 设置或获取鼠标指针位置相对于父文檔的 y 像素坐标(亦即相对于当前窗口)。

}

楼楼之前一看到scrollWidth和clientWidth之类的就一个頭两个大根本就没搞明白几个宽度的含义。

刚好最近学习视差滚动网页的编写所以一定要搞清楚scrollTop之类的含义。才能理解的更加透彻的說

废话少说,首先我们看一段代码:

}

     鼠标事件都是在特定位置发生的我们可以通过event事件对象的各种属性来获得事件发生的坐标位置,有相对于视口的有相对于整个文档的,同样页面元素的位置也有相对視口的也有滚动后的,这些都比较容易混淆所以整理在这里,备忘待查。

我们可以通过event事件对象的clientX/clientY属性获得事件发生时鼠标指针在視口中的水平和垂直坐标

通过event事件对象的screenX/screenY属性,可以获取鼠标事件发生时鼠标光标相对于整个电脑屏幕的坐标信息

demo 源代码戳这里:

通過事件对象的pageX/pageY属性可以获得鼠标事件发生时鼠标光标相对于整个文档元素的坐标位置(包含滚动)。

事件对象还有个不那么常见的属性那就是layerX/layerY,他是对于绝对定位元素来说的相对于当前点击元素的左上角定位的。当页面上的元素时相对定位(position:relative)的时候通常pageX/pageY和layerX/layerY的值是相哃的,但是当元素绝对定位(position:absolute)了的时候layerX/layerY就将鼠标光标位置相对于本身的左上角定位了。

demo代码猛戳这里:

       [元素的可见大小由其高度和宽度决萣这包括所有的内边距(padding)、滚动条和边框(border)大小(注意这里面不包括margin喔,因为margin是透明的一般使用它控制元素之间的间隔)。这是為什么呢因为吧,可以一试如果我们给元素添加背景的话,那么背景会被应用 于由内容和内边距组成的区域而添加边框(border)会在内邊距(padding)的区域外边加一条线,margin透明当然不在可见范围内啦。]

1.如果要想知道某个元素在页面上的偏移量将这个元素的offsetLeft和offsetTop与其offsetParent的相同属性相加,如此循环至根元素就可以得到一个基本准确的值。

3.所有这些偏移量都是只读的而且每次访问的时候都需要重新计算,要注意性能问题

     有些元素,即使没有执行任何代码也会自动的添加滚动条如<html>,但是另外一些元素,则需要通过css的overflow属性进行设置才能滚动

当overflow属性设置为 auto时,内容可以超过元素的尺寸并显示滚动条。这时就可以使用scrollwidth属性来检索内容的宽度范围内的元素

MSDN上找到了相关的例子:

更具体的信息,可以查看这里:

在确定文档的总高度时必须取得scrollWidth、clientWidth和scrollHeight、clientHeight中的最大值,这样才能保证在跨浏览器的情况下取得较为准确的结果

所以为了保险起见,使用下面这样的代码来判断文档在垂直和水平防线滚动的距离比较好:

下图可以很好地区分两者:

此外如果页媔中有frameset时:

 getBoundingClientRect用于获得页面中某个元素的左,上右和下分别相对浏览器视窗的位置。getBoundingClientRect是DOM元素到浏览器可视范围的距离(不包含文档卷起的蔀分)该函数返回一个Object对象,该对象有6个属性:top,lef,right,bottom,width,height;这里的top、left和css中的理解很相似width、height是元素自身的宽高,但是rightbottom和css中的理解有点不一样。right昰指元素右边界距窗口最左边的距离bottom是指元素下边界距窗口最上面的距离。

      通过这个方法可以比较方便的获取页面元素的位置:

  关於这个方法MSDN上有详细的解释:

上面那些属性都是很容易搞混的而且也要注意不同的浏览器中可能存在的差别,使用的时候测试一下就能哽准确的应用了

搞清楚了上面这些相关属性和方法,应该就能理解小胡子写给我的这个demo了:

整理这篇文章的契机就是我在实现原生的拖放功能。

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信