WebApi 交叉观察者- IntersectionObserver复盘

news/2025/10/13 23:21:39/文章来源:https://www.cnblogs.com/bingquan1/p/19139649

交叉观察者- IntersectionObserver复盘

一、 Intersection Observer是什么?

Intersection Observer API 提供了一种异步观察目标元素与祖先元素或视口交叉状态的方法。通俗地说,就是可以高效地监测一个元素是否进入或离开了另一个元素的“可视区域”

它的核心优势是异步高性能,相比传统的通过监听 scroll 事件并使用 getBoundingClientRect() 计算的方式,它对性能的影响极小。

二、 为什么需要Intersection Observer?—— 解决传统方案的痛点

在 Intersection Observer 出现之前,要实现“元素可见性”检测,我们通常这样做:

window.addEventListener('scroll', function() {const target = document.getElementById('target');const rect = target.getBoundingClientRect();// 判断元素是否在视口中if (rect.top < window.innerHeight && rect.bottom >= 0) {// 元素进入视口console.log('Element is in view!');} else {// 元素离开视口console.log('Element is out of view!');}
});

这种传统方案的缺点:

  1. 性能开销大scroll 事件触发非常频繁,每次触发都要执行 getBoundingClientRect()(会导致浏览器重排),容易造成页面卡顿。
  2. 代码繁琐:需要手动计算元素位置、视口高度等,逻辑复杂。
  3. 主线程阻塞:所有计算都在主线程完成,如果计算复杂,会直接影响用户体验。

Intersection Observer 的优势:

  1. 异步执行:回调函数在空闲时间执行,不阻塞主线程。
  2. 高效批量处理:可以同时观察多个元素,所有计算由浏览器底层高效完成。
  3. 简单易用:API 简洁,无需手动计算几何信息。

三、 核心概念与使用方法

1. 创建观察者

通过 new IntersectionObserver(callback, options) 创建一个观察者实例。

  • callback: 当被观察元素的交叉状态发生变化时执行的回调函数。它接收两个参数:
    • entries: 一个 IntersectionObserverEntry 对象的数组,每个被观察元素的状态变化都会产生一个 entry。
    • observer: 观察者实例本身。
  • options: 可选配置对象。
    • root: 用作视口的祖先元素,必须是目标元素的祖先。默认为 null,即浏览器视口。
    • rootMargin: 类似于 CSS 的 margin,用于收缩或扩大 root 的边界框。例如 ‘10px 20px 30px 40px’
    • threshold: 阈值,可以是单个数字或一个数组 [0, 0.25, 0.5, 0.75, 1]。当目标元素的可见比例达到这个阈值时,会触发回调。默认为 [0]

2. 观察目标元素

使用观察者实例的 observe(targetElement) 方法开始观察一个具体的 DOM 元素。

3. 停止观察

  • unobserve(targetElement): 停止观察特定元素。
  • disconnect(): 停止观察所有元素。

四、 关键对象详解

IntersectionObserverEntry 对象

回调函数收到的 entries 数组中的每一个对象都包含以下重要属性:

  • target: 被观察的目标元素。
  • intersectionRatio: 目标元素与根的交集比例,值在 0.01.0 之间。
  • isIntersecting: 一个布尔值,如果目标元素与根相交(即从不可见变为可见),则为 true;如果从可见变为不可见,则为 false这是最常用的属性!
  • intersectionRect: 一个描述交叉区域的对象,包含 x, y, width, height, top, bottom, left, right 等属性。
  • boundingClientRect: 目标元素的边界矩形。
  • rootBounds: 根元素的边界矩形。
  • time: 交叉状态发生变化的时间戳。

六、 最佳实践

  1. 兼容性: 现代浏览器支持良好,但对于旧浏览器(如 IE),需要 polyfill(如 intersection-observer)。
  2. isIntersecting vs intersectionRatio: 在大多数情况下,使用 isIntersecting 判断“是否可见”就足够了。intersectionRatio 更适合需要精确知道可见比例的场景。
  3. 及时清理: 对于只需要触发一次的元素(如懒加载图片),在触发后立即使用 unobserve() 取消观察,以释放资源。
  4. rootMargin 的妙用: 使用 rootMargin 可以实现“提前加载”或“延迟触发”的效果。例如,懒加载时可以设置 rootMargin: '0px 0px 200px 0px',让图片在进入视口前 200px 就开始加载。
  5. 性能并非绝对免费: 虽然 IO 性能很好,但如果同时观察数千个元素,或者回调函数中的逻辑非常复杂,依然可能对性能产生影响。

总结

Intersection Observer API 是现代 Web 开发中处理元素可见性问题的标准答案。它通过将复杂的几何计算从主线程卸载,提供了卓越的性能和开发者体验。

核心复盘要点:

  • 用途: 监听元素与指定视口的交叉状态。
  • 创建new IntersectionObserver(callback, options)
  • 关键属性isIntersecting(是否相交)、intersectionRatio(相交比例)。
  • 常用场景: 图片/内容懒加载、无限滚动、广告曝光统计、滚动动画触发、固定导航栏等。
  • 优势: 异步、高性能、易用。

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

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

