使用IntersectionObserver实现图片懒加载组件

前言

图片懒加载是一个很平常的功能,之前实现的方式基本都是 scrollTop+clientHeight>=offsetTop那么图片就加载,有一些弊端。

  1. 监听滚动,要是套很多层怎么办,当然硬写也是可以写的,比较麻烦。
  2. 每一个需要懒加载的都要去监听滚动,影响性能。

当知道IntersectionObserver后,我也瞬间明白面试官为什么会问如何实现图片懒加载,你有几种方法,他想听的并不是scrollTop+clientHeight>=offsetTop,还是太天真,害。这种方法之前也有写过 从理论到代码实操,图片预加载和懒加载 - 掘金 (juejin.cn)

IntersectionObserver文档: IntersectionObserver - Web API 接口参考 | MDN (mozilla.org)

接下来进入主题IntersectionObserver,代码也会放在后面。

正文

官方的文档是这样说的。

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

简单来说,你所观察的元素只要在屏幕的视口中出现,就会触发你所设定的代码。

IntersectionObserver的基本使用

创建IntersectionObserver对象
ini 复制代码
var observer = new IntersectionObserver(callback[, options]);
  • callback
    • 当元素可见比例超过指定阈值后,会调用一个回调函数,此回调函数接受两个参数:
      1. 一个IntersectionObserverEntry对象的数组,每个被触发的阈值,都或多或少与指定阈值有偏差。
      2. observer:被调用的IntersectionObserver实例。
  • options
    • 一个可以用来配置 observer 实例的对象。如果options未指定,observer 实例默认使用文档视口作为 root,并且没有 margin,阈值为 0%(意味着即使一像素的改变都会触发回调函数)
      1. root:监听元素的祖先元素Element对象,其边界盒将被视作视口。目标在根的可见区域的的任何不可见部分都会被视为不可见。
      2. 一个在计算交叉值时添加至根的边界盒 (bounding_box (en-US)) 中的一组偏移量,类型为字符串 (string) ,可以有效的缩小或扩大根的判定范围从而满足计算需要。语法大致和 CSS 中的margin 属性等同; 可以参考 intersection root 和 root margin 来深入了解 margin 的工作原理及其语法。默认值是"0px 0px 0px 0px"。
      3. 规定了一个监听目标与边界盒交叉区域的比例值,可以是一个具体的数值或是一组 0.0 到 1.0 之间的数组。若指定值为 0.0,则意味着监听元素即使与根有 1 像素交叉,此元素也会被视为可见。若指定值为 1.0,则意味着整个元素都在可见范围内时才算可见。可以参考阈值来深入了解阈值是如何使用的。阈值的默认值为 0.0。

通常使用方式,options不用设置,看需求

js 复制代码
    const observer = new IntersectionObserver((entries, observer) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {   
          // console.log('元素进入视口');
        } else {
          // console.log('元素离开视口');
        }
      });
    });
    observer.observe(targetElement);
    
常用的实例方法
  1. observe()
    IntersectionObserver 对象监听的目标集合添加一个元素。
ini 复制代码
IntersectionObserver.observe(targetElement);
  • targetElement
    • 可见性区域被监控的元素element。 此元素必须是根元素的后代 (如果根元素为视窗,则该元素必须被当前文档包含)。
  1. disconnect()
    终止对所有目标元素可见性变化的观察
ini 复制代码
intersectionObserver.disconnect();
  1. unobserve()
    停止对一个元素的观察
ini 复制代码
IntersectionObserver.unobserve(target);
  • target
    • 要取消观察的目标,如果没有提供,方法不做任何事情,也不会抛出异常。

懒加载图片

设置props
核心懒加载代码

你只管使用IntersectionObserver就好,剩下的它会处理

图片加载完回调

结语

仓库地址:function-realization: 实现一些有趣的功能 (gitee.com)

感兴趣的可以去试试。

相关推荐
GDAL11 小时前
Vue3 Computed 深入讲解(聚焦 Vue3 特性)
前端·javascript·vue.js
Moment11 小时前
半年时间使用 Tiptap 开发一个和飞书差不多效果的协同文档 😍😍😍
前端·javascript·后端
前端加油站11 小时前
记一个前端导出excel受限问题
前端·javascript
da_vinci_x11 小时前
PS 生成式扩展:从 iPad 到带鱼屏,游戏立绘“全终端”适配流
前端·人工智能·游戏·ui·aigc·技术美术·游戏美术
一壶纱11 小时前
uni-app 中配置 UnoCSS
前端·vue.js
坐吃山猪11 小时前
Electron02-Hello
开发语言·javascript·ecmascript
步履不停_11 小时前
告别输入密码!打造基于 VS Code 的极致远程开发工作流
前端·visual studio code
狗哥哥11 小时前
Vue 3 企业级表格组件体系设计实战
前端
尘世中一位迷途小书童11 小时前
JavaScript 一些小特性:让你的代码更优雅高效
前端·javascript·架构
草帽lufei12 小时前
高强度SOLO真实业务项目
前端·ai编程·trae