Intersection Observer API---交叉观察器 API

Intersection Observer API

        交叉观察器 API(Intersection Observer API)提供了一种异步检测目标元素祖先元素顶级文档的视口相交情况变化的方法,例如,可以观察判断一个div(有大小的)盒子在是否出现在窗口(window)中,你也可以指定它的一个父级元素,像html,body,等等。

观察器对象

构造函数

let observer = new IntersectionObserver(entries => {
    
},{
    root: null,
    rootMargin: '0px',
    threshold: 0.5 // 出现50% 
})

callback:回调函数,有一个参数entries,

       entries:数组,存放描述观察器和被观察对象的状态的对象(被观察的对象可以有多个)---IntersectionObserverEntry

​           IntersectionObserverEntry:对象,内部有7个属性和值

                 boundingClientRect:返回包含目标元素的边界信息的DOMRectReadOnly. 边界的计算方式与 Element.getBoundingClientRect() 相同。

                intersectionRatio:返回intersectionRect 与 boundingClientRect 的比例值。

                intersectionRect:返回一个 DOMRectReadOnly 用来描述根和目标元素的相交区域。

                isIntersecting:返回一个布尔值,如果目标元素与交叉区域观察者对象 (intersection observer) 的根相交,则返回 true .如果返回 true, 则 IntersectionObserverEntry 描述了变换到交叉时的状态; 如果返回 false, 那么可以由此判断,变换是从交叉状态到非交叉状态。

                rootBounds:返回一个 DOMRectReadOnly 用来描述交叉区域观察者 (intersection observer) 中的根。

                target:与根出现相交区域改变的元素 (Element).

                time ​:返回一个记录从 IntersectionObserver 的时间原点 (time origin) 到交叉被触发的时间的时间戳 (DOMHighResTimeStamp).

option: 对象,内部有3个属性和值,

        root:根元素,用作视口的元素,用于检查指定元素的可见性,必须是该指定元素的祖先。如果未指定或为 null,则默认为浏览器视口。例如,一个div是body的子元素,那么body就可以是这个div的root。

        rootMargin:根元素周围的边距。其值可以类似于 CSS margin 属性,例如 "10px 20px 30px 40px"(上、右、下、左)。这些值可以是百分比。在计算交叉点之前,这组值用于增大或缩小根元素边框的每一侧。默认值为全零。

        threshold:阈值,一个数字或一个数字数组,表示目标可见度达到多少百分比时,观察器的回调函数就应该执行(当目标在根元素中出现指定的比例时会触发一次回调)。如果只想在能见度超过 50% 时检测,可以使用 0.5 的值。如果希望每次能见度超过 25% 时都执行回调,则需要指定数组 [0, 0.25, 0.5, 0.75, 1]。默认值为 0(这意味着只要有一个像素可见,回调就会运行)。值为 1.0 意味着在每个像素都可见之前,阈值不会被认为已通过。

 

可以看到实例化的观察器对象,

实例方法

disconnect()

        使 IntersectionObserver 对象停止监听目标。

observe()

        使 IntersectionObserver 开始监听一个目标元素。

ItakeRecords()

        返回所有观察目标的 IntersectionObserverEntry 对象数组。

unobserve()

        使 IntersectionObserver 停止监听特定目标元素。

观察示例

新建一个div盒子,当它出现在视口占50%时,改变它的颜色

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>视口观察</title>
    <style>
        .content{
            height: 200vh;
        }
        .box{
            width: 100px;
            height: 100px;
            background-color: red;
        }
    </style>
</head>
<body>
    <div class="content"></div>
    <div class="box"></div>
    <div class="content"></div>
    <script src="index.js"></script>
</body>
</html>

index.js:

const box = document.getElementsByClassName('box')[0];
const observer = new IntersectionObserver(entries => {
    // console.log(entries);
    // 如果 intersectionRatio 为 0,则目标在视野外,
    // 我们不需要做任何事情。
    if (entries[0].intersectionRatio <= 0) return;
    if(entries[0].isIntersecting >= observer.thresholds[0]){
        console.log('元素进入视口50%');
    }
},{
    root: null,
    rootMargin: '0px',
    threshold: 0.5 // 出现50% 
})
observer.observe(box);//观察box

console.log(observer);

再添加改变颜色

