js 各种位置获取全解(包括元素属性、鼠标位置、滚动位置)

1,906 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

本文用于记录js在使用中,会用得到的关于dom位置、宽高、鼠标位置的等方法与属性,便于学习与日常使用。

元素位置属性

属性解释
offsetWidth、offsetHeight可视宽高,内容区+padding+border+滚动轴宽度,平时一般没有滚动轴,所以基本都是内容区+padding+border
offsetLeft、offsetTop左边与上边与设置了定位的父级的距离
clientWidth、clientHeight内容区+padding,不包括border
clientLeft、clientTopclient内容区域边到offset可视区域边的距离,因为两个差别就是border,可以简单理解为左、上边框border宽度
scrollTop、scrollLeft水平垂直方向滚动距离
scrollWidth、scrollHeight滚动的内容宽度与高度

获取元素四周与浏览器屏幕视窗位置方法

要想获得与屏幕的关系,一般是在有滚动的情况下可以用于计算,用到的是元素的getBoundingClientRect方法。

该方法返回的对象上存在如下属性:

属性解释
top元素最上面,距离屏幕顶部距离
bottom元素最下面,距离屏幕顶部距离
left元素最左边,距离屏幕左部距离
right元素最右边,距离屏幕左部距离
x元素左上角的距离屏幕左部距离,一般与left一致
y元素左上角的距离屏幕顶部距离,一般与top一致
width、height可视宽高,一般与元素位置属性offsetWidth、offsetHeight一致

浏览器屏幕可视宽高

document.documentElement就可以看作html标签元素也就是主根元素。

document.body就是body标签元素也就是文档元素。

属性解释
document.documentElement.clientWidth、document.documentElement.clientHeight屏幕可视宽高,不包括滚动轴
window.innerWidth, window.innerHeight屏幕可视宽高,注意,这会包括浏览器横向与纵向的滚动轴,只有不存在滚动轴或滚动轴无宽度才能达到获取可是宽高的目的

鼠标位置

属性解释
e.x、e.y鼠标距离可视屏幕区域左侧与上方的距离
document.getElementById('box').onmousemove = (e) => {
    console.log(e.x,e.y)
}

鼠标在某元素上的位置

获取计算解释
e.x - box.getBoundingClientRect().x鼠标距离元素左侧距离,也就是在元素上的x值。
e.x - box.getBoundingClientRect().left同上
e.y - box.getBoundingClientRect().y鼠标距离元素上侧距离,也就是在元素上的y值。
e.x - box.getBoundingClientRect().top同上
const box = document.getElementById('box')
box.onmousemove = (e) => {
    console.log(
        e.x - box.getBoundingClientRect().x,
        e.y - box.getBoundingClientRect().y
    )
}

滚动位置

如果不是自己设定的div滚动窗口,就用浏览器的滚动窗口,有很多种监听事件。

window.onscroll、document.onscroll、document.body.onscroll、document.documentElement.onscroll这些都是一个效果,但是兼容性不一。

最好统一就使用window.onscroll,它的兼容性最好,基本支持所有浏览器。

如果是自己设定的div滚动框也可以,同样没有兼容问题。

浏览器滚动轴横纵向已滚动距离(受滚动影响被隐藏的宽高)兼容性
window.scrollX、window.scrollY兼容较好推荐
window.pageXOffset、window.pageYOffset兼容较好推荐
document.documentElement.scrollTop、document.documentElement.scrollLeft兼容较差不推荐
document.body.scrollTop、document.body.scrollLeft兼容较差不推荐
自定义div滚动横纵向已滚动距离(受滚动影响被隐藏的宽高)兼容性
document.getElementById('box').scrollLeft、document.getElementById('box').scrollTop无兼容问题

尾言

如果觉得文章对你有帮助的话,欢迎点赞收藏哦,有什么错误或者意见建议也可以留言,感谢~