元素尺寸和滚动

426 阅读2分钟

JavaScript 中存在许多属性让我们能够读取元素的宽度、高度或其他具有几何特征的信息。
在移动或定位 JavaScript 元素时,我们经常需要它们来计算元素的坐标。

几何学

元素有宽度,高度和其他几何属性,它们的值为数字。
如下预览图,假设单位为像素(pixels)。

图中是比较复杂的情况,包含内边距(padding),边框(border),和滚动条(scrollbar)。外边距(margin)不属于元素本身,在此不作讨论。

offsetParent, offsetTop/Left

offsetParent 是最近的祖先元素,满足的条件为:

  • CSS 定位(positionrelative, absolute, fixedsticky
  • 或者为 <td>, <th>, <table>, <body>

offsetLeftoffsetTop 分别为元素左上角距离 offsetParent 的横坐标(x)和纵坐标(y)。

有以下情况 offsetParent 的值为 null

  • 元素是不展示的(displaynone 或不存在文档中)
  • 元素为 <html><body>
  • 元素的定位是 fixed

offsetWidth/Height

元素最外层的宽度或高度,包含边框。

  • offsetWidth,通过 CSS-width + paddings + borders 计算获得
  • offsetHeight,最外层高度

clientLeft/Top

元素左上角外部到内部的距离,在文档从左至右渲染的系统中,获取的是左边和顶部 边框的宽度。
在一些从右至左渲染文档的操作系统中,滚动条出现在左边,此时 clientLeft 会包含滚动条的宽度。

clientWidth/Height

获取元素边框内的宽度和高度,不包括滚动条(scrollbar)。
在没有滚动条情况下,和 css-width 是相等的。
这样可以通过 getComputedStyle(el).width - el.clientWidth 获取滚动条的宽度。

scrollWidth/Height

clientWidthclientHeight 获取的是元素可视范围内的宽度和高度。
scrollWidthscrollHeight 包含滚出的宽度和高度。

scrollTop/Left

获取元素隐藏,滚出部分的高度和宽度。
注意:大部分几何属性是只读,但这两个属性可以修改,使元素相对移动一定距离。

尽量不从样式中获取元素宽度和高度

getComputedStyle 方法可以获取元素的宽度和高度,但是它受如下因素影响:

  • 容易受 CSS 的 box-sizing 属性影响
  • 内连元素返回的值为 auto
  • Firefox 浏览器中不会减去滚动条的宽度

clientWidth 属性总是相同的,它会减去滚动条的宽度。