谈谈IntersectionObserver懒加载的具体使用


Posted in Javascript onOctober 15, 2019

概念

IntersectionObserver接口(从属于Intersection Observer API)为开发者提供了一种可以异步监听目标元素与其祖先或视窗(viewport)交叉状态的手段。祖先元素与视窗(viewport)被称为根(root)。

这是MDN上给的官方概念,不用去管它,我粘出来只是为了显得专业点嘛...

重点看这里 监听目标元素与其祖先或视窗交叉状态的手段 ,其实就是观察一个元素是否在视窗可见。

谈谈IntersectionObserver懒加载的具体使用

可以看到,交叉了就是说明当前元素在视窗里,当前就是可见的了。

API

var io = new IntersectionObserver(callback, options)

其实就是一个简单的构造函数。

以上代码会返回一个 IntersectionObserver 实例, callback 是当元素的可见性变化时候的回调函数, options 是一些配置项(可选)。

我们使用返回的这个实例来进行一些操作。

io.observe(document.querySelector('img')) 开始观察,接受一个DOM节点对象
io.unobserve(element) 停止观察 接受一个element元素
io.disconnect() 关闭观察器

options

root

用于观察的根元素,默认是浏览器的视口,也可以指定具体元素,指定元素的时候用于观察的元素必须是指定元素的子元素

threshold

用来指定交叉比例,决定什么时候触发回调函数,是一个数组,默认是 [0]

const options = {
	root: null,
	threshold: [0, 0.5, 1]
}
var io = new IntersectionObserver(callback, options)
io.observe(document.querySelector('img'))

上面代码,我们指定了交叉比例为0,0.5,1,当观察元素img0%、50%、100%时候就会触发回调函数

rootMargin

用来扩大或者缩小视窗的的大小,使用css的定义方法, 10px 10px 30px 20px 表示top、right、bottom 和 left的值

const options = {
	root: document.querySelector('.box'),
	threshold: [0, 0.5, 1],
	rootMargin: '30px 100px 20px'
}

为了方便理解,我画了张图,如下

谈谈IntersectionObserver懒加载的具体使用

首先我们来看下图上的问题,蓝线是什么呢?他就是咱们定义的root元素,我们添加了 rootMargin 属性,将视窗的增大了,虚线就是现在的视窗,所以元素现在也就在视窗里面了。

由此可见,root元素只有在 rootMargin 为空的时候才是绝对的视窗。

说了简单的options,接下来我们看下 callback

callback

上面我们说到,当元素的可见性变化时,就会触发callback函数。

callback函数会触发两次,元素进入视窗(开始可见时)和元素离开视窗(开始不可见时)都会触发

var io = new IntersectionObserver((entries)=>{
	console.log(entries)
})

io.observe($0)

以上代码,请在chrome控制台进行调试,这里我使用了 $0 选择了上一次我审查元素的选择的节点

运行结果如下

谈谈IntersectionObserver懒加载的具体使用

我们可以看到callback函数有个 entries 参数,它是个 IntersectionObserverEntry 对象数组,接下来我们重点说下IntersectionObserverEntry对象

IntersectionObserverEntry

IntersectionObserverEntry 提供观察元素的信息,有七个属性。

boundingClientRect 目标元素的矩形信息 intersectionRatio 相交区域和目标元素的比例值 intersectionRect/boundingClientRect 不可见时小于等于0 intersectionRect 目标元素和视窗(根)相交的矩形信息 可以称为相交区域 isIntersecting 目标元素当前是否可见 Boolean值 可见为true rootBounds 根元素的矩形信息,没有指定根元素就是当前视窗的矩形信息 target 观察的目标元素 time 返回一个记录从 IntersectionObserver 的时间到交叉被触发的时间的时间戳

上面几个矩形信息的关系如下

谈谈IntersectionObserver懒加载的具体使用

划重点

intersectionRatio和 isIntersecting 是用来判断元素是否可见的,押题咯...

懒加载

好了,通过上面一些概念我们大概了解了 IntersectionObserver 是个什么东西,接下来我们用它来写点代码,写什么呢?没错就是懒加载。

通过IntersectionObserver来实现懒加载,就简单的多了,我们只需要设置回调,判断当前元素是否可见,再进行渲染操作就行了,而不用去关心内部的计算。

主要代码如下

const io = new IntersectionObserver(()=>{ // 实例化 默认基于当前视窗
	
}) 

let ings = document.querySelectorAll('[data-src]') // 将图片的真实url设置为data-src src属性为占位图 元素可见时候替换src

function callback(entries){ 
	entries.forEach((item) => { // 遍历entries数组
		if(item.isIntersecting){ // 当前元素可见
			item.target.src = item.target.dataset.src // 替换src
			io.unobserve(item.target) // 停止观察当前元素 避免不可见时候再次调用callback函数
		}	
	})
}

imgs.forEach((item)=>{ // io.observe接受一个DOM元素,添加多个监听 使用forEach
	io.observe(item)
})

本想录制个GIF图,使用Recordlt始终上传不了,谁有好用的GIF图录制软件请推荐个,不胜感激。。

呐,给你花:rose:

因篇幅有限,完整代码请戳 github

注意

目前IntersectionObserver是一个实验中的功能,请酌情使用。

谈谈IntersectionObserver懒加载的具体使用

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery中选择块并改变属性值的方法
Jul 31 Javascript
js定时器(执行一次、重复执行)
Mar 07 Javascript
JavaScript通过元素的ID和name设置样式
Jul 08 Javascript
jquery中append()与appendto()用法分析
Nov 14 Javascript
ANGULARJS中用NG-BIND指令实现单向绑定的例子
Dec 08 Javascript
JavaScript实现Base64编码转换
Apr 23 Javascript
获取IE浏览器Cookie信息的方法
Jan 23 Javascript
JavaScript箭头函数_动力节点Java学院整理
Jun 28 Javascript
使用JavaScript根据图片获取条形码的方法
Jul 04 Javascript
JavaScript反弹动画效果的实现代码
Jul 13 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
Jan 30 Javascript
Vue中axios的封装(报错、鉴权、跳转、拦截、提示)
Aug 20 Javascript
js实现开关灯效果
Mar 30 #Javascript
JS实现灯泡开关特效
Mar 30 #Javascript
浅谈微信小程序列表埋点曝光指南
Oct 15 #Javascript
javascript网页随机点名实现过程解析
Oct 15 #Javascript
javascript随机变色实例代码
Oct 15 #Javascript
vue中axios的二次封装实例讲解
Oct 14 #Javascript
Vue项目打包部署到iis服务器的配置方法
Oct 14 #Javascript
You might like
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
JQuery Ajax 跨域访问的解决方案
2010/03/12 Javascript
js三种排序算法分享
2012/08/16 Javascript
xml转json的js代码
2012/08/28 Javascript
js函数调用的方式
2014/05/06 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
JS时间特效最常用的三款
2015/08/19 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
JavaScript如何实现跨域请求
2016/08/05 Javascript
给localStorage设置一个过期时间的方法分享
2018/11/06 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
js脚本中执行java后台代码方法解析
2019/10/11 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
Python读取环境变量的方法和自定义类分享
2014/11/22 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
2017/11/03 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
python同时替换多个字符串方法示例
2019/09/17 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
2020/06/23 Python
英文版银行求职信
2013/10/09 职场文书
总裁办公室主任职责
2014/01/02 职场文书
技能竞赛活动方案
2014/02/21 职场文书
闭幕式主持词
2014/04/02 职场文书
高中英语演讲稿范文
2014/04/24 职场文书
工作证明格式及范本
2014/09/12 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书