XXHolic / segment

some notes
MIT License
28 stars 4 forks source link

获取页面元素位置 #88

Open XXHolic opened 4 years ago

XXHolic commented 4 years ago

目录

引子

最近在尝试一个东西的时候,再次碰到需要获取元素的位置,这次还是自己来整理一下。

基本属性信息

clientHeight/clientWidth

var cHeight = element.clientHeight;
var cWidth = element.clientWidth;

77-client

innerHeight/innerWidth、outerHeight/outerWidth

var iHeight = window.innerHeight;
var iWidth = window.innerWidth;
var oHeight = window.outerHeight;
var oWidth = window.outerWidth;

77-inner-outer

offset 相关属性

offset 一类的属性有:offsetTopoffsetLeftoffsetWidthoffsetHeight

var oLeft = element.offsetLeft;
var oTop = element.offsetTop;
var oWidth = element.offsetWidth;
var oHeight = element.offsetHeight;

77-offset

scroll 相关属性

scroll 一类属性有:scrollLeftscrollTop

var sLeft = element.scrollLeft;
var sTop = element.scrollTop;

element.scrollTop = intValue
element.scrollLeft = intValue

注意:以下所说的位置,都是指元素左上角相对于另一个元素左上角的坐标。

Back to top :arrow_up:

元素相对于父元素位置

父元素的情况可分为:直接父元素、间接父元素。

下面将问题具体化,主要使用了 offset 相关属性。复杂的布局情况可以依此类推。

对最终位置结果可能会产生影响的因素有:

直接父元素

这是测试页面,移动端访问如下:

77-parent

间接父元素

这是测试页面,移动端访问如下:

77-higher-parent

元素是否在滚动可视区

由于不同的布局和 CSS 属性,计算方式可能会有差别,这是一个简单的示例,移动端访问如下:

77-into-view

示例主要判断逻辑

function checkIntoView() {
  var scrollEle = document.querySelector('.list');
  var scrollEleHeight = scrollEle.offsetHeight;
  var itemHeight = -document.querySelector('.item').offsetHeight;
  var intoViewEle = [];
  var scrollTopDis = scrollEle.scrollTop;
  document.querySelectorAll('.item').forEach(function(ele,index) {
    var top = ele.offsetTop;
    var gap = top - scrollTopDis;
    if (gap>itemHeight && gap <=scrollEleHeight) {
      if (intoViewEle.indexOf(index)<0) {
        var indexNum = index + 1;
        intoViewEle.push('元素 '+indexNum)
      }
    }
  })
  var showMsg = intoViewEle.join(',');
  document.querySelector('#result').innerHTML = '部分或全部已在滚动可视区的元素有:<br />'+showMsg;
}
Back to top :arrow_up:

参考资料

:wastebasket: 回眸一喵 ![77-poster][url-local-poster]