图片懒加载底层原理

46 阅读3分钟

图片懒加载的底层原理主要基于浏览器渲染机制和网络状况。

首先,浏览器的渲染机制会按照DOM树的构建、样式计算、布局、分层、绘制、分块和光栅化等步骤进行。当页面发生上滑时,可视区域的图片就会发生改变。

其次,由于浏览器的渲染机制,当页面加载大量图片时,会占用大量的时间和资源,导致页面加载速度变慢,用户体验变差。因此,图片懒加载应运而生。

图片懒加载的原理是在图片进入可视区域之前,先通过自定义属性字段将图片地址保存起来,然后在图片进入可视区域时,将保存的图片地址加载出来,从而实现了图片的延迟加载。

具体实现方式可以通过img标签的src属性和lazyload属性来实现。其中,src属性用于保存图片地址,lazyload属性用于指示图片是否需要懒加载。当lazyload属性为true时,表示图片需要进行懒加载。当图片进入可视区域时,可以通过JavaScript代码将lazyload属性的值设置为false,从而将图片加载出来。

此外,图片懒加载还可以根据网络状况来动态调整图片的加载策略。例如,当网络状况较好时,可以一次性加载较多的图片;当网络状况较差时,可以只加载当前可视区域内的图片,其他图片在需要时再加载。这样可以有效减少网络资源的浪费,提高页面加载速度和用户体验。

1.这是一个基于您提供的信息的简单的图片懒加载的实现。这个示例使用了 jQuery,并假设了图片都有一个 data-original 属性,它包含图片的真实 URL。

$(document).ready(function() {  
  // 将图片的 src 属性设为空字符串,真实路径设置在 data-original 属性中  
  $('img.lazy').each(function() {  
    var $this = $(this);  
    $this.attr('src', '');  
    $this.attr('data-original', $this.attr('src'));  
  });  
  
  // 监听 scroll 事件  
  $(window).on('scroll', function() {  
    // 遍历所有懒加载的图片  
    $('img.lazy').each(function() {  
      var $this = $(this);  
      // 判断图片是否在可视区域内  
      if ($this.get(0).getBoundingClientRect().top <= $(window).height()) {  
        // 如果在可视区域内,将图片的 src 属性设置为 data-original 的值  
        $this.attr('src', $this.attr('data-original'));  
      }  
    });  
  });  
});

注意:这只是一个基础的实现,没有考虑错误处理、预加载以及更复杂的滚动策略。在实际应用中,可能需要使用更复杂的库或插件,如 imagesLoaded、lozad.js 等。

首先将页面上的图片的 src 属性设为空字符串,而图片的真实路径则设置在 data-original 属性中,当页面滚动的时候需要去监听 scroll 事件,在 scroll 事件的回调中,判断我们的懒加载的图片是否进入可视区域,如果图片在可视区内则将图片的 src 属性设置为 data-original 的值,这样就可以实现延迟加载。

2.以下是一个简单的例子,使用了 JavaScript 和 HTML 来实现图片懒加载:

HTML:

<img data-src="image1.jpg" class="lazy" />  
<img data-src="image2.jpg" class="lazy" />  
<img data-src="image3.jpg" class="lazy" />

在这个HTML代码中,我们为每个需要懒加载的图片设置了 data-src 属性,而不是常规的 src 属性。这是因为 data-src 可以存储图片的真实URL,而 src 属性如果直接设置,那么图片会立即加载。

JavaScript:

window.addEventListener('DOMContentLoaded', (event) => {  
    const lazyImages = [].slice.call(document.querySelectorAll("img.lazy"));  
    lazyImages.forEach((img) => {  
        img.addEventListener("load", function() {  
            // 在图片进入可视区域时加载图片  
            if (this.getBoundingClientRect().top <= window.innerHeight) {  
                this.src = this.dataset.src;  
            }  
        });  
    });  
});

在这个JavaScript代码中,我们首先获取所有带有 .lazy 类的图片元素,并为它们添加一个 load 事件监听器。当图片进入可视区域时,load 事件会被触发,然后通过 dataset.src 获取到图片的真实URL,并将其赋值给 src 属性,从而实现图片的加载。

这个例子是一个非常基础的图片懒加载实现方式,实际使用中可能需要更复杂的策略,比如考虑图片的优先级、预加载、错误处理等情况。