const box = document.getElementsByClassName('box')[0];
const observer = new IntersectionObserver(entries => {
    // // console.log(entries);
    // // 如果 intersectionRatio 为 0,则目标在视野外,
    // // 我们不需要做任何事情。
    // if (entries[0].intersectionRatio <= 0) return;
    if(entries[0].isIntersecting >= observer.thresholds[0]){
        console.log('元素进入视口50%');
        box.style.backgroundColor = 'blue';
    }else{
        console.log('元素离开视口50%');
        box.style.backgroundColor = 'red';
    }
},{
    root: null,
    rootMargin: '0px',
    threshold: 0.5 // 出现50% 
})
observer.observe(box);//观察box

console.log(observer);

 

这样就成功观察到了一个元素是否出现再视口,并对其进行操作,

实际应用中可以实现图片的懒加载,当视口中出现图片时在将图片加载出来 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贰[2],VisionMaster/.NetCore的WPF应用程序调用控件

1,环境 VisionMaster4.2 VisualStudio2022 WPF/.Net6.0 2,记录原因 .NetFrameWork的WPF应用程序调用添加例程.NetFrameWork的Winform应用程序相应的库,不会出现报错,界面也能正常显示操作,但是.NetCore的程序却总是报错。 2.1,.NetFrameWork的WPF应用程序 注:但是.…

uniadmin引入iconfont报错

当在uniadmin中引入iconfont后&#xff0c;出现错误&#xff1a; [plugin:vite:css] [postcss] Cannot find module ‘E:/UniAdmin/uniAdmin/static/fonts/iconfont.woff2?t1673083050786’ from ‘E:\UniAdmin\uniAdmin\static\fonts\iconfont.css’ 这是需要更改为绝对路径…

线性代数|机器学习-P2 A的列向量空间

文章目录 1. Ax矩阵的形式2. ACR 矩阵分解2.1 rank1 矩阵分解2.2 rank2 矩阵分解2.3 ACMR,求M 3. Ax 向量 1. Ax矩阵的形式 假设我们有如下矩阵A&#xff1a; A x [ 2 1 3 3 1 4 5 7 12 ] [ x 1 x 2 x 3 ] \begin{equation} Ax\begin{bmatrix} 2&1&3\\\\ 3&1&am…

Java 还能不能继续搞了?

金三银四招聘季已落幕&#xff0c;虽说行情不是很乐观&#xff0c;但真正的强者从不抱怨。 在此期间&#xff0c;我收到众多小伙伴的宝贵反馈&#xff0c;整理出132道面试题&#xff0c;从基础到高级&#xff0c;有八股文&#xff0c;也有对某个知识点的深度解析。包括以下几部…

5 种技术,可用于系统中的大数据模型,而不会使系统崩塌

文章目录 一、说明二、第一种&#xff1a;批量大小三、第二种&#xff1a;主动学习四、第三种&#xff1a;增加代币数量五、第四种&#xff1a; 稀疏激活六、第五种&#xff1a;过滤器和更简单的模型后记 一、说明 以下是本文重要观点的摘要。阅读它以获取更多详细信息/获取原…

自动装车系统车辆定位-激光雷达解决方案

在自动装车系统中&#xff0c;激光雷达为车辆定位提供了一种高效且精确的解决方案。以下是关于这一解决方案的详细分析&#xff1a; 一、解决方案概述 激光雷达解决方案在自动装车系统中&#xff0c;通过发射激光束并接收目标反射回来的信号&#xff0c;来探测车辆的位置、状…

新手如何正确使用代理IP,一篇文章学会,包含实战案例

前言 一、代理IP1.1 什么是代理IP&#xff1f;1.2 代理ip分类1.3 代理IP的作用和优势 二、更换代理IP的方法2.1 重启路由器或光猫2.2 用拨号 vps 重拨更换动态IP代理。2.3 使用浏览器更换IP 三、IPIDEA代理的优势四、提取代理IP4.1 提取步骤4.2 浏览器使用代理IP 五、使用代理I…

【Redis数据库百万字详解】数据持久化

文章目录 一、持久化1.1、什么是持久化1.2、持久化方式1.3、RDB优缺点1.4、AOF优缺点 二、RDB持久化触发机制2.1、手动触发2.2、自动触发 三、RDB持久化配置3.1、配置文件3.2、配置查询/设置3.3、禁用持久化3.4、RDB文件恢复 四、RDB持久化案例4.1、手动持久化4.2、自动持久化案…

Hive3.1.2分区与排序(内置函数)

Hive3.1.2分区与排序&#xff08;内置函数&#xff09; 1、Hive分区(十分重要&#xff01;&#xff01;) 分区的目的&#xff1a;避免全表扫描&#xff0c;加快查询速度&#xff01; 在大数据中&#xff0c;最常见的一种思想就是分治&#xff0c;我们可以把大的文件切割划分成…

