JavaScript获取元素偏移量offset的原理与实现
本文详解JavaScript中获取元素偏移量的核心概念,区分parentNode与offsetParent,解析offsetTop/offsetLeft在IE8与非IE8浏览器中的差异,并提供一个兼容主流浏览器的自定义offset方法实现代码,帮助开发者准确计算元素相对于body的绝对位置。
前言与基础概念
前言:以往多是阅读他人的技术文章以汲取知识,如今尝试将学习过程记录下来,供各位参考交流,欢迎评论与推荐,共同提升。看到已有几位朋友关注,感到十分开心,后续将继续分享更多技术内容。
null与undefined均表示无值,但含义不同:null表示属性存在但值为空,而undefined表示该属性本身不存在。
//例如
document.parentNode//浏览器天生自带的一个属性:父亲节点的属性 null (因为一个页面中的document已经是最顶级元素了,它没有父亲)
document.parentnode//undefined (因为没有parentnode这个属性)
parentNode与offsetParent的区别
1、parentNode:父节点,指HTML结构层级关系中的直接上一级元素。
var outer = document.getElementById('outer');
var inner = document.getElementById('inner');
var center = document.getElementById('center');
center.parentNode //inner
2、offsetParent:父级参照物,指在当前平面布局中,作为内部元素定位基准的最外层元素,它与HTML文档层级结构无必然联系。
通常情况下,页面中所有元素的父级参照物默认为body元素。
document.body.offsetParent 的结果为 null。
若要改变元素的父级参照物,需通过CSS的position属性进行设置,absolute、relative或fixed均可生效。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
margin:0;
padding:0;
}
#outer{
width:180px;
height:180px;
margin:50px auto;
border:10px solid #000;
background:orange;
padding:50px;
}
#inner{
width:80px;
height:80px;
padding:50px;
border:10px solid #000;
background:green;
}
#center{
width:50px;
height:50px;
border:10px solid #000;
background:red;
}
</style>
</head>
<body>
<div id="outer">
<div id="inner">
<div id="center"></div>
</div>
</div>
<script>
var outer = document.getElementById('outer');
var inner = document.getElementById('inner');
var center = document.getElementById('center');
outer.style.position = "relative";//这样inner和center的参照物都是outer
center.offsetParent//outer
inner.offsetParent//outer
outer.offsetParent//body
outer.style.position = "relative";//
inner.style.position = "relative";
center.offsetParent//inner
inner.offsetParent//outer
outer.offsetParent//body
</script>
</body>
</html>
offsetTop/offsetLeft原理与IE8差异
3、offsetTop/offsetLeft:表示当前元素外边框距离其父级参照物内边框的偏移距离。
具体布局关系如下图所示:

自定义offset方法实现
下文提供一个offset方法的实现,其功能等同于jQuery中的offset方法,用于获取页面中任意元素距离body的偏移量(包含左偏移和上偏移),无论该元素的父级参照物是谁。返回结果为一个对象,包含left(距离BODY的左偏移)和top(距离BODY的上偏移)。
在标准的IE8浏览器中,使用offsetLeft或offsetTop时,父级参照物的边框宽度已被自动计入,因此无需额外手动添加边框值。
具体实现代码如下:
function offset(curEle){
var totalLeft = null,totalTop = null,par = curEle.offsetParent;
//首先加自己本身的左偏移和上偏移
totalLeft+=curEle.offsetLeft;
totalTop+=curEle.offsetTop
//只要没有找到body,我们就把父级参照物的边框和偏移也进行累加
while(par){
if(navigator.userAgent.indexOf("MSIE 8.0")===-1){
//累加父级参照物的边框
totalLeft+=par.clientLeft;
totalTop+=par.clientTop
}
//累加父级参照物本身的偏移
totalLeft+=par.offsetLeft;
totalTop+=par.offsetTop
par = par.offsetParent;
}
return{
left:totalLeft,
top:totalTop
}
}
console.log(offset(center).left)
以上关于js获取元素偏移量offset的简单方法分享完毕,希望能对读者有所帮助,也欢迎大家继续支持本站。
JavaScript零基础入门:从环境搭建到运行第一段代码
2026-11-05 15:29:58
HTML链接中javascript:void(0)的作用及现代替代方案
2026-11-05 10:07:47
在线调试 JS 时怎么引入 jQuery 或 Vue 等第三方库
2026-11-05 08:53:56
原生JavaScript实现简易颜色选择器原理与代码
2026-11-03 23:22:19
JS原生表单序列化:FormData与URLSearchParams用法详解
2026-11-03 23:13:21
