详解 Intersection Observer API ( 交叉观察器 )

news2024/11/17 10:59:25

文章目录

      • 一、介绍
      • 二、兼容性
      • 三、内置方法/属性
      • 四、使用
      • 五、相关链接

一、介绍

Intersection Observer API 提供了一种方法可以监听目标元素是否展示到视口(viewport,常见的需求场景:

  • 图片懒加载
  • 滚动动画

上述的需求,以往一般监听 scroll 事件,利用 getBoundingClientRect()方法获取目标元素的位置信息。由于监听 scroll 事件,不断地触发回流,对性能有一定的影响,不过可以通过函数节流解决,但是 getBoundingClientRect() 方法对性能造成的影响无法有效优化的。

!!!所以,浏览器为了解决上述难题,推出了IntersectionObserver API ,由于方法是异步的,不影响主线程的执行效率。

二、兼容性

兼容市面的主流浏览器,总体来说乐观,不过为了代码的严谨,简单判断下:

if (window?.IntersectionObserver) {
	let io = new IntersectionObserver(callback, options)
	io.observe(targetElement)
}

在这里插入图片描述

三、内置方法/属性

let io = new IntersectionObserver(entries => {
	// IntersectionObserverEntry 作为一个参数返回
	console.log(entries)
}, { root: null, rootMargin: '0px 0px', threshold: [0.5, 1] })

// 开始监听
io.observe(targetElement)
// 停止监听
io.unobserve(targetElement)
// 结束监听器
io.disconnect()

以上我们可以看到,IntersectionObserver 接收一个回调函数,和一个对象options作为参数。

IntersectionObserverEntry 实例作为entries参数被传递到回调函数,提供此时元素的相关信息。


查看 entries 具有哪些属性:

在这里插入图片描述

属性作用
boundingClientRect目标元素的矩形区域的信息
intersectionRatio目标元素的可见比例,即 intersectionRectboundingClientRect 的比例,完全可见时为1,完全不可见时小于等于0
intersectionRect目标元素与视口(或根元素)的交叉区域的信息
isIntersecting目标目标元素是否已转换为相交状态(true)或已转换为不相交状态(false
rootBounds根元素的矩形区域的信息,getBoundingClientRect()方法的返回值,如果没有根元素(即直接相对于视口滚动),则返回null
target被观察的目标元素,是一个 DOM 节点对象
time可见性发生变化的时间,是一个高精度时间戳,单位为毫秒

API 提供的方法/属性:

方法 / 属性作用
root 根元素,默认视口(viewport)
rootMargin相对根元素的偏移量,默认值为"0px 0px"
threshold触发回调函数的门阀值,升序排列,默认0,可选:[0, 0.25, 0.5, 0.75, 1]
observe(targetElement)开始监听,必传 targetElement,可同时观察多个节点
unobserve(targetElement)停止监听,必传 targetElement
takeRecords()为所有监听目标返回一个IntersectionObserverEntry对象数组并且停止监听这些目标
disconnect()停止监听器工作

四、使用

我们这里写一个滚动更新元素内容/样式功能:
在这里插入图片描述

HTML:

<div class="container">
  <div class="item" data-id="1">元素1:不可见</div>
  <div class="item" data-id="2">元素2:不可见</div>
  <div class="item" data-id="3">元素3:不可见</div>
  <div class="item" data-id="4">元素4:不可见</div>
  <div class="item" data-id="5">元素5:不可见</div>
</div>

JS: 当目标元素完全暴露/非完全暴露时,修改文字/背景颜色

<script>
  if (window?.IntersectionObserver) {
    let items = [...document.getElementsByClassName('item')] // 解析为真数组,也可用 Array.prototype.slice.call()

    let io = new IntersectionObserver(entries => {
      entries.forEach(item => {
        // intersectionRatio === 1说明该元素完全暴露出来
        if (item.intersectionRatio === 1) {
          item.target.style.backgroundColor = 'deeppink'
          item.target.innerHTML = `元素${item.target.getAttribute('data-id')}:完全可见`
        } else {
          item.target.style.backgroundColor = 'deepskyblue'
          item.target.innerHTML = `元素${item.target.getAttribute('data-id')}:不可见`
        }
      })
    }, {
      root: null,
      rootMargin: '0px 0px',
      threshold: 1 // 阀值设为1,当只有比例达到1时才触发回调函数
    })

    items.forEach(item => io.observe(item))
  }
</script>

五、相关链接

  • Intersection Observer API

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

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

相关文章

基于PHP+MySQL医院门诊缴费系统的设计与实现

本医院门诊缴费系统可以说是一个综合性的医院门诊缴费系统,这它包含了挂号管理,医生信息管理,药品信息管理,患者信息管理,住院信息挂了,收费信息管理等多种功能,因而具有一定的实用性。本站是一个B/S模式系统,开发采用了目前流行的PHP技术。系统界面友好,操作简单,比较实用。 本…

浅谈小程序开源业务架构建设之路

一、业务介绍 1.1 小程序开源整体介绍 百度从做智能小程序的第一天开始就打造真正开源开放的生态&#xff0c;我们的愿景是&#xff1a;定义移动时代最佳体验&#xff0c;建设智能小程序行业标准&#xff0c;打破孤岛&#xff0c;共建开源、开放、繁荣的小程序行业生态。百度…

element-ui实现一个动态布局的对话框

前言&#xff1a;在工作中有各种各样的对话框&#xff0c;最多就是填写信息这些的&#xff0c;一般这样的内容都是el-input输入框&#xff0c;el-select选择框等等之内的&#xff0c;这时我们就可以封装成一个组件&#xff0c;想要什么内容就传一个json配置&#xff0c;像其他组…

适合Python初学者阅读的Github开源代码

程序员宝藏库&#xff1a;https://gitee.com/sharetech_lee/CS-Books-Store 你想要的&#xff0c;这里都有&#xff01; Python作为一门热门的编程语言&#xff0c;在Github上想要找Python项目可以说是「多如牛毛」。 无论是Star数量还是项目数量&#xff0c;都稳居前3名。 项…

5分钟搭建一个粗粒度「视频去重」系统

Jupyter Notebook 教程: How to Build a Video Deduplication System 「视频去重」可以在海量的视频数据中实现侵权片段或者删除掉重复冗余的内容 。随着抖音、快手、Bilibili 等视频平台的兴起和火爆&#xff0c;类似视频这样的非结构化数据在数量上有了极大的增长。 视频平台…

【数据可视化】第四章—— 基于pandas的数据可视化(pandas基本操作)

图形绘制的代码&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1pgS60sry6XDILIhth8bAvA?pwdabcd 提取码&#xff1a;abcd 文章目录1. Pandas库的数据运算1.1 方法形式的运算1.2 比较运算法则1.3 排序2. 基本统计分析函数2.1 基本统计分析函数2.2 累计统计分析函数2.3 …

[附源码]计算机毕业设计JAVA学生量化考核管理系统

[附源码]计算机毕业设计JAVA学生量化考核管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

基于PHP+MySQL高校毕业设计管理系统的设计与实现

直以来我国领导人提倡以人为本的治国方案,而大学是未来人才的培养基地,如何能够更好的对高校毕业设计信息进行管理,是很多高校一直在研究的一个问题,只有更加科学的对高校毕业设计信息进行管理,才能够更加积极的培养国家的栋梁之才。 管理员部分功能 1&#xff1a;教师新管理…

第二十二章《记事本》第1节:记事本项目简介

记事本软件能够打开、编辑、保存各种类型的文本文档,也能在文本文档中查找特定的关键字,此外在还能设定文本文档的字体、字号以及风格等。 22.1.1记事本功能简介 记事本软件的运行结果如图22-1所示。 图22-1记事本软件界面 从图21-1可以看到:记事本程序运行开始后,在没有…

OpenFeign动态代理、源码分析

1、OpenFeign概述 OpenFeign 组件的前身是 Netflix Feign 项目&#xff0c;由 Netflix 公司开发。后来 Feign 项目被贡献给了开源组织&#xff0c;随后Feign退出历史舞台。 OpenFeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解&#xff0c;如RequestMapping等等。O…

基于springboot的家装平台设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

牛客练习赛106 三子棋

牛客练习赛106 三子棋 2022.12.02 题目描述 给定一个 333 \times 333 的棋盘&#xff0c;共有 3393 \times 3 9339 个格子&#xff0c;初始时每个格子均没有放置棋子。 A 和 B 轮流行动&#xff0c;每次行动的人&#xff0c;必须在当前棋盘上选择一个没有放置棋子的格子…

基于PHP+MySQL学生成绩管理系统的设计与实现

基于PHP的学生成绩管理系统主要高校内部提供服务,系统分为管理员,教师用户和学生用户三部分。 在基于PHP的学生成绩管理系统中分为管理员用户,教师用户和学生用户三部分,其中管理员用户主要是用来管理教师信息,学生信息,课程信息,专业信息和班级信息等内容,教师用户主要是用来管…

业务流程管理的未来趋势:个性化定制

自进入互联网时代以来、甚至更早&#xff0c;无论是从物质还是精神层面&#xff0c;“个性化”已经成为大众所普遍追求的东西。个性化定制允许买家按照自身偏好对产品进行二次改造&#xff0c;例如许多汽车品牌&#xff0c;就可以根据车主的想法来实现定制。 其实&#xff0c;…

Spring Boot 集成 EasyExcel 3.x 优雅实现Excel导入导出

Spring Boot 集成 EasyExcel 3.x 本章节将介绍 Spring Boot 集成 EasyExcel&#xff08;优雅实现Excel导入导出&#xff09;。 &#x1f916; Spring Boot 2.x 实践案例&#xff08;代码仓库&#xff09; 介绍 EasyExcel 是一个基于 Java 的、快速、简洁、解决大文件内存溢出的…

CSS盒子模型(上)

&#x1f353;个人主页&#xff1a;bit.. &#x1f352;系列专栏&#xff1a;Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 HTML和CSS3 目录 1.盒子模型 1.2盒子模型&#xff08;Box Model&#xff09;组成 1.3边框&#xff08;border&#xff09; 1.4 表格的…

这才是Git的正确学习方式

程序员宝藏库&#xff1a;https://gitee.com/sharetech_lee/CS-Books-Store 你想要的&#xff0c;这里都有&#xff01; 我认为学习一门知识最怕的就是一知半解、草草了事&#xff0c;对于Git这种工具类更是如此。 有很多同学工作后&#xff0c;日常用到git clone、git add、g…

ubuntu18.04下cmake的安装

一.使用安装命令 sudo apt install cmake这种方式安装最为简单&#xff0c;但是&#xff0c;这种方式安装的不是最新版本的Cmake。 我此次安装cmake是因为要编译fastdds&#xff0c;其实之前系统中有cmake&#xff0c;但是在编译fastdds的过程中依然提示我&#xff1a; CMake…

第二证券|千亿巨头飙涨,消费板块掀起涨停潮!

消费板块复苏可期。 外围股市团体大反弹&#xff0c;隔夜纳斯达克指数大涨超4&#xff05;&#xff0c;标普500指数涨超3&#xff05;&#xff0c;道琼斯指数涨逾2%。跟着近两个月来的持续反弹&#xff0c;道琼斯指数自阶段底已反弹超20%&#xff0c;进入技术性牛市。早盘A股同…

留言墙项目【Vue3 + nodejs + express + mysql】——上

创建项目 如何使用 mddir 命令生成目录结构树 规范文件目录 ## 默认目录 |-- undefined|-- .gitignore|-- babel.config.js|-- jsconfig.json|-- package.json|-- README.md|-- vue.config.js|-- yarn.lock|-- 开发文档.md|-- public| |-- favicon.ico| |-- index.html|-…