【二进制部署k8s-1.29.4】十三、metrics-server的安装部署

文章目录 简介 一.metrics-server的安装 简介 本章节主要讲解metrics-server的安装&#xff0c;metrics-server主要是用于采集k8s中节点和pod的内存和cpu指标&#xff0c;在观察几点和pod的实时资源使用情况还是比较有用的&#xff0c;如果需要记录历史信息&#xff0c;建议采用…

层出不穷的大模型产品,你怎么选?

一&#xff1a;简介 关于大模型AIGC产品的选择与发展趋势&#xff0c;目前许多互联网公司都在不断投入资源和精力开发基于大规模模型的人工智能产品。这些产品通常能够处理更复杂的任务并提供更高质量的服务&#xff0c;如智能问答、自然语言处理、图像识别等。在产品选择上&am…

Linux下查看进程和端口信息

1, 根据进程名(这里是模糊查询)查看进程信息&#xff0c;以查看nginx进程名为例&#xff0c;查看所对应的进程id为19013(或者使用&#xff1a; ps -aux | grep nginx查看占用内存等信息) ps -ef | grep nginx 2, 根据进程id查看进程占用端口&#xff0c;查看对应端口为8080&…

git clone 文件名中文、有冒号等问题 fatal: repository ‘***/r/鏍″洯鏅烘収椋熷爞/.git/‘ not found

记录一个git问题&#xff0c;比较有意思&#xff0c;也比较难找。 背景 首先把代码拉下来&#xff0c;发现给我报错。 怀疑 刚开始以为是仓库地址变了&#xff0c;但是发现仓库地址并没有变过。 交流 然后寻找解决方案。因为同事也遇到过&#xff0c;同事交了我一招&…

docker-compose教程

1. docker-compose是什么&#xff1f; 1. 1 简介 compose、machine 和 swarm 是docker 原生提供的三大编排工具。 简称docker三剑客。Compose 项目是 Docker 官方的开源项目&#xff0c;定义和运行多个 Docker 容器的应用&#xff08;Defining and running multi-container Do…

男士内裤一般几个月换一个?男性内裤的选购方法分享!

男士内裤&#xff0c;作为日常穿着的重要衣物&#xff0c;往往被许多男性朋友所忽视。然而&#xff0c;一款合适的内裤不仅能够提升穿着的舒适度&#xff0c;还能在一定程度上维护健康。因此&#xff0c;对男士内裤的选择&#xff0c;我们应当给予足够的重视。 众多男性朋友们…

C++——从C语言快速入门

目录 一、数组 1、声明数组 2、初始化数组 3、访问数组元素 4、示例 5、注意事项 6、数组小练习 计算器支持加减乘除 数组找最大值 二、指针 三、字符串 string 类型 一、数组 在 C 中&#xff0c;数组是一种存储固定大小的相同类型元素的序列。数组的所有元素都存…

半导体人才荒,何解?

过去两年&#xff0c;全球半导体行业陷入寒冬&#xff0c;砍单、裁员、减产、倒闭等各种负面消息接踵而至。 2024年来&#xff0c;在全球半导体产业经历周期性下滑后&#xff0c;逐渐迎来复苏&#xff0c;市场景气向好。据WSTS预测&#xff0c;2024年全球半导体市场将同比增长…

四川古力未来科技抖音小店靠谱之选,购物新体验

在当今数字化浪潮下&#xff0c;抖音小店作为新兴的电商平台&#xff0c;正以其独特的魅力和便捷性&#xff0c;吸引着越来越多的消费者。而四川古力未来科技抖音小店&#xff0c;凭借其优质的产品、完善的服务和良好的口碑&#xff0c;成为了众多消费者的靠谱之选。 四川古力未…

Paraformer解读(1)基于self-attention和dfsmn的encoder

DFSMN SAN-M python实现 import torch import torch.nn as nn import torch.nn.functional as Fclass PositionalEncoding(nn.Module):def __init__(self, d_model, dropout0.1, max_len5000):super(PositionalEncoding, self).__init__()self.dropout nn.Dropout(pdropout)p…

国资国企如何高效实现数据监管报送

为深入贯彻国家关于数字经济与实体经济融合发展的重要指示&#xff0c;结合国资监管信息系统的规范要求&#xff0c;亿信华辰积极响应&#xff0c;助力国企走上数字化转型的道路。应对国资国企监管要求&#xff0c;国资国企监管数据填报平台作为数字化建设的关键环节&#xff0…