【js】计算child node 到 parent node的距离并且滚动到位置

 可以直接在任何js环境运用的函数,需要两个node,一个父节点一个子节点,通过叠加计算offsetTop计算出最终要滚动的距离。

 function getTwoPositionTop(parent, child) {
      if (!child||!parent) {
        throw  new Error('empty node!')
      }
      if (!parent.contains(child)) {
        throw  new Error('is not parent node!')
      }
      if (parent.style.position !== 'relative') {
        throw  new Error('parent node position must be relative!')
      }
      let k = 0;
      let o = child;
      let s = child;
      while (true) {
        let z = o.parentElement;
        if ((z.style.position !== 'static' && z.style.position !== '')||z.style.transform) {

          k += s.offsetTop;
          s = z;
        }
        o = z;
        if (z === parent) {
          return k;
        }
      }
    }

计算child node 到 parent node的距离并且滚动到位置,一般用于滚动到指定位置,目前只支持判断relative。transform和postiron会收到影响,所以每一次遍历就是找父节点和最底下的子节点。

完整的演示代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <script>
    function getTwoPositionTop(parent, child) {
      if (!child||!parent) {
        throw  new Error('empty node!')
      }
      if (!parent.contains(child)) {
        throw  new Error('is not parent node!')
      }
      if (parent.style.position !== 'relative') {
        throw  new Error('parent node position must be relative!')
      }
      let k = 0;
      let o = child;
      let s = child;
      while (true) {
        let z = o.parentElement;
        if (z.style.position !== 'static' && z.style.position !== '') {
          k += s.offsetTop;
          s = z;
        }
        o = z;
        if (z === parent) {
          return k;
        }
      }
    }

    window.onload = () => {
      let t=getTwoPositionTop(document.getElementById('div'),document.getElementById('child'))
      document.getElementById('div').scrollTo(0,t)
    }
  </script>
</head>
<body>
<div style="height: 600px;border: 1px solid red;position: relative;overflow-y: scroll;" id="div">
  <div style="margin-top: 700px" id="child">123</div>
</div>
</body>
</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值