原生JS获取元素在文档中的位置
原生JS获取元素在文档中的位置原生JS提供了很多关于元素信息的属性具体就不总结了元素在页面上的位置有绝对位置和相对位置绝对位置网页元素的绝对位置,指该元素的左上角相对于整张网页左上角的坐标。这个绝对位置要通过计算才能得到。首先,每个元素都有offsetTop和offsetLeft属性,表示该元素的左上角与父容器(offsetParent对象)左上角的距离。
原生JS获取元素在文档中的位置
原生JS提供了很多关于元素信息的属性
具体就不总结了
元素在页面上的位置有绝对位置和相对位置
绝对位置
网页元素的绝对位置,指该元素的左上角相对于整张网页左上角的坐标。这个绝对位置要通过计算才能得到。
首先,每个元素都有offsetTop和offsetLeft属性,表示该元素的左上角与父容器(offsetParent对象)左上角的距离。所以,只需要将这两个值进行累加,就可以得到该元素的绝对坐标。
但这里要注意一个问题:要考虑offsetParent的border的宽度。
有上面图可以知道我们需要不断的累加offsetLeft,而且要考虑border存在的情况。另外要注意offsetParent并不一定是父元素,offsetParent指的是有定位属性的的父元素
// 获取元素在页面上的绝对位置
function getElementPageLeft(element){
var actualLeft=element.offsetLeft;
var parent=element.offsetParent;
while(parent!=null){
actualLeft+=parent.offsetLeft+parent.clientLeft;
parent=parent.offsetParent;
}
return actualLeft;
}
function getElementPageTop(element){
var actualTop=element.offsetTop;
var parent=element.offsetParent;
while(parent!=null){
actualTop+=parent.offsetTop+parent.clientTop;
parent=parent.offsetParent;
}
return actualTop;
}
相对位置
网页元素的相对位置,指该元素左上角相对于浏览器窗口左上角的坐标。
有了绝对位置以后,获得相对位置就很容易了,只要将绝对坐标减去页面的滚动条滚动的距离就可以了。
//获取元素在页面上的相对于窗口的位置
function getElementViewLeft(element){
var actualLeft = getElementPageLeft(element);
//获取页面滚动距离
var scrollLeft=document.body.scrollLeft||document.documentElement.scrollLeft
return actualLeft-scrollLeft;
function getElementViewTop(element){
var actualTop = getElementPageTop(element);
var scrollTop=document.body.scrollTop||document.documentElement.scrollTop
return actualTop-scrollTop;
}
获取元素的相对位置,JS还提供了一种更简单的方法:Element.getBoundingClientRect()
Element.getBoundingClientRect()返回一个对象,对象包含了元素距离窗口的位置属性:left、right、top、bottom
注意:要考虑浏览器是否支持此方法!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
*{
padding: 0;
margin: 0;
}
#box1{
position: relative;
width: 500px;
height: 500px;
background-color: skyblue;
margin: 100px;
border: 10px solid #000;
}
#box2{
width: 100px;
height: 100px;
background-color: slateblue;
margin-left: 50px;
}
</style>
</head>
<body>
<div id="box1">
<div id="box2"></div>
</div>
<script>
function getElementPageLeft(element){
var actualLeft=element.offsetLeft;
var parent=element.offsetParent; //是有定位属性的父元素,如果box没有positon属性,则offsetParent为body,但是也要考虑body的boder
while(parent!=null){
actualLeft+=parent.offsetLeft+parent.clientLeft;
parent=parent.offsetParent;
}
return actualLeft;
}
const box2 = document.getElementById('box2')
console.log(getElementPageLeft(box2))
console.log(box2.getBoundingClientRect().left)
</script>
</body>
</html>
参考链接:阮一峰的博客
更多推荐
所有评论(0)