获取元素离页面视口位置的区别

我们知道,获取元素在页面视口中的位置,一共有两种方法,

一种为利用相对偏移的方法

function getOffsetPosition(ele) {
  var left = 0;
  var top =0;
  while(ele) {
      left += ele.offsetLeft;
      top += ele.offsetTop;
      ele = ele.offsetParent;
  }
  return {left, top}
}

一种为利用getBoundingClientRect

var rect = ele.getBoundingClientRect()
// rect --> {left, top, right, bottom}

上面这两种方式有和区别呢?

  1. 利用offset方法获取的值是静态的,即一旦这个元素存在dom中,它这个值就直接固定下来了了,它的top border外边框到值为 html元素的内边框border top, 它的left为border外边框left 到 html元素的的内边框 border left (即可用理解成相对于页面文档的位置)
  1. 利用getBoundingClientRect获取的值是动态的,它会实时的获取当前元素相于对应窗口视口的位置

举例说明吧

可以直接滚动分析数据

<!DOCTYPE html>
<html>
  <head>
    <style type="text/css">
    html {
      margin-top: 50px;
    }
    body {
      margin-top: 20px;
      height: 1000px;
      background: yellow;
    }

    #container {
      width: 100px;
      height: 100px;
      overflow: scroll;
      overflow-x: hidden;
      background: green;
    }

    #scroll {
      background: red;
      height: 300px;
      width: 20px;
    }
    </style>
  </head>
<body>
  <div id="container">
    <div id="scroll">
    </div>
  </div>

<script type="text/javascript">

var c = document.getElementById("container");
var s = document.getElementById("scroll");

// 通过内滚动分析
c.onscroll = function() {
  console.log(s.offsetTop);
  console.log(s.getBoundingClientRect().top);
  
}

// 通过body滚动分析
document.body.onscroll = function() {
  console.log('offsetTop', s.offsetTop);
  console.log('boundingClientRect', s.getBoundingClientRect().top);
}

</script>

</body>
</html>

应用

如何判断一个元素是否可见呢?
简单判断一个元素是否在视口呢
方法1 现在 出现在视口中:

var viewportHeight = Math.max(document.documentElement.clientHeight, document.body.clientHeight);
var {top, bottom} = targetEle.getBoundingClientRect();
if (bottom > 0 && top < viewportHeight) {
  // 现在出现在视口中
}

方法2 曾经 出现在视口中;

var viewportHeight = Math.max(document.documentElement.clientHeight, document.body.clientHeight);
var scrollTop = document.body.scrollTop;
var top = getOffsetPosition(targetEle).top;
// 视口最低线在 元素 top 之下, 说明已经出现过视口中了
if ((viewportHeight + scrollTop - top) > 0) {
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,826评论 1 92
  • web下的高度、位置 屏幕、浏览器、页面的高度宽度 NARUTOne 相信各位web开发狮们,在项目中为了搭建漂亮...
    迷缘火叶阅读 3,735评论 0 1
  • 制作网页的过程中,你有时候需要知道某个元素在网页上的确切位置。 下面的教程总结了Javascript在网页定位方面...
    麦田里的野望阅读 1,689评论 0 1
  • 关于递归的思考 之前有接触过递归,看到别人写的递归函数的代码,好生羡慕,怎么就能写这么好呢?我怎么就想不到这样写呢...
    pylego阅读 694评论 0 0
  • 有梦想的人是幸福的人!孩子们的梦想都五花八门:当老师、宇航员、园丁、甚至是捡破烂的、黑社会老大、其实我小时候有一段...
    珊珊_812c阅读 391评论 1 2