利用原生JS实现懒加载lazyLoad的三种方法总结
关于“利用原生JS实现懒加载lazyLoad的三种方法总结”,这是一个非常常见的需求,下面我详细讲解一下相关的攻略:
什么是懒加载
懒加载,也叫延迟加载,它指的是在图片或者其他资源需要显示时才进行加载,相应的,在一开始不需要显示时,可以通过预加载等方式来进行优化,从而提升页面性能,减少请求次数等。
实现懒加载几种常见的方式
1. IntersectionObserver
IntersectionObserver 是一个新的 API,它可以**元素的可见性变化,从而实现懒加载。使用此方法,我们可以直接**图片元素是否进入可视区域来判断是否需要加载图片。使用步骤如下:
1.1 HTML 结构
首先需要在需要进行懒加载的图片上使用占位符,例如以下代码:
<img src="loading.gif" data-src="image.jpg" alt="图片">在这里,我们使用 data-src 属性来存储真正需要加载的图片地址。在 HTML 中,使用 loading.gif 这张图片作为占位符。
1.2 JS 实现
接下来,就可以使用 IntersectionObserver 来**图片是否进入视口了。代码示例如下:
let observer = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (entry.intersectionRatio > 0) { // 如果元素的交叉比例大于零,表示图片进入了视口,可以加载图片 entry.target.src = entry.target.dataset.src; // 将 data-src 的值赋值到 src 属性上 observer.unobserve(entry.target); // 加载完成后,停止**当前元素 } }); }, { threshold: 0.01, // 交叉比例 });// **所有需要进行懒加载的图片document.querySelectorAll('img[data-src]').forEach((img) => { observer.observe(img);});在这里,首先使用 IntersectionObserver 构造函数创建一个新的实例,然后在构造函数中通过回调函数检查所有进入视口的元素,如果出现了设置,就将 data-src 属性值赋值给 src 属性,从而实现图片的加载。
2. 滚动事件**
另外一种方式就是通过**滚动事件来实现懒加载。代码示例如下:
// 获取所有需要进行懒加载的图片let lazyImgs = document.querySelectorAll('img[data-src]');// 滚动事件**函数let lazyLoad = function () { lazyImgs.forEach((img) => { // 获取图片距离页面顶部的距离 let imgTop = img.getBoundingClientRect().top; let windowHeight = window.innerHeight || document.documentElement.clientHeight; // 如果图片进入了视口 if (imgTop < windowHeight && imgTop > 0) { // 将 data-src 的值赋值到 src 属性上 img.src = img.dataset.src; // 加载完成后,删除**事件 img.addEventListener('load', () => { img.removeAttribute('data-src'); }); } });};// 立即执行一次懒加载函数lazyLoad();// 添加滚动事件**window.addEventListener('scroll', lazyLoad);在这里,我们首先需要获取所有需要进行懒加载的图片,然后**滚动事件,判断图片是否进入视口,如果是,则进行加载操作。关于图片可见区域的计算,可以使用 getBoundingClientRect() 方法获取。
这种方式的缺点是,如果有大量的图片需要进行懒加载,那么随着滚动事件的不断执行,这些函数就会不断地被调用,进而导致页面性能损失。