面试之《IntersectionObserver的使用》

IntersectionObserver 是一个 Web API,用于异步观察目标元素与其祖先元素或顶级文档视口(viewport)交叉状态的变化。这在很多场景下非常有用,比如懒加载图片、实现无限滚动加载更多内容等。下面详细介绍它的使用方法。

基本原理

IntersectionObserver 允许你注册一个回调函数,当目标元素进入或离开指定的根元素(通常是视口)的可见区域时,这个回调函数就会被调用。

构造函数

IntersectionObserver 的构造函数接受两个参数:

const observer = new IntersectionObserver(callback, options);
  • callback:当目标元素的可见性发生变化时执行的回调函数。该回调函数接收两个参数:
    • entries:一个包含所有被观察元素的 IntersectionObserverEntry 对象的数组,每个对象描述了一个被观察元素的交叉状态变化。
    • observer:当前的 IntersectionObserver 实例。
  • options:一个可选的配置对象,包含以下属性:
    • root:指定根元素,即用于检查目标元素可见性的元素。默认为浏览器视口,如果指定了该属性,则必须是目标元素的祖先元素。
    • rootMargin:根元素的外边距,用于扩展或缩小根元素的边界框。可以使用类似于 CSS margin 属性的值,例如 '10px 20px 30px 40px'
    • threshold:一个单值或数组,表示目标元素与根元素交叉区域占目标元素总面积的比例。可以是一个介于 0 和 1 之间的数字,或者是一个包含多个这样数字的数组。例如,0 表示目标元素的任何部分进入根元素的可见区域时触发回调,1 表示目标元素完全进入根元素的可见区域时触发回调。

使用步骤

1. HTML 结构

首先,创建一个简单的 HTML 结构,包含一些需要观察的元素。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>IntersectionObserver Example</title><style>.box {width: 200px;height: 200px;background-color: lightblue;margin: 20px;}</style>
</head><body><div class="box"></div><div class="box"></div><div class="box"></div><div class="box"></div><div class="box"></div><script src="script.js"></script>
</body></html>
2. JavaScript 代码

script.js 文件中,使用 IntersectionObserver 来观察这些元素。

