前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >原生IntersectionObserver交叉观察者

原生IntersectionObserver交叉观察者

作者头像
wade
发布2020-04-24 10:03:16
7570
发布2020-04-24 10:03:16
举报
文章被收录于专栏:coding个人笔记coding个人笔记

前端开发,对于Observer,应该很熟悉,早之前,刚开始开发前端的时候,老是看群里大佬说没有被Observer到,觉得老高大上了。简单解释就是观察者,也就是说没有被监听到,其实跟订阅发布或者观察者模式有点类似。

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

简单来说就是监听元素出现在根元素,IntersectionObserver接收两个参数,第一个是回调,第二个是配置项:

代码语言:javascript
复制
new IntersectionObserver(handler, options)
let observer = new IntersectionObserver((entries, observer) => {
}, {
 root: null,
 rootMargin: '0px',
 threshold: [0],
});

handler函数有两个参数,一个是监听对象的数组,一个是当前实例

options有三个参数:

root:指定根元素,如果没有指定是默认document

rootMargin:默认0px,比如一个div宽高300px,设置50px的rootMargin,那么就是监听这个div上下左右都减去50px。

threshold:线性升序排序,就是出现到这个元素的百分比的时候就触发回调函数。

然后监听:

代码语言:javascript
复制
observer.observe(document.querySelector('#test1'))

总共有四个方法:

observe()开始监听一个元素,可以同时监听多个

disconnect()停止监听所有

takeRecords()返回所有观察目标的对象数组

unobserve()停止监听特定目标

看一个简单的效果:

看看代码:

代码语言:javascript
复制
let observer = new IntersectionObserver((entries, observer) => {
 let percent = entries[0].intersectionRatio * 100;
 document.getElementById('percent').innerText = parseInt(percent) + '%'
}, {
 root: null,
 rootMargin: '0px',
 threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1],
});
observer.observe(document.getElementById('test'))

百分比会有一些误差,没办法真正在百分之10这样的时候触发回调,因为IntersectionObserver API 是异步的,不随着目标元素的滚动同步触发。这个观察器的优先级非常低,只在其他任务执行完,浏览器有了空闲才会执行。

运用这个api,可以很容易实现懒加载,还有视频往上滑动就暂停,无限滚动等。而且使用这个api最大的优势就是对性能的友好了。当然,兼容性却是一个需要考虑的因素。

最后有个问题,我不知道为什么我初始化之后,一监听就会先进入回调,这个问题没有找到答案。有个群友说根据rxjs的解释,跟热观察和冷观察会有关系,不知道这个api是否是热观察,如果是热观察,那么初始化就会监听。

(完)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 coding个人笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档