图片的懒加载和预加载

33 阅读1分钟

图片预加载

当我们如果要加载一张比较大的图片,他要从上到下一点一点加载,这样展示效果不好,为了解决这个问题,我们可以 先new一个image对象,并设置这个对象的 src 属性,来提前加载图片。(因为浏览器会检测到 src 属性的改变,并且开始向服务器发送请求来获取图片数据。)

let img = new Image();
img.onload = function() {
    document.getElementById("myImage").src = img.src;
};
img.src = 'path/to/your/image.jpg'; // 先加载图片

图片懒加载

原理:通常使用IntersectionObserver,通过监听目标元素和视口之间的交集,来判断该元素是否进入视口或者离开视口。当被观察的元素与根元素的交集发生变化时,回调函数会被触发。

  • observer.observe(DOM节点)可以进行观察DOM节点。
  • observer.unobserve(DOM节点)可以取消观察

但是观察一次就行了,不需要一直观察,所以图片渲染完成之后就可以取消观察了

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <p>lllllllllll</p>
  <p>lllllllllll</p>
  <p>lllllllllll</p>
  <p>lllllllllll</p>
  <p>lllllllllll</p>
  <p>lllllllllll</p>
  <p>lllllllllll</p>
  <p>lllllllllll</p>
  <p>lllllllllll</p>
  <p>lllllllllll</p>
  <!-- 浏览器在碰到data-*这个属性是不会像默认属性那样进行属性处理的,所以我们在这里把src改为data-src之后 他就会变得不知道从哪里下载图片了 -->
  <img data-src="../image/Snipaste_2025-02-27_19-22-25.png" alt="" srcset="">
  <img data-src="../image/1.png" alt="">
  <p>lllllllllll</p>
  <p>lllllllllll</p>
  <p>lllllllllll</p>
  <p>lllllllllll</p>
  <p>lllllllllll</p>
  <p>lllllllllll</p>
  <p>lllllllllll</p>
  <img data-src="../image/微信图片_20230904235201.jpg" alt="" srcset="">

  <script>    
    const images=document.querySelectorAll('img[data-src]')
    const callback=entries=>{
      entries.forEach(entry=>{
        if(entry.isIntersecting){
          const image=entry.target
          //获取自定义属性
          const data_src=image.getAttribute('data-src')
          // 将自定义属性赋值给src属性
          image.setAttribute('src',data_src)
          // 观察过之后就取消观察
          observer.unobserve(image)
          console.log('触发');
          
        }
      })
    }
    const observer=new IntersectionObserver(callback)//一个用于观察的实例
        // 在每次循环时使用observer实例的observe方法来观察每个img节点
     images.forEach(image=>{
      observer.observe(image)

    })
  </script>
</body>
</html>