IntersectionObserver“替代”滚动条监听

news2024/11/28 20:37:58

概要

IntersectionObserver 接口提供了一种异步观察目标元素与其祖先元素或顶级文档视口(viewport)交叉状态的方法。其祖先元素或视口被称为根(root)。

当一个 IntersectionObserver 对象被创建时,其被配置为监听根中一段给定比例的可见区域。可以在同一个观察者对象中配置监听多个目标元素。

当然IntersectionObserver不可能完全替代监听滚动条,只是相比于监听滚动条,IntersectionObserver更加方便快捷,并且目前大多数主流浏览器已经兼容

兼容性

IntersectionObserver 目前除了 IE 和 OperaMini,已经被主流的浏览器支持。

更多详情

 const ob = new IntersectionObserver((e) => {
 	console.log(‘交叉触发回调’,e)
  }, {
  	root:null, 
  	rootMargin:'10px',
    threshold: 0
  })
  
  ob.observe(目标dom)

回调函数参数说明

每次触发回调,会获得监听到的目标信息(回调接收的参数entries)
在这里插入图片描述

属性说明
boundingClientRect返回包含目标元素的边界信息,返回结果与element.getBoundingClientRect() 相同
intersectionRatio返回目标元素出现在可视区的比例,即交叉范围
intersectionRect用来描述root和目标元素的相交区域
isIntersecting返回一个布尔值,下列两种操作均会触发callback:1. 如果目标元素出现在root可视区,返回true。2. 如果从root可视区消失,返回false
rootBounds用来描述交叉区域观察者(intersection observer)中的根.
target目标元素:与根出现相交区域改变的元素 (Element)
time返回一个记录从 IntersectionObserver 的时间原点到交叉被触发的时间的时间戳

配置项说明

  • root:观察目标与谁交叉,可为其父元素或父元素的父元素,null表示观察目标与视口交叉

  • rootMargin:观察的范围的偏移量,可以有效的缩小或扩大根的判定范围从而满足计算需要,偏移量可用像素(px)或百分比(%)来表达,默认值为
    “0px 0px 0px 0px”。

在这里插入图片描述

  • threshold:触发回调的阈值的列表,按升序排列,列表中的每个阈值都是监听对象的交叉区域与边界区域的比率。如果构造器未传入值,则默认值为0
    在这里插入图片描述

使用功能场景

图片懒加载、video不可见时停止播放、监听当前页面课件区域,侧边导航高亮显示等

