图片懒加载的实现

闪耀星辰 2021-04-25 ⋅ 46 阅读

lazy-loading-image

在现代网页中,图像是页面加载速度的主要瓶颈之一。当一个页面上存在大量图像时,传统的页面加载方式会导致用户等待很长时间才能完整地显示页面内容。

为了改善这个问题,我们可以使用一种叫做“懒加载(Lazy Load)”的技术。懒加载可以延迟图像的加载时间,只有当用户滚动到图像所在的可见区域时才加载图像。这种技术减少了初始加载的数据量,提高了页面的加载速度和性能。

懒加载的原理

懒加载的原理是通过监听用户滚动事件来判断图像是否在可视区域内。当用户滚动到图像出现在可视区域时,再将图像的src属性替换为真实的图像路径,从而实现图像的加载。

具体的实现思路如下所示:

  1. 将图像的真实路径保存在自定义的属性中,比如data-src
  2. 设置图像的占位符或默认图像作为初始的src属性值;
  3. 监听页面滚动事件,在滚动事件中判断图像是否在可视区域内;
  4. 如果图像进入了可视区域,将src替换为data-src的值,触发图像的加载。

下面是一个简单的示例代码:

<img class="lazy" src="placeholder.jpg" data-src="real-image.jpg" alt="Lazy loaded image">
window.addEventListener('scroll', function() {
  const lazyImages = document.querySelectorAll('.lazy');
  
  lazyImages.forEach(function(image) {
    if (image.getBoundingClientRect().top < window.innerHeight) {
      image.src = image.dataset.src;
      image.classList.remove('lazy');
    }
  });
});

在上面的示例代码中,我们使用getBoundingClientRect()方法来获取图像的位置信息,innerHeight属性获取窗口的可视高度。如果图像的顶部坐标小于窗口的可视高度,说明图像已经进入了可视区域,可以加载图像了。

改进懒加载

上面的示例代码只是一个简单的懒加载实现,然而在实际应用中,我们还可以进行一些改进来提升用户体验和性能。

预加载可视区域外的图像

除了仅加载可视区域内的图像,我们还可以预加载可视区域附近的图像。当用户滚动到这些图像时,它们能够更快地加载出来,提供更流畅的体验。

例如,我们可以在图像上方多加载一段距离的图像,代码如下:

// 预加载距离可视区域更远的图像
if (image.getBoundingClientRect().top < window.innerHeight * 1.5) {
  // 加载图像
}

懒加载背景图

除了对<img>元素进行懒加载,我们还可以对背景图进行懒加载。背景图可以通过CSS的background-image属性指定。通过改变元素的background-image属性值,我们可以实现背景图的懒加载。

<div class="lazy-bg" data-bg="background-image.jpg"></div>
window.addEventListener('scroll', function() {
  const lazyBgs = document.querySelectorAll('.lazy-bg');
  
  lazyBgs.forEach(function(bg) {
    if (bg.getBoundingClientRect().top < window.innerHeight) {
      bg.style.backgroundImage = `url(${bg.dataset.bg})`;
      bg.classList.remove('lazy-bg');
    }
  });
});

引入视口库

上述示例代码虽然能满足基本的懒加载需求,但在实际项目中,我们可能希望能够更方便地使用懒加载。可以使用一些现成的视口库,比如Intersection Observer,来简化懒加载的实现。

这些库提供了丰富的懒加载选项,并能够自动处理页面滚动事件和元素位置的监听。使用这些库能够减少我们的编码工作量,并且更加可靠和高效。

总结

懒加载是一种优化网页加载速度和性能的有效方法。通过在页面滚动时动态加载图像,能够减少初始页面的加载时间,并提升用户体验。

我们可以用简单的方法来实现基本的懒加载,也可以使用现成的视口库来提供更多的功能和可靠性。

在实际应用中,我们应该合理使用懒加载技术,权衡页面性能和用户体验,以达到最佳的效果。


全部评论: 0

    我有话说: