图片懒加载,顾名思义,是指当图片在当前视窗内不可见时不加载该图片,当图片在当前视窗内可见时再加载该图片。它的主要目的是提高网页加载的性能和体验。这篇文章将介绍几种常用的 JavaScript 实现图片懒加载的方法
第一种方法:基于 IntersectionObserver Api
IntersectionObserver API 是一个异步接口,可以监视 DOM 元素与父元素或祖先元素的交叉情况。它可以通过设置一个阈值,来控制图片加载的时机。
如果你的应用支持使用 IntersectionObserver API,那么使用它可以非常简单。下面是代码实现:
// 创建一个 IntersectionObserver 对象 Const observer = new IntersectionObserver(entries => { // 遍历所有的图片元素 entries.forEach(entry => { // 当图片在当前视窗内可见时 if (entry.isIntersecting) { // 加载图片 const img = entry.target; img.src = img.dataset.src; // 取消对该图片的监视 observer.unobserve(img); } }); }); // 获取所有需要懒加载的图片元素 const imgs = document.querySelectorAll('img[data-src]'); // 为每个图片元素添加监视 imgs.forEach(img => { observer.observe(img); });
第二种方法:基于 getBoundingClientRect() 和 window.scrollYgetBoundingClientRect() 方法返回元素的大小及其相对于视口的位置。window.scrollY 表示页面在垂直方向上滚动的距离。通过判断图片是否在当前视窗内,可以决定是否加载图片。
下面是代码实现:
const imgs = document.querySelectorAll('img[data-src]'); const options = { rootMargin: '0px 0px 50px 0px' }; function loadImage(img) { const src = img.getAttribute('data-src'); if (!src) return; img.src = src; } const observer = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { const img = entry.target; loadImage(img); observer.unobserve(img); } }); }, options); imgs.forEach(img => { observer.observe(img); });
第三种方法:基于 throttle 函数
throttle 函数可以控制函数的调用频率,防止函数的频繁调用,提高代码的性能。我们可以将懒加载的代码包装在 throttle 函数中,并且在页面滚动事件发生时调用该函数。
下面是代码实现:
const imgs = document.querySelectorAll('img[data-src]'); function loadImage(img) { const src = img.getAttribute('data-src'); if (!src) return; img.src = src; } function handleScroll() { imgs.forEach(img => { const rect = img.getBoundingClientRect(); if (rect.top < window.innerHeight && rect.bottom > 0) { loadImage(img); } }); } window.addEventListener('scroll', throttle(handleScroll, 200)); function throttle(fn, wait) { Let inThrottle; return function() { const context = this; const args = arguments; if (!inThrottle) { fn.Apply(context, args); inThrottle = true; setTimeout(() => (inThrottle = false), wait); } }; }
以上三种方法都可以实现图片懒加载的功能,可以根据需求来选择合适的方法。对于一些简单的需求,我们可以使用基于滚动事件的方法实现;对于需要更复杂的场景,我们可以使用 IntersectionObserver 或者基于 throttle 函数的方法。
最后需要注意的是,在实际项目开发中,可能需要考虑图片加载的兼容性,特别是对于低版本的浏览器。因此我们可以使用 polyfill 来兼容低版本的浏览器。
总的来说,图片懒加载是一个非常有用的技巧,可以提高页面加载速度,提高用户体验。我们应该根据项目的需求,选择合适的方法来实现图片懒加载。另外,还有一种实现图片懒加载的方法是使用第三方库,如 lazyload.js、lozad.js、yall.js 等。这些库已经封装好了实现图片懒加载的逻辑,我们可以很方便地在项目中使用。下面是使用 yall.js 实现图片懒加载的代码:
// 引入 yall.js import yall from 'yall-js'; // 初始化 yall.js yall({ observeChanges: true, threshold: 0.5 }); // 在页面中的图片标签中添加 data-src 属性 <img data-src="path/to/image.jpg" alt="图片">
使用第三方库实现图片懒加载是最简单的方法,但是也有一些缺点,如体积较大,速度较慢等。因此,在实际项目开发中,我们需要考虑到项目的需求,合理选择实现方法。
总的来说,图片懒加载是一种非常有效的技巧,可以提高页面加载速度,提高用户体验。我们可以通过基于滚动事件、IntersectionObserver、throttle 函数和第三方库等多种方法来实现图片懒加载。在实际项目开发中,我们需要根据项目的需求,合理选择实现方法。
怎么知道是否进入可视区域了?
通过判断图片是否进入可视区域,决定是否加载图片是图片懒加载的核心逻辑。
在使用基于滚动事件和 throttle 函数实现图片懒加载的方法中,可以通过对图片的位置和页面的滚动位置进行判断,确定图片是否进入可视区域。
在使用 IntersectionObserver 实现图片懒加载的方法中,IntersectionObserver API 提供了一种更高效和简单的方法来判断元素是否进入可视区域。 IntersectionObserver API 会自动监听目标元素和观察区域的交集,并在目标元素进入或离开可视区域时触发回调函数。
在使用第三方库实现图片懒加载的方法中,第三方库已经封装好了判断元素是否进入可视区域的逻辑,我们只需要在页面中正确配置图片标签即可。
综上所述,不同的实现方法有不同的判断元素是否进入可视区域的方法,但都可以很方便地实现图片懒加载的功能。