两种用原生js如何获取文档中任意一个元素与文档顶部的距离

一.用原生js如何获取文档中任意一个元素与文档顶部的距离

//方式一
const offset=ele =>{
	let result={
		left:0,top:0
	}
	const getOffset=(node,init)=>{
		//如何不是一个元素节点
		if(node.nodeType!=1){
			return
		}
		//获取定位类型
		let position=window.getComputedStyle(node)['position']
		//如果定位类型等于static
		if(typeof(init)==="undefined"&&position==="static"){
			//递归父节点
			getOffset(node.parentNode)
			return
		}
		//累计计算该元素到父元素之间的距离
		result.top=node.offsetTop+result.top-node.scrollTop
		result.left=node.offsetLeft+result.left-node.scrollLeft
		if(position==='fixed'){
			return
		}
		getOffset(node.parentNode)
		if(window.getComputedStyle(ele)['display']==='none'){
			return result
		}
		console.info('111111',result)
	}
	getOffset(ele,true)
	console.info(result)
	return result
}
//方式2
const offset1=ele=>{
	let result={
		left:0,top:0
	}
	if(!ele.getClientRects().length){
		return result
	}
	if(window.getComputedStyle(ele)["display"]==='none'){
		return result
	}
	result=ele.getBoundingClientRect()
	var docElement=ele.ownerDocument?.documentElement
	console.info("top",result.top+window.pageYOffset-docElement.clientTop,'left',result.left+window.pageXOffset-docElement.clientLeft)
	return{
		top:result.top+window.pageYOffset-docElement.clientTop,
		left:result.left+window.pageXOffset-docElement.clientLeft
	}
}

二.html调用

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="./distance.js"></script>
	</head>
	<style>
		#box1{
			background-color: aqua;
			width:500px;
			height:1200px;
			position:relative;
			left:10px;
			top:10px;
		}
		#box2{
			background-color: pink;
			width:400px;
			position:absolute;
			top:50px;
			left:50px;
			height:50px;
		}
	</style>
	<body>
		<div id="box1">
			<div id="box2"></div>
		</div>
		<script>
			window.addEventListener("load",function(){
				 let element=document.getElementById('box2')
				 console.info(element)
				 offset1(element)
				 // offset(element)
			})
		</script>
	</body>
</html>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值