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;
}
目录
引子
最近在尝试一个东西的时候,再次碰到需要获取元素的位置,这次还是自己来整理一下。
基本属性信息
clientHeight/clientWidth
innerHeight/innerWidth、outerHeight/outerWidth
offset 相关属性
offset 一类的属性有:
offsetTop
、offsetLeft
、offsetWidth
、offsetHeight
。offsetTop
、offsetLeft
相对于元素的 offsetParent 内边距边界的偏移像素值,offsetParent
是包含该元素最近的定位元素或者 table、td、th、body 元素。offsetWidth
/offsetHeight
包含元素的边框(border)、内边距(padding)、滚动条、以及 CSS 设置的宽度(width)/高度(height)的值。offsetParent
;对于行内元素来说,以上属性描述相对于第一个边界框。scroll 相关属性
scroll 一类属性有:
scrollLeft
、scrollTop
注意:以下所说的位置,都是指元素左上角相对于另一个元素左上角的坐标。
元素相对于父元素位置
父元素的情况可分为:直接父元素、间接父元素。
下面将问题具体化,主要使用了 offset 相关属性。复杂的布局情况可以依此类推。
对最终位置结果可能会产生影响的因素有:
box-sizing
属性position
属性border
属性padding
属性直接父元素
这是测试页面,移动端访问如下:
间接父元素
这是测试页面,移动端访问如下:
元素是否在滚动可视区
由于不同的布局和 CSS 属性,计算方式可能会有差别,这是一个简单的示例,移动端访问如下:
示例主要判断逻辑
参考资料
:wastebasket:
回眸一喵 ![77-poster][url-local-poster]