// 获取所有需要观察的元素
const boxes = document.querySelectorAll('.box');// 定义回调函数
const callback = (entries, observer) => {entries.forEach(entry => {if (entry.isIntersecting) {// 当元素进入视口时,添加一个类名来改变样式entry.target.classList.add('active');// 停止观察该元素observer.unobserve(entry.target);}});
};// 创建 IntersectionObserver 实例
const observer = new IntersectionObserver(callback, {root: null, // 使用浏览器视口作为根元素rootMargin: '0px', // 根元素的外边距threshold: 0.5 // 当目标元素的 50% 进入视口时触发回调
});// 开始观察每个元素
boxes.forEach(box => {observer.observe(box);
});

示例解释

  • 首先,使用 document.querySelectorAll 方法获取所有需要观察的 .box 元素。
  • 然后,定义了一个回调函数 callback,当目标元素的可见性发生变化时会执行该函数。在回调函数中,遍历 entries 数组,检查每个元素是否进入视口(entry.isIntersecting),如果进入视口,则添加一个类名 active 来改变元素的样式,并使用 observer.unobserve 方法停止观察该元素。
  • 接着,创建了一个 IntersectionObserver 实例,指定了回调函数和配置选项。
  • 最后,使用 observer.observe 方法开始观察每个元素。

其他用途

  • 懒加载图片:可以在图片进入视口时再加载图片,提高页面性能。
<img class="lazy" data-src="image.jpg" alt="Lazy loaded image">
const lazyImages = document.querySelectorAll('.lazy');
const lazyCallback = (entries, observer) => {entries.forEach(entry => {if (entry.isIntersecting) {const img = entry.target;img.src = img.dataset.src;img.classList.remove('lazy');observer.unobserve(img);}});
};
const lazyObserver = new IntersectionObserver(lazyCallback);
lazyImages.forEach(img => {lazyObserver.observe(img);
});
  • 无限滚动加载更多内容:当页面滚动到底部时,加载更多的内容。
const loadMoreCallback = (entries, observer) => {const entry = entries[0];if (entry.isIntersecting) {// 加载更多内容的逻辑console.log('Load more content');}
};
const loadMoreObserver = new IntersectionObserver(loadMoreCallback);
const loadMoreElement = document.querySelector('.load-more');
loadMoreObserver.observe(loadMoreElement);

通过使用 IntersectionObserver,可以更高效地处理元素的可见性变化,提高页面的性能和用户体验。

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

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

相关文章

日常debug——苍穹外卖套餐修改时不回显数据

发现问题 今天在改套餐相关接口时&#xff0c;出现了一些问题。根据之前写的菜品和口味两个表的增删改查操作的时候&#xff0c;修改菜品数据时&#xff0c;前端页面会向后端发送请求&#xff0c;将菜品信息回显&#xff0c;口味数据也会出现。但是在写套餐相关的接口时&#…

微信小程序引入vant-weapp组件教程

本章教程,介绍如何在微信小程序中引入vant-weapp。 vant-weapp文档:https://vant-ui.github.io/vant-weapp/#/button 一、新建一个小程序 二、npm初始化 npm init三、安装 Vant Weapp‘ npm i @vant/weapp -

定时器Tim输出比较(output compare)

输出比较OC(Output Compare) 输出比较可以通过比较CNT与CCR寄存器值的关系&#xff0c;来对输出电平进行置1、置0或翻转的操作&#xff0c;用于输出一定频率和占空比的PWM波形 每个高级定时器和通用定时器都拥有4个输出比较通道&#xff0c;高级定时器的前3个通道额外拥有死区生…

计算机网络-应用层

客户/服务器方式&#xff08;C/S方式&#xff09; 对等方式(P2P) 域名系统DNS 作用 DNS含有域名和IP地址对应数据库&#xff0c;查询后将域名对应的IP地址发送给主机。 域名系统结构 域名服务器类型 域名解析方式 动态主机配置协议DHCP 作用&#xff1a;为局域网中的个主机…

代码优化——基于element-plus封装组件:表单封装

前言 今天实现一个基于element-plus表单组件的二次封装&#xff0c;什么是二次封装&#xff1f;查看以下表单&#xff0c;传统表单组件是不是用<el-form>嵌套几个<el-form-item>即可实现&#xff0c;那么一个表单可不可以实现&#xff0c;传入一个对象给封装组件&a…

docker私有仓库配置

基于 harbor 构建docker私有仓库 1、机器准备 os&#xff1a;openEuler 、rockylinux mem&#xff1a;4G disk&#xff1a;100G 2、关闭防火墙、禁用SELinux 3、安装docker和docker-compose yum install docker-ce -y配置加速 vim /etc/docker/d…

SpringBoot集成MQ,四种交换机的实例

​RabbitMQ交换机&#xff08;Exchange&#xff09;的核心作用 在RabbitMQ中&#xff0c;​交换机 是消息路由的核心组件&#xff0c;负责接收生产者发送的消息&#xff0c;并根据规则&#xff08;如路由键、头信息等&#xff09;将消息分发到对应的队列中。 不同交换机类型决…

Docker 配置镜像源

》》Daemon {"registry-mirrors": ["https://docker.1ms.run","https://docker.xuanyuan.me"] }》》》然后在重新 docker systemctl restart docker

llamafactory 微调教程

文章目录 llamlafactory微调deepseekr1-0.5b1.1 说明1.2 搭建环境创建GPU实例连接实例部署llama_factory创建隧道&#xff0c;配置端口转发访问llama_factory 1.3 微调大模型从huggingface上下载基座模型查看模型是否下载成功准备数据集微调评估微调效果导出合并后的模型 释放实…

[项目]基于FreeRTOS的STM32四轴飞行器: 七.遥控器按键

基于FreeRTOS的STM32四轴飞行器: 七.遥控器 一.遥控器按键摇杆功能说明二.摇杆和按键的配置三.按键扫描 一.遥控器按键摇杆功能说明 两个手柄四个ADC。 左侧手柄&#xff1a; 前后推为飞控油门&#xff0c;左右推为控制飞机偏航角。 右侧手柄&#xff1a; 控制飞机飞行方向&a…

2025-03-08 学习记录--C/C++-PTA 习题10-1 判断满足条件的三位数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 裁判测试程序样例&#xff1a; #include <stdio.h> #include <math.h>int search( int n );int…

光谱相机检测肉类新鲜度的原理

光谱相机通过分析肉类样本在特定波长范围内的光谱反射特性&#xff0c;结合化学与生物指标的变化规律&#xff0c;实现对其新鲜度的无损检测。其核心原理可概括为以下方面&#xff1a; 一、光谱特征与物质成分的关联性 ‌物质特异性吸收/反射‌ 不同化学成分&#xff08;如水分…

【一起学Rust | Tauri2.0框架】基于 Rust 与 Tauri 2.0 框架实现软件开机自启

文章目录 前言 一、准备工作1.1 环境搭建1.2 创建 Tauri 项目1.3 添加依赖 二、实现开机自启的基本原理2.1 开机自启的基本概念2.2 Tauri 应用的生命周期 三、Windows 平台实现3.1 Windows 注册表机制3.2 实现步骤3.3 注意事项 四、Linux 平台实现4.1 Linux systemd 服务4.2 实…

Windows10下docker desktop命令行操作指南(大部分也适用于Linux)

Windows系统最大的特点就是可视化操作&#xff0c;点点鼠标就能操作软件。但是在特殊的情况下&#xff0c;比如docker desktop图标点了之后没反应&#xff0c;但是看后台程序&#xff0c;它又已经运行了&#xff0c;这时候就要使用命令行来操作了。 针对这次情况&#xff0c;所…

静态时序分析:无法满足的生成时钟(TIM-255警告、UITE-461或PTE-075错误)

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在阅读本文前&#xff0c;强烈建议首先阅读介绍生成时钟的文章&#xff0c;尤其是其中关于时钟极性和反相的相关内容。 静态时序分析&#xff1a;SDC约束命令cr…

计算机网络--访问一个网页的全过程

文章目录 访问一个网页的全过程应用层在浏览器输入URL网址http://www.aspxfans.com:8080/news/index.aspboardID5&ID24618&page1#r_70732423通过DNS获取IP地址生成HTTP请求报文应用层最后 传输层传输层处理应用层报文建立TCP连接传输层最后 网络层网络层对TCP报文进行处…

从零开发Chrome广告拦截插件:开发、打包到发布全攻略

从零开发Chrome广告拦截插件&#xff1a;开发、打包到发布全攻略 想打造一个属于自己的Chrome插件&#xff0c;既能拦截烦人的广告&#xff0c;又能优雅地发布到Chrome Web Store&#xff1f;别担心&#xff0c;这篇教程将带你从零开始&#xff0c;动手开发一个功能强大且美观…

AI智能眼镜主控芯片:技术演进与产业生态的深度解析

一、AI智能眼镜的技术挑战与主控芯片核心诉求 AI智能眼镜作为XR&#xff08;扩展现实&#xff09;技术的代表产品&#xff0c;其核心矛盾在于性能、功耗与体积的三角平衡。主控芯片作为设备的“大脑”&#xff0c;需在有限空间内实现复杂计算、多模态交互与全天候续航&#xf…

elasticsearch 8.17.3部署文档

elasticsearch 8.17.3部署文档 一、架构拓扑 ip主机名角色192.168.241.151slave1master192.168.241.152slave2node1192.168.241.153slave3node2 二、安装包下载——分别下载上传至所有的节点 下载地址https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-…

PySide(PyQT),QGraphicsItem的pos()和scenePos()区别

在QGraphicsItem中&#xff0c;pos()和scenePos()是两个重要的方法&#xff0c;用于描述图形项的位置&#xff0c;但它们的含义和用途有所不同。理解它们的区别对于正确操作和管理QGraphicsItem的位置至关重要。 1. pos()方法 • 定义&#xff1a;pos()返回的是QGraphicsItem在…