以监听当前页面课件区域,侧边导航高亮显示为例
![在这里插入图片描述](https://img-blog.csdnimg.cn/d523fc731d46444d8ff7707861bfd5c4.png

//获取目标dom
const artical = document.querySelectorAll('.artical')
//被点击项的索引
let activeItemIndex = 0;
//获取全部导航项
let allListItem = dom.list.children

//创建观察者
function articalObserve() {
  const ob = new IntersectionObserver((e) => {
  //当目标离开时不触发
    if (!e[0].isIntersecting) {
      return
    }
    //获取与root交叉的元素中自定义的index
    activeItemIndex = e[0].target.dataset.index
    //高亮
    this.moveTo(activeItemIndex)
  }, {
  	root: document.querySelector('#head'),
    //被观察元素与视口交叉
    threshold: 0
  })
  dom.artical.forEach(item => {
  //对目标进行观察
    ob.observe(item)
  })
}

//创建侧边导航
function getAsideList() {
  const list = [
    { title: '概要' },
    { title: '一、相关定义' },
    { title: '二、我们如何收集和使用您的个人信息' },
    { title: '三、信息的存储' },
    { title: '四、信息安全' },
    { title: '五、我们分享的信息' },
    { title: '六、您的权利' },
    { title: '七、变更' },
    { title: '八、未成年人保护' },
    { title: '九、其他' },
    { title: '十、联系我们' },
  ]

  for (let i = 0; i < list.length; i++) {
    const div = document.createElement('div')
    div.classList.add('list-item')
    //自定义属性每部分的index
    div.setAttribute('index', i)
    //记录每个部分距离浏览器顶部高度,20为第一个部分距离页面顶部的偏移量
    div.setAttribute('top', dom.artical[i].offsetTop - 20)
    div.onclick = () => this.jumpTo(i, dom.artical[i].offsetTop - 20)
    div.innerText = list[i].title
    //将导航项加入到准备好的盒子
    父元素的dom.appendChild(div)
  }
}

//高亮显示
function moveTo(i) {
	//移除之前元素的高亮
  let activeA = document.querySelector('.active')
  if (activeA) activeA.classList.remove('active')
  //为当前项添加高亮
  allListItem[i].classList.add('active')
}

//点击导航滑动到指定部分
function jumpTo(i, t) {
  moveTo(i)
  //滚动到指定位置
  可滚动区域的dom.scrollTo({ top: t, behavior: 'smooth' })
}


运行效果

黄色区域为监听的根root,当每一部分与根(黄色区域)交叉时,触发回调,使导航高亮

在这里插入图片描述

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

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

相关文章

Blender渲染分辨率如何优化设置?这些渲染技巧你要知道!

尽管 Blender不断改进其功能&#xff0c;随着硬件的不断进步而变得越来越复杂&#xff0c;该软件最好的是允许很多人免费试用它。但即使所有人都可以访问&#xff0c;这并不意味着Blender可以克服低端GPU的局限性。 并非所有PC都是平等的&#xff0c;也不是每个3D设计师都可以使…

Aho-Corasick automaton,ac自动机实现

文章目录 写在前面算法概述trie树的构建trie树的节点结构插入P串到trie树中fail指针的创建 搜索过程测试程序 写在前面 原作者的视频讲解链接&#xff1a;[算法]轻松掌握ac自动机_哔哩哔哩_bilibili 原作者的代码实现&#xff1a;data-structure-and-algorithm/aho_corasick.c…

机器视觉表面划痕检测流程

表面缺陷检测常见的检测主要有物体表面的划痕、污渍、缺口、平面度、破损、边框对齐度、物体表面的亮度、皱纹、斑点、孔等。 表面缺陷检测设备凝聚了机器视觉领域的许多技术成果&#xff0c;吸取了许多创新的检测理念&#xff0c;可以与现有生产线无缝对接检测&#xff0c;也…

制定进度计划是成功项目管理的必由之路

项目经理王斌接到一个新项目&#xff0c;与各项目干系人没有建立有效的联系&#xff0c;他们无法了解项目进展情况。甚至连项目团队的参与人员自身对项目整体情况也没有清楚的认识&#xff0c;而只管自己那一部分&#xff0c;整个开发过程完全是一种黑盒模式&#xff0c;项目组…

电视盒子哪个好?内行盘点2023最具性价比电视盒子推荐

电视盒子跟有线机顶盒相比不用每年缴费&#xff0c;资源也更丰富&#xff0c;可下载各种APP。作为电视盒子从业人员&#xff0c;身边亲友在选购电视盒子之前会咨询我的意见&#xff0c;不懂电视盒子哪个好&#xff0c;可以看看我总结的2023最具性价比电视盒子推荐&#xff0c;非…

手慢无,阿里巴巴最新出品的高并发终极笔记到底有多强?

前几天收到一位粉丝私信&#xff0c;说的是他才一年半经验&#xff0c;去面试却被各种问到分布式&#xff0c;高并发&#xff0c;多线程之间的问题。基础层面上的是可以答上来&#xff0c;但是面试官深问的话就不会了&#xff01;被问得都怀疑现在Java招聘初级岗位到底招的是初…

MySQL-图形化界面工具 (下)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️树高千尺&#xff0c;落叶归根人生不易&…

springboot+mybatis+redis实现二级缓存

Mybatis提供了对缓存的支持&#xff0c;分为一级缓存和二级缓存&#xff0c;其查询顺序为&#xff1a;二级缓存>一级缓存->数据库&#xff0c;最原始是直接查询数据库&#xff0c;为了提高效率和节省资源&#xff0c;引入了一级缓存&#xff0c;为了进一步提高效率&#…

计算机网络(四下)——网络层

接上篇&#xff0c;这篇文章主要来写路由选择 五、路由协议 1>动态路由 1.距离向量算法&#xff08;RIP协议&#xff09;&#xff1b;适用于小型网络 1》规定&#xff1a; 1>记录跳数(Hop count)最少的路径。 2>RIP允许一条路由最多15个路由器&#xff0c;距离为…

LitCTF2023 wp re最后一道 cry misc

本来不打算放了&#xff0c;但是比赛打都打了留个纪念社工有佬&#xff0c;与我无关&#xff0c;misc只会隐写虽然我是逆向手&#xff0c;但因为队友tql&#xff0c;所以只留给我最后一道~~我的wp向来以简述思路为主&#xff0c;习惯就好 Crypto Hex&#xff1f;Hex&#xff…

【项目设计】 负载均衡在线OJ系统

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录 一、项目介绍项目技术栈和开发环境 二、项目的宏观结构三、compile_server模块①日志模块开发&#xff0c;Util工具类&#xff0c;供所以模…

NVIDIA再现谜之刀法,RTX 4060Ti新增16G版

随着上一代库存逐渐清理到位&#xff0c;苏妈与老黄终于要把新一代主流级显卡掏出来了。 根据外网消息&#xff0c;AMD 这边主要是 RX 7600XT 与 7600 等型号&#xff0c;发布日期定为 5 月 25 日。 AMD 保密措施做得挺到位的&#xff0c;目前除了部分厂商爆出的包装与产品图…

[MYAQL / Mariadb] 数据库学习-数据导入导出

数据库学习-数据导入导出 数据导入导出&#xff08;批量处理数据&#xff09;查看默认检索目录模糊查询&#xff1a;show variables like %XXXX%;修改检索目录路径&#xff08;&#xff01;&#xff01;文件一定要有MySQL用户的 7的RWX 权限&#xff01;&#xff09;默认的检索…

前端-02 CSS基础

1 简介 1.1 CSS语法 语法 选择器&#xff1a;HTML元素 生命块&#xff1a;用;隔开的各种声明 {a;b} 每条声明有CSS属性名称和值&#xff0c;用冒号分割{属性:值;属性:值} 案例 整块代码 <!DOCTYPE html> <html><head><style>body {background…

同一个IP可以安装配置多个SSL证书吗?

如何在同一IP地址上运行多个SSL证书? 服务器名称指示SNI&#xff0c;可以帮助您实现同一IP运行多个SSL证书&#xff0c;这样虚拟主机网站也能用上SSL证书了。 什么是SNI 服务器名称指示SNI是SSL的一个重要组成部分&#xff0c;SNI允许多个网站存在于同一个IP地址上&#xff…

CVPR目标检测经典作:HOG特征

来源&#xff1a;投稿 作者&#xff1a;小灰灰 编辑&#xff1a;学姐 HOG特征 HOG特征( Histogram of Oriented Gradients 方向梯度直方图&#xff09;是一种在图像上找到特征描述子&#xff0c;主要通过计算和统计图像局部区域的梯度方向直方图来构成特征。来源于cvpr2015 年…

Angular 学习笔记

本系列笔记主要参考&#xff1a; Angular学习视频 Angular官方文档 Angular系列笔记 特此感谢&#xff01; 目录 1.Angular 介绍2.Angular 环境搭建、创建 Angular 项目、运行 Angular 项目2.1.环境搭建2.2.创建 Angular 项目2.3.运行项目 3.Angular 目录结构分析3.1.目录结构分…

低分辨率视频可以变高分辨率吗?

近几年&#xff0c;老电影、老视频片段修复越来越常见了。很多优质的片源&#xff0c;因为年代久远&#xff0c;分辨率较低&#xff0c;画质比较差&#xff0c;通过视频超分技术&#xff0c;实现了画质增强&#xff0c;提高画质分辨率&#xff0c;视频画面变得更清晰了。 首先…

计算机有哪些方面的技术? - 易智编译EaseEditing

计算机是一种多功能的电子设备&#xff0c;可以处理数据、进行信息存储和检索、进行计算和模拟等多种任务。计算机技术是指计算机相关的技术领域&#xff0c;包括硬件和软件等多个方面。下面介绍一些常见的计算机技术&#xff1a; 操作系统技术&#xff1a; 操作系统是计算机系…

select poll epoll有什么区别

select/poll select 实现多路复用的方式是&#xff0c;将已连接的 Socket 都放到一个文件描述符集合&#xff0c;然后调用 select 函数将文件描述符集合拷贝到内核里&#xff0c;让内核来检查是否有网络事件产生&#xff0c;检查的方式很粗暴&#xff0c;就是通过遍历文件描述…