相关文章

[KaibaMath]1009 关于||a|-|b||≤|a+b|的证明

[KaibaMath]1009 关于||a|-|b||≤|a+b|的证明绝对值的三角形不等式为||a|-|b||≤|ab|≤|a|+|b|. 本文给出前半段的证明,即证明||a|-|b||≤|ab|.

css: Bootstrap5 Accordions

<!doctype html> <html> <head> <meta charset="utf-8"> <title>Bootstrap5 Accordions</title><link rel="stylesheet" href="https://cdn.jsdeliv…

AMPopTip - 优雅的iOS动画提示框库

AMPopTip是一个功能丰富的iOS动画提示框库,支持多种弹出方向和箭头样式,可高度自定义颜色、边框和字体,适用于用户引导和界面提示等场景,让应用交互更加生动有趣。AMPopTip AMPopTip 是一个优雅的动画弹出提示框,…

2026年深度对比值得推荐的10个在线客服系统

1. 唯一客服—— 可独立部署的高性能客服系统源码唯一客服系统主要功能是,为网站或APP等提供在线即时聊天功能,可以方便客户与我们的客服人员进行实时沟通的。主要用户群体是中小互联网科技公司,有自己的开发产品,…

文件名中有空格比较烦人

我们已经造好了两个文件:" t.sh"和"t m p" $ " t.sh" "t m p" OK $ " t.sh t m p" # 首先找不到t.sh,其次就算找到,接收到的也是3个参数t, m, p不是一个"t…

十月总结

10.11 广二 T1:计数、容斥原理 有一个计数的做法,大致做法是在最后面的开头统计,然后要求后面不能出现,这样贡献就是唯一的,需要fail树上跑下来dfn这样 容斥原理就比较直接,加上序列中有一个开头的,减去有两个开…

20251013 之所思 - 人生如梦

20251013 之所思1. 前天老板约了一个会议,讨论log的录制,防止问题发生时无法录到现场的数据而反复要求实车同事去复现问题采集数据。当我发言时被另一个同事打断并说表达的不正确,当时很气愤,一是自己刚刚开始发言…

20232421 2024-2025-1 《网络与系统攻防技术》实验一实验报告

20232421 2024-2025-1 《网络与系统攻防技术》实验一实验报告 1.实验目标 本次实践的对象是一个名为pwn1的linux可执行文件。 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。 该程序…

20232317 2025-2026-1《网络与系统攻防技术》实验一实验报告

1.实验内容 1.1手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。 1.2利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。 1.3注入一个自己制作的shellcode并运行这段sh…

实用指南:【每日一面】React Hooks闭包陷阱

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java 面试 - krt

1、ArrayList和LinkedList的区别 2、@Autowired和@Resource的主要区别1、ArrayList和LinkedList的区别 ArrayList:底层数据结构:ArrayList基于数组实现,元素在内存中连续存储,支持随机访问(时间复杂度为o(1));…

软工大三开学总结

在本学期我的目标是主要是在完成本学期的课程目标拿到奖学金的同时跟进考研。 在考虑过很多之后我个人还是觉得考研是我的选择,因为我从心底里觉得,我好不容易 上到这儿了一说是吧,怎么能就止步于此呢,再向上走走呢…

SpringBoot-day2(基于SpringBoot实现SSMP整合) - a

SpringBoot JC-3.基于SpringBoot实现SSMP整合 ​ 重头戏来了,SpringBoot之所以好用,就是它能方便快捷的整合其他技术,这一部分咱们就来聊聊一些技术的整合方式,通过这一章的学习,大家能够感受到SpringBoot到底有多…

给一个字符串数组,输出不同的部分

豆包给出代码/// <summary> /// 字符串差异提取工具类(仅使用原字符串字符) /// </summary> public static class StringDiffExtractor {/// <summary>/// 从字符串列表中提取差异部分,差异部分仅…

Java按顺序提取Word内容(文本+数学公式) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

连接 USB 设备

转载自:https://learn.microsoft.com/zh-cn/windows/wsl/connect-usb本指南将演练使用 USB/IP 开源项目 usbipd-win 将 USB 设备连接到 WSL 2 上运行的 Linux 分发版所需的步骤。 在 Windows 计算机上配置 USB/IP 项目…

实用指南:嵌入式学习笔记3.基于寄存器方式控制GPIO

实用指南:嵌入式学习笔记3.基于寄存器方式控制GPIO2025-10-13 22:50 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; disp…

# 20232429 2025-2026-1 《网络与系统攻防技术》实验一实验报告

1.实验内容手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。 注入一个自己制作的shellcode并运行这段shellcode。 …

muduo网络库事件驱动模型的实现与架构 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

SpringBoot-day1(快速上手SpringBoot,SpringBoot简介,SpringBoot基础配置,属性配置,yaml文件) - a

SpringBoot 文档更新日志版本 更新日期 操作 描述v1.0 2021/11/14 A 基础篇前言 ​ 很荣幸有机会能以这样的形式和互联网上的各位小伙伴一起学习交流技术课程,这次给大家带来的是Spring家族中比较重要的一门技术课程…