如何通过IntersectionObserver实现懒加载
作者:凌晨?||?AmsWait 发布时间:2024-04-16 08:44:41
通常懒加载等都会通过监听scroll事件用getBoundingClientRect()来判断元素位置来决定是否可以开始加载。性能开销是比较大的,为了节省性能又需要各种操作去弥补,例如用节流来减少判断次数等。
IntersectionObserver API可以完全省去这些操作,只需要简单的读取即可。
点击查看IntersectionObserver 文档
示例
new IntersectionObserver(callBack, options);
let options = {
root: null, // 相对的根元素,null为视口
threshold: 1.0 //重叠率 0.0-1.0(完全重叠即完全进入root元素) 重叠率达到要求后触发事件
},
callBack = (entries, observer) => { // entries 数组,包含所有的被观察者
entries.forEach(entry => {
// isIntersecting 即是否重叠
entry.target.innerText = entry.isIntersecting ? '加载~~~~': '不可见';
})
},
observer = new IntersectionObserver(callBack, options);
let observedList = document.querySelectorAll('h1');
observedList.forEach(element => {
observer.observe(element)
});
options 配置项
传递到 IntersectionObserver() 构造函数的 options 对象,允许您控制观察者的回调函数的被调用时的环境。它有以下字段:
root
指定根(root)元素,用于检查目标的可见性。必须是目标元素的父级元素。如果未指定或者为null,则默认为浏览器视窗。
rootMargin
根(root)元素的外边距。类似于 CSS 中的 margin 属性,比如 “10px 20px 30px 40px” (top, right, bottom, left)。如果有指定 root 参数,则 rootMargin 也可以使用百分比来取值。该属性值是用作 root 元素和 target 发生交集时候的计算交集的区域范围,使用该属性可以控制 root 元素每一边的收缩或者扩张。默认值为0。
threshold
可以是单一的 number 也可以是 number 数组,target 元素和 root 元素相交程度达到该值的时候 IntersectionObserver 注册的回调函数将会被执行。如果你只是想要探测当 target 元素的在 root 元素中的可见性超过50%的时候,你可以指定该属性值为0.5。如果你想要 target 元素在 root 元素的可见程度每多25%就执行一次回调,那么你可以指定一个数组 [0, 0.25, 0.5, 0.75, 1]。默认值是0 (意味着只要有一个 target 像素出现在 root 元素中,回调函数将会被执行)。该值为1.0含义是当 target 完全出现在 root 元素中时候 回调才会被执行。
Demo
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body {
font-size: 24px;
}
</style>
</head>
<body>
<h1>不可见</h1>
<h4>不可见</h4>
<h1>不可见</h1>
<h4>不可见</h4>
<h1>不可见</h1>
<h4>不可见</h4>
<h1>不可见</h1>
<h4>不可见</h4>
<h1>不可见</h1>
<h4>不可见</h4>
<h1>不可见</h1>
<h4>不可见</h4>
<h1>不可见</h1>
<h4>不可见</h4>
<h1>不可见</h1>
<h4>不可见</h4>
<h1>不可见</h1>
<h4>不可见</h4>
<h1>不可见</h1>
<h4>不可见</h4>
<h1>不可见</h1>
<h4>不可见</h4>
<h1>不可见</h1>
<h4>不可见</h4>
<h1>不可见</h1>
<h4>不可见</h4>
<h1>不可见</h1>
<h4>不可见</h4>
<h1>不可见</h1>
<h4>不可见</h4>
<script>
let options = {
root: null, // 根元素,null为视口
threshold: 1.0 //重叠率 0.0-1.0 重叠率达到要求后触发事件
},
callBack = (entries, observer) => {
entries.forEach(entry => {
entry.target.innerText = entry.isIntersecting ? '测试': '不可见';
})
},
observer = new IntersectionObserver(callBack, options);
let observedList = document.querySelectorAll('h1');
observedList.forEach(element => {
observer.observe(element)
});
</script>
</body>
</html>
来源:https://blog.csdn.net/amswait/article/details/130107488
猜你喜欢
- 简介这篇文章的初衷是很多文章都告诉你最左匹配原则,却没有告诉你,实际场景下它到底是如何工作的,本文就是为了阐述清这个问题。准备为了方面后续的
- Dynaconf 是一个 Python 的第三方模块,旨在成为在 Python 中管理配置的最佳选择。它可以从各种来源读取设置,包括环境变量
- 一、创建虚拟环境(1)打开cmd命令窗口(2)创建虚拟环境 conda create -n mydjango_env(3)查看虚拟环境 co
- 如何在Typescript中使用for...in ?本人在TS中用for...in出现了些问题,也想到了一些解决方法。那么先来看看下面报错的
- 前言当数据库中存量数据较多时,或者是在批量插入操作时,很容易出现插入重复数据的问题。一、三种方法在 mysql 中,当存在主键冲突或唯一键冲
- 使用到的库好多人都想了解一下如何对摄像头进行调用,然后进行目标检测,于是我做了这个小BLOG。opencv-python==4.1.2.30
- 在将string类型的数据类型转换为spark rdd时,一直报这个错,StructType can not accept object %
- 上一篇文章介绍了并发和多线程的概念,这次就来向大家上一个实战来讲解一下如何真正的运用上多线程这个概念。有需要的可以看看我之前这篇文章:Pyt
- 本文介绍一种将一个大的文本文件分割成多个小文件的方法方法一:1.读取文章所有的行,并存入列表中2.定义分割成的小文本的行数3.将原文本内容按
- 前言大家好,这次写作的目的是为了加深对数据可视化pyecharts的认识,也想和大家分享一下。如果下面文章中有错误的地方还请指正,哈哈哈!!
- 简介 tensorflow 配套的可视化工具, 将你的计算图画出来.当训练一个巨大的网络的时候, 计算图既复杂又令人困惑. TensorBo
- 本文记录了python 3.7.0 安装配置方法,供大家参考,具体内容如下S1 登入Python官网下载网址S2 下载后缀为exe的可执行文
- 问题:mysql:1130 is not allowed to connect to this MariaDB server(没有远程登录权
- 一个方便的特性是你可以给一个视图指定默认的参数。 这样,当没有给这个参数赋值的时候将会使用默认的值。例子:# urls.pyfrom dja
- 在自然语言处理(NLP)领域,文本相似度计算是一个常见的任务。本文将介绍如何使用Python计算文本之间的相似度,涵盖了余弦相似度、Jacc
- 前言这是我之前安装的mysql5.7,然后想换成mysql8.0就有这篇,差不多跟着操作应该可以删除干净。一、你要先查询你是否安装了mysq
- 先安装第三方库:pip install requestsdef isConnected(): import requ
- next()方法当一个文件被用作迭代器,典型例子是在一个循环中被使用,next()方法被反复调用。此方法返回下一个输入行,或引发
- 一、前言1.1.环境python版本:3.6Django版本:1.11.61.2.预览效果最终搭建的blog的样子,基本上满足需求了。框架搭
- 本文是将yolo3目标检测框架训练出来的ckpt文件固化成pb文件,主要利用了GitHub上的该项目。为什么要最终生成pb文件呢?简单来说就