可视区域判断(js三种方式判断)

举报
猫先生c 发表于 2022/11/20 22:19:08 2022/11/20
【摘要】 - scrollTop:滚动条滚动的距离 - offsetTop:元素到offsetParent顶部的距离 - offsetParent:距离元素最近的一个具有定位的祖宗元素(relative,absolute,fixed),若祖宗都不符合条件,offsetParent为body - innerHeight表示窗口内容区域的高度,这是不包括边框、菜单栏的

offsetTop,scrollTop,viewPortHeight

  • scrollTop:滚动条滚动的距离
  • offsetTop:元素到offsetParent顶部的距离
  • offsetParent:距离元素最近的一个具有定位的祖宗元素(relative,absolute,fixed),若祖宗都不符合条件,offsetParent为body
  • innerHeight表示窗口内容区域的高度,这是不包括边框、菜单栏的

公式:el.offsetTop - document.documentElement.scrollTop <= viewPortHeight

<div class="content">
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
      ....
</div>
const el = document.getElementId('el')
window.addEventListener('scroll', e => {
  isInViewPortOfOne(el)
})

function isInViewPortOfOne(el) {
	console.log(el.offsetParent,'offsetParent')//body
	// viewPortHeight 兼容所有浏览器写法
    const viewPortHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight
	const offsetTop = el.offsetTop
	const scrollTop = document.documentElement.scrollTop
	const top = offsetTop - scrollTop
	// 这里+100是为了提前加载+ 100
	return top <= viewPortHeight +100
 }

getBoundingClientRect

获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置,到浏览器可视范围的距离(不包含文档卷起的部分)

<div id="box"></div>
var object=document.getElementById('box');  
rectObject = object.getBoundingClientRect();
  • rectObject.top:元素上边到视窗上边的距离;
  • rectObject.right:元素右边到视窗左边的距离;
  • rectObject.bottom:元素下边到视窗上边的距离;
  • rectObject.left:元素左边到视窗左边的距离;
  • rectObject.width:是元素自身的宽
  • rectObject.height是元素自身的高
function isInViewPortOfTwo(el) {
	const viewPortHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight
	const top = el.getBoundingClientRect() && el.getBoundingClientRect().top
	console.log('top', top)
	return top <= viewPortHeight + 100
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。