元素具有以下几何属性:
offsetParent
— 是最接近的 CSS 定位的祖先,或者是td
,th
,table
,body
。offsetLeft/offsetTop
— 是相对于offsetParent
的左上角边缘的坐标。offsetWidth/offsetHeight
— 元素的“外部” width/height,边框(border)尺寸计算在内。clientLeft/clientTop
— 从元素左上角外角到左上角内角的距离。对于从左到右显示内容的操作系统来说,它们始终是左侧/顶部 border 的宽度。而对于从右到左显示内容的操作系统来说,垂直滚动条在左边,所以clientLeft
也包括滚动条的宽度。clientWidth/clientHeight
— 内容的 width/height,包括 padding,但不包括滚动条(scrollbar)。scrollWidth/scrollHeight
— 内容的 width/height,就像clientWidth/clientHeight
一样,但还包括元素的滚动出的不可见的部分。scrollLeft/scrollTop
— 从元素的左上角开始,滚动出元素的上半部分的 width/height。
除了 scrollLeft/scrollTop
外,所有属性都是只读的。如果我们修改 scrollLeft/scrollTop
,浏览器会滚动对应的元素。
滚动
- 读取当前的滚动:
window.pageYOffset/pageXOffset
。 - 更改当前的滚动:
window.scrollTo(pageX,pageY)
— 绝对坐标,window.scrollBy(x,y)
— 相对当前位置进行滚动,elem.scrollIntoView(top)
— 滚动以使elem
可见(elem
与窗口的顶部/底部对齐)。
获取坐标
页面上的任何点都有坐标:
- 相对于窗口的坐标 —
elem.getBoundingClientRect()
。 - 相对于文档的坐标 —
elem.getBoundingClientRect()
加上当前页面滚动。
在事件中获取坐标
elem.onclick = (event) => {
let coords = event.target.getBoundingClinentRect()
console.log(coords)
}