如何利用JS检查元素是否在视口内

摘要:
在目标元素与视口或者其他指定元素发生交集时和触发配置的回调函数。

前言

分享两个监测元素是否在视口内的方法

1. 位置计算

使用 Element.getBoundingClientRect() 方法返回元素相对于视口的位置

const isElementVisible = (el) => {
const rect = el.getBoundingClientRect();
};

获取浏览器窗口的宽高

const isElementVisible = (el) => {
const rect = el.getBoundingClientRect();
const vWidth = window.innerWidth || document.documentElement.clientWidth;
const vHeight = window.innerHeight || document.documentElement.clientHeight;
};

判断元素是否在视口内,如图所示

如何利用JS检查元素是否在视口内第1张

const isElementVisible = (el) => {
const rect = el.getBoundingClientRect()
const vWidth = window.innerWidth || document.documentElement.clientWidth
const vHeight = window.innerHeight || document.documentElement.clientHeight
if (
rect.right < 0 ||
rect.bottom < 0 ||
rect.left > vWidth ||
rect.top > vHeight
) {
return false
}
return true
}

getBoundingClientRect 方法会使浏览器发生回流和重绘,性能消耗稍大,但兼容性比 Intersection Observer 要好。

https://www.98891.com/article-81-1.html

2. Intersection Observer

Intersection Observer API提供了一种异步检测目标元素与祖先元素或viewport相交情况变化的方法。在目标元素与视口或者其他指定元素发生交集时和触发配置的回调函数。

// 获取要监测的元素
const boxes = document.querySelectorAll('.box')

// 创建观察者,配置回调函数
// 通过 isIntersecting 属性判断元素与视口是否相交
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach((entry) => {
console.log(
entry.target,
entry.isIntersecting ? "visible" : "invisible"
);
});
})

boxes.forEach((box) => {
observer.observe(box);
});

免责声明:文章转载自《如何利用JS检查元素是否在视口内》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇RabbitMQ集群、镜像部署配置IE “浏览器模式”和“文档模式”的区别下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DevExpress源码编译总结

独家提供完整可编译sln文件,本篇文章内容包括基础知识(GAC、程序集强签名、友元程序集)、编译过程、注册GAC、添加工具箱、多语言支持、运行时和设计时调试 源码地址链接:http://pan.baidu.com/s/1miNCHug密码:rlyr关于编译源码,前前后后折腾了太久,自己折腾,到官网折腾,到DXPER折腾,今天,总算有个结局了 编译环...

js实现文字无间断左右滚动和图片左右滚动

var MyMar=setInterval(Marquee,speed); scroll_div.onmouseover=function() {clearInterval(MyMar);} scroll_div.onmouseout=function() {MyMar=setInterval(Marquee,speed);} } </script&...

用JS添加和删除class类名

下面介绍一下如何给一个节点添加和删除class名 添加:节点.classList.add("类名"); 删除:节点.classList.remove("类名"); 以tab切换为例: 在写tab切换的时候,通常我们会给选中的tab设置不同的样式,常用的方法是给被选中的tab新增一个class名,然后改这个class名的样式。 比如 起一个class名叫“a...

dva的effect那么难用,自己造一个轮子吧

背景 对于dva这个开发框架,国内从事react的前端工程师多半不会感到陌生,dva完善的开发体系和简单的api,让其被广泛运用到实际工作中。我所在的公司也是长期使用dva作为基础的开发框架,虽然好用,但是随着前端技术的飞速发展,dva似乎陷入停滞了,从npm官网上看其发版情况看,正式版本2.4.1是三年前发布的,最近一次是2.6.0-beta.22版本,...

百度地图-js-图标标注不显示---已解决

一个小图,一个大图,走的逻辑都一样 小图不显示图标,大图可以显示 找到原因了,代码问题,我强行设置了旋转角度 if(points[listLast].direction!=0){$('.BMap_Marker img').rotate(points[listLast].direction);}  此处会影响,去掉了 还有var myEndIcon =...

UE4 Subsystems

  《InsideUE4》GamePlay架构(十一)Subsystems - 知乎 (zhihu.com) 引言 非常惭愧,自从我更新完GamePlay架构十篇之后,我就断更了许久。如今说再多缘由也是借口,借着假期,在家继续重操旧业,继续写写技术文章。 UE在4.22版本的时候,开始引入Subsystems,然后在4.24完善。写本篇文章的一个原因是S...