js 监听元素是否出现在可视区域--IntersectionObserver

观察者模式监听判断dom元素是否在可视区域内
本项目是使用vue3的写法。

1.IntersectionObserver

IntersectionObserver可以用来自动监听元素是否进入了设备的可视区域之内,而不需要频繁的计算来做这个判断。由于可见(visible)的本质是,目标元素与视口产生一个交叉区,所以这个 API 叫做"交叉观察器"

const observer = new IntersectionObserver(callback, option);

IntersectionObserver 是浏览器原生提供的构造函数,接受两个参数:

  • callback:可见性发现变化时的回调函数
  • option:配置对象(可选)。

构造函数的返回值是一个观察器实例。实例一共有4个方法:

  • observe:开始监听特定元素
  • unobserve:停止监听特定元素
  • disconnect:关闭监听工作
  • takeRecords:返回所有观察目标的对象数组

1.1 observe 方法

该方法需要接收一个target参数,值是Element类型,用来指定被监听的目标元素

// 获取元素
const target = document.getElementById("dom");// 开始观察
io.observe(target);

1.2 unobserve 方法

该方法需要接收一个target参数,值是Element类型,用来指定停止监听的目标元素

// 获取元素
const target = document.getElementById("dom");// 停止观察
io.unobserve(target);

1.3 disconnect 方法

该方法不需要接收参数,用来关闭观察器

