JavaScript获取元素偏移量offset的原理与实现

作者:微光时间:2026-10-22 05:35:09浏览:545

本文详解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的简单方法分享完毕,希望能对读者有所帮助,也欢迎大家继续支持本站。

作者最新文章