Skip to content
html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }
    #box1 {
      width: 150px;
      height: 150px;
      background: skyblue;
      position: relative;
    }
    #box2 {
      width: 100px;
      height: 100px;
      background: #bfa;
      position: absolute;
      left: 0;
      right: 0;
      top: 0;
      bottom: 0;
      margin: auto;
    }
    #box3 {
      width: 50px;
      height: 50px;
      background: pink;
      margin: 0 auto;
      margin-top: 25px;
    }
  </style>
</head>
<body>
  <!-- 
    编写一个offset方法,获取当前元素距离body的左/上偏移,无论其父参照物是谁
      box3父参照物是box2
      box2父参照物是box1
      box1父参照物是body
      求box3相对于body偏移
      首先获取当前元素距离其父参照物的偏移,其次在这个基础上加上父参照物
        边框
        父参照物距离其父参照物的偏移
   -->

  <div id="box1">
    <div id="box2">
      <div id="box3"></div>
    </div>
  </div> 
  <script>
    function offset (ele) {
      let offsetLeft = ele.offsetLeft,
        offsetTop = ele.offsetTop,
        parent = ele.offsetParent

      while (parent && parent.tagName !== 'BODY') {
        // 在标准IE8中,获取的offsetLeft/Top包括了边框
        if (!/MSIE 8/.test(navigator.userAgent)) {
          offsetLeft += parent.clientLeft
          offsetTop += parent.clientTop
        }
        offsetLeft += parent.offsetLeft
        offsetTop += parent.offsetTop
        parent = parent.offsetParent
      }
      return {
        top: offsetTop,
        left: offsetLeft
      }
    }

    console.log(offset(box3))
  </script>
</body>
</html>