// 关闭观察器
io.disconnect();
// 页面加载时监听元素
onMounted(() => {var demo3 = document.querySelector('document.querySelector(dom))  //  获取元素var observer = new IntersectionObserver((mutaions)=>{  // 创建IntersectionObserver对象console.log(mutaions[0].isIntersecting)})observer.observe(demo3)       // 需要监听的元素 
}       

1.4 takeRecords 方法

该方法不需要接收参数,返回所有被观察的对象,返回值是一个数组

// 获取被观察元素
const observerList = io.takeRecords();

1.5 callback 参数

目标元素的可见性变化时,就会调用观察器的回调函数callback。

callback一般会触发两次。一次是目标元素刚刚进入视口,另一次是完全离开视口。

const io = new IntersectionObserver((changes, observer) => {console.log(changes);console.log(observer);
});

1.6 options

  • threshold: 决定了什么时候触发回调函数。它是一个数组,每个成员都是一个门槛值,默认为[0],即交叉比例(intersectionRatio)达到0时触发回调函数。用户可以自定义这个数组。比如,[0, 0.25, 0.5, 0.75, 1]就表示当目标元素 0%、25%、50%、75%、100% 可见时,会触发回调函数。
  • root: 用于观察的根元素,默认是浏览器的视口,也可以指定具体元素,指定元素的时候用于观察的元素必须是指定元素的子元素
  • rootMargin: 用来扩大或者缩小视窗的的大小,使用css的定义方法,10px 10px 30px 20px表示top、right、bottom 和 left的值

2. IntersectionObserverEntry 对象

changes数组中的每一项都是一个IntersectionObserverEntry 对象

  • boundingClientRect:目标元素的矩形区域的信息
  • intersectionRatio:目标元素的可见比例,即intersectionRect占
    boundingClientRect的比例,完全可见时为1,完全不可见时小于等于0
  • intersectionRect:目标元素与视口(或根元素)的交叉区域的信息
  • isIntersecting: 布尔值,目标元素与交集观察者的根节点是否相交(常用)
  • isVisible: 布尔值,目标元素是否可见(该属性还在试验阶段,不建议在生产环境中使用)
  • rootBounds:根元素的矩形区域的信息,getBoundingClientRect()方法的返回值,如果没有根元素(即直接相对于视口滚动),则返回null
  • target:被观察的目标元素,是一个 DOM 节点对象(常用)
  • time:可见性发生变化的时间,是一个高精度时间戳,单位为毫秒

3. 是否在可视区域

onMounted(() => {var observer = new IntersectionObserver((entries) => {console.log(111111, entries[0].isIntersecting);dataMap.showMyBox = !entries[0].isIntersecting; //返回true代表在页面可视区域,false代表不在页面可视区域。});observer.observe(document.querySelector(dom));
}
// 页面卸载时可解绑
onBeforeUnmount(() => {if (observer) {observer.unobserve(document.querySelector(dom)); //解绑元素observer.disconnect(); //停止监听}
});

4. 图片懒加载

使用 IntersectionObserver 非常容易实现图片懒加载,首先需要观察懒加载元素,然后等元素进入可视区域后设置图片 src;同时,还可以结合 IntersectionObserver.rootMargin 实现提前加载图片,一般可以设置为 1~2 倍浏览器窗口的视口高度,优化用户体验

/*** @method lazyLoad* @param {NodeList} $imgList      图片元素集合* @param {number}   preloadHeight 预加载高度*/
export function lazyLoad($imgList, preloadHeight = 1000) {const observer = new IntersectionObserver((entries) => {entries.forEach((entry) => {if (entry.isIntersecting) { // 目标元素出现在 root 可视区,返回 trueconst $target = entry.targetconst src = $target.getAttribute('lazyload')if (src) {$target.setAttribute('src', src) // 真正加载图片}observer.unobserve($target) // 解除观察}})}, {rootMargin: `0px 0px ${preloadHeight}px 0px`,})Array.prototype.forEach.call($imgList, ($item) => {if ($item.getAttribute('src')) return // 过滤已经加载过的图片observer.observe($item) // 开始观察})
}

使用方法:

// 图片元素设置 lazyload 属性
<img lazyload="图片链接" alt="图片说明">// 观察图片元素
lazyLoad(document.querySelectorAll("[lazyload]"))

5. 元素吸顶、吸底

如果页面结构比较简单可以直接使用 css 粘性布局。
IntersectionObserver 实现元素固定思路也很简单,首先需要给固定元素包一层父元素,父元素指定高度占位,防止固定元素吸附时页面抖动,然后观察父元素的可视状态变化,当父元素即将离开可视区域时改变固定元素的样式。

/*** @method fixBanner* @param {HTMLElement} $observeEle 观察元素* @param {HTMLElement} $fixEle     固定定位元素*/
export function fixBanner($observeEle, $fixEle) {const $ele = $fixEleconst observer = new IntersectionObserver((entries) => {entries.forEach((entry) => {if (entry.isIntersecting) {$ele.style.cssText = ''} else {$ele.style.cssText = 'position: fixed; top: 0; left: 0'}})}, {threshold: 1, // threshold 设置为 1 表示目标元素完全可见时触发回调函数})observer.observe($observeEle) // 开始观察
}

6. 加载更多

IntersectionObserver 实现加载更多需要在列表后面增加一个尾部元素(比如加载更多动画),当尾部元素进入可视区域就加载更多数据,注意尾部元素一定要一直处于所有列表元素的后面。

提前加载高度不能随意设置,如果设置太大会导致尾部元素一直处于可视状态。

function loadMore() {const observer = new IntersectionObserver((entries) => {const loadingEntry = entries[0]if (loadingEntry.isIntersecting) {// 请求数据并插入列表}},{rootMargin: '0px 0px 600px 0px', // 提前加载高度},)observer.observe(document.querySelector('.mod_loading')) // 观察尾部元素
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/697577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

融中穿刺路径角度评估的C++技术实现

消融模型的三维渲染 我们以肝部为例&#xff0c;通常肝部在做消融手术规划时有几个步骤。 一三维重建&#xff1a; 对器官进行图像分割&#xff1b; 对肿瘤的原发区域GTV进行勾画。 二穿刺路径的规划&#xff1a; 路径规划当中有几个约束&#xff1a;穿刺深度、危及器官的…

OpenAI推出首个AI视频模型Sora:重塑视频创作与体验

链接&#xff1a;华为OD机考原题附代码 Sora - 探索AI视频模型的无限可能 随着人工智能技术的飞速发展&#xff0c;AI视频模型已成为科技领域的新热点。而在这个浪潮中&#xff0c;OpenAI推出的首个AI视频模型Sora&#xff0c;以其卓越的性能和前瞻性的技术&#xff0c;引领着…

SpringBoot快速整合Thymeleaf实现文件上传案例

SpringBoot快速整合Thymeleaf实现文件上传案例 文章目录 SpringBoot快速整合Thymeleaf实现文件上传案例1. 创建工程2. pom.xml文件2. application.yml 配置3. 前端fileupload.html4. 后端Controller 本案例环境: SpringBoot: 2.3.0.RELEASEJDK: 1.8前端模板&#xff1a; thymel…

【PHP进阶】Redis批处理缓存

大家好&#xff0c;我是程序员若风&#xff0c;又到了技术分享时刻。 概要 在某些场景下&#xff0c;我们需要频繁的使用到缓存&#xff0c;比如需要获取多个key值&#xff0c;如果采用单个拿缓存的办法&#xff0c;会造成网络IO极大的浪费&#xff0c;所以我们需要用户Redis…

Leetcode3036. 匹配模式数组的子数组数目 II

Every day a Leetcode 题目来源&#xff1a;3036. 匹配模式数组的子数组数目 II 解法1&#xff1a;KMP 设数组 nums 的长度为 m&#xff0c;数组 pattern 的长度为 n。 遍历数组 nums 的每个长度是 n1 的子数组并计算子数组的模式&#xff0c;然后与数组 pattern 比较&…

JavaScript 设计模式之观察者模式

观察者模式 观察者模式又被称为发布-订阅模式&#xff0c;使用一个对象来收集订阅者&#xff0c;在发布时遍历所有订阅者&#xff0c;然后将信息传递给订阅者&#xff0c;可以这样来实现一个简单的模式 const Observable (function () {let __messages {}return {register:…

win系统下安装mysql5.7并配置环境变量、设置root用户和服务启动的详细操作教程

本篇文章主要讲解&#xff1a;win系统下安装mysql5.7并配置环境变量、设置root用户和服务启动的详细操作教程 日期&#xff1a;2024年2月22日 作者&#xff1a;任聪聪 一、mysql5.7版本的下载 官方下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 步骤…

服务器生信环境配置脚本

服务器生信环境配置脚本的重要性在于它为生物信息学的数据分析提供了一个统一和标准化的计算环境。通过自动化的配置脚本&#xff0c;可以快速地在服务器上部署和设置生物信息学的软件和依赖库&#xff0c;确保分析的可重复性和准确性。这样&#xff0c;生物信息学家和研究人员…

【鸿蒙 HarmonyOS 4.0】状态管理

一、介绍 资料来自官网&#xff1a;文档中心 在声明式UI编程框架中&#xff0c;UI是程序状态的运行结果&#xff0c;用户构建了一个UI模型&#xff0c;其中应用的运行时的状态是参数。当参数改变时&#xff0c;UI作为返回结果&#xff0c;也将进行对应的改变。这些运行时的状…

Stable Diffusion 模型的概念、类型、下载、安装、使用

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 我们在《Stable Diffusion WebUI 界面介绍》 时&#xff0c;第一个就讲到了 Stable Diffusion 模型&#xff0c;那么这个模型是什么&#xff1f;该从哪儿下载&…

多输入分类|GWO-CNN-LSTM|灰狼算法优化的卷积-长短期神经网络分类预测(Matlab)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 灰狼优化算法&#xff1a; 卷积神经网络-长短期记忆网络&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容…

【EI会议征稿通知】第五届人工智能与机电自动化国际学术会议(AIEA 2024)

第五届人工智能与机电自动化国际学术会议&#xff08;AIEA 2024&#xff09; 2024 5th International Conference on Artificial Intelligence and Electromechanical Automation 优秀评选已启动&#xff0c;设置优秀论文、优秀报告及优秀海报多个奖项&#xff0c;丰厚奖金等…

【Java程序设计】【C00280】基于Springboot的校友社交系统(有论文)

基于Springboot的校友社交系统&#xff08;有论文&#xff09; 项目简介项目简介项目获取开发环境项目技术运行截图 项目简介 项目简介 这是一个基于Springboot的校友社交系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;在系统首页…

数据结构与算法——排序算法

目录 文章目录 前言 一.排序的基本概念 1.什么是就地排序 2.什么是内部排序和外部排序 3.什么是稳定排序 4.判定一个排序算法的是稳定的 二.插入排序算法 1.直接插入排序 1.1基本思想 1.2复杂度 1.3稳定性 1.4代码演示 2.折半插入排序 2.1基本思想 2.2性能 3.…

vue实现递归组件

父组件&#xff1a; <Tree :data"data"></Tree> import Tree from "/components/Tree.vue"; const data reactive([{name: "1",checked: true,children: [{name: "1-1",checked: false,},],},&#xff09; 子组件&#…

若依logback日志配置采坑

问题描述 若依使用的appender过滤器是level&#xff0c;如下述代码&#xff0c;这种过滤器只能导出级别为INFO的日志&#xff0c;warn和error都导出不出来。查询不是很方便。 <!-- 系统日志输出 --><appender name"file_info" class"ch.qos.logback.…

JAVA IDEA 项目打包为 jar 包详解

前言 如下简单 maven 项目&#xff0c;现在 maven 项目比较流行&#xff0c;你还没用过就OUT了。需要打包jar 先设置&#xff1a;点击 File > Project Structure > Artifacts > 点击加号 > 选择JAR > 选择From modules with dependencies 一、将所有依赖和模…

VirtualBox+Vagrant快速搭建Centos7

目录 安装VirtualBox&#xff1a; 安装Vagrant&#xff1a; 创建Vagrant项目目录&#xff1a; 初始化Vagrant配置文件&#xff1a; 本地Vagrantfile中的镜像名称&#xff1a; 启动虚拟机&#xff1a; SSH登录虚拟机&#xff1a; 备注&#xff1a;安装镜像的另一种方式是…

springmvc+ssm+springboot房屋中介服务平台的设计与实现 i174z

本论文拟采用计算机技术设计并开发的房屋中介服务平台&#xff0c;主要是为用户提供服务。使得用户可以在系统上查看房屋出租、房屋出售、房屋求购、房屋求租&#xff0c;管理员对信息进行统一管理&#xff0c;与此同时可以筛选出符合的信息&#xff0c;给笔者提供更符合实际的…

Autodesk CAD如何建立图层方框?

在AutoCAD中&#xff0c;要建立图层方框&#xff08;Layer Box&#xff09;可以通过以下步骤实现&#xff1a; 打开图层管理器&#xff1a; 在 AutoCAD 中&#xff0c;您可以通过输入“LA”命令或在菜单栏中选择“格式” > “图层管理器”来打开图层管理器对话框。 创建新图…