零JS实现图像的本地延迟加载

3,861 阅读1分钟

在过去的几十年里,网络已经发生了变化,今天的网站不仅仅是由文字和颜色组成,还包含了无数的媒体内容。首先也是最重要的图像。

// 零JS实现图像的本地延迟加载

<img src="/image.jpg" alt="前端指北" />

但是这和延迟加载有什么关系呢?

延迟加载是一种延迟在页面加载时加载非关键资源的技术。并且,这些非关键的资源是在需要的时候加载的。这意味着通过延迟加载,我们实现了得到以下效果:

  • 通过延迟加载,我们可以通过减少最初需要加载的图像数量来提高加载速度
  • 延迟加载的图像可能永远不需要加载,从而降低成本

如何实现

我们先来对比一下使用js的延迟加载方法和0js的加载方法

JavaScript方法

  • 事件监听器
<img data-src="/image.jpg" alt="前端指北" />
// 零JS实现图像的本地延迟加载

document.addEventListener("DOMContentLoaded"function() {
  var lazyloadImages = document.querySelectorAll("img.lazy");    
  var lazyloadThrottleTimeout;
  
  function lazyload () {
    if(lazyloadThrottleTimeout) {
      clearTimeout(lazyloadThrottleTimeout);
    }    
    
    lazyloadThrottleTimeout = setTimeout(function() {
        var scrollTop = window.pageYOffset;
        lazyloadImages.forEach(function(img) {
            if(img.offsetTop < (window.innerHeight + scrollTop)) {
              img.src = img.dataset.src;
              img.classList.remove('lazy');
            }
        });
        if(lazyloadImages.length == 0) { 
          document.removeEventListener("scroll", lazyload);
          window.removeEventListener("resize", lazyload);
          window.removeEventListener("orientationChange", lazyload);
        }
    }, 20);
  }
  
  document.addEventListener("scroll", lazyload);
  window.addEventListener("resize", lazyload);
  window.addEventListener("orientationChange", lazyload);
});

该技术在浏览器中使用滚动、调整大小和定位/更改事件上的事件监听器。如果触发了上面提到的事件之一,并且图像进入了viewport,那么 data-src 属性将被替换为 src 属性,以触发加载调用。

零JS代码

所谓的零JS代码就是:只需将 loading = “lazy”添加到img标签里,就可以了。


// 零JS实现图像的本地延迟加载

<img src="/path/to/your/image.jpg" loading="lazy" />

属性值:

  • auto (默认值)等于不包括属性
  • lazy 延迟加载
  • eager 立即加载

兼容性

不支持 loading 属性的浏览器只是简单地忽略它,没有任何副作用。