开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情
大多数 JavaScript 方法处理的是以下两种坐标系中的一个:
-
相对于窗口 —— 类似于
position:fixed,从窗口的顶部/左侧边缘计算得出。- 我们将这些坐标表示为
clientX/clientY,当我们研究事件属性时,就会明白为什么使用这种名称来表示坐标。
- 我们将这些坐标表示为
-
相对于文档 —— 与文档根(document root)中的
position:absolute类似,从文档的顶部/左侧边缘计算得出。- 我们将它们表示为
pageX/pageY。
- 我们将它们表示为
当页面滚动到最开始时,此时窗口的左上角恰好是文档的左上角,它们的坐标彼此相等。但是,在文档移动之后,元素的窗口相对坐标会发生变化,因为元素在窗口中移动,而元素在文档中的相对坐标保持不变。
当文档滚动了:
pageY—— 元素在文档中的相对坐标保持不变,从文档顶部(现在已滚动出去)开始计算。clientY—— 窗口相对坐标确实发生了变化(箭头变短了),因为同一个点越来越靠近窗口顶部。
元素坐标:getBoundingClientRect
方法 elem.getBoundingClientRect() 返回最小矩形的窗口坐标,该矩形将 elem 作为内建 DOMRect 类的对象。
主要的 DOMRect 属性:
x/y—— 矩形原点相对于窗口的 X/Y 坐标,width/height—— 矩形的 width/height(可以为负)。
此外,还有派生(derived)属性:
top/bottom—— 顶部/底部矩形边缘的 Y 坐标,left/right—— 左/右矩形边缘的 X 坐标。
例如,点击下面这个按钮以查看其窗口坐标:
如果你滚动此页面并重复点击上面那个按钮,你会发现随着窗口相对按钮位置的改变,其窗口坐标(如果你垂直滚动页面,则为 y/top/bottom)也随之改变。
正如你所看到的,x/y 和 width/height 对矩形进行了完整的描述。可以很容易地从它们计算出派生(derived)属性:
left = xtop = yright = x + widthbottom = y + height
请注意:
- 坐标可能是小数,例如
10.5。这是正常的,浏览器内部使用小数进行计算。在设置style.left/top时,我们不是必须对它们进行舍入。 - 坐标可能是负数。例如滚动页面,使
elem现在位于窗口的上方,则elem.getBoundingClientRect().top为负数。