【性能优化】图片懒加载-js手写(20行代码)

285 阅读1分钟

前言:页面初始化图片资源过多,导致访问页面时加载卡顿,不流畅,影响用户体验。

原理:

通过判断每个图片是否在可视区域内,绑定页面滚动事件,满足则加载图片。

图片在可视区域内:图片距离顶部的高度<可视区域高度+滚动条滚动的高度

image.png

  // 懒加载原理
    let num = document.getElementsByTagName('img').length;
    let img = document.getElementsByTagName('img');
    let n = 0;

    lazyload()//初始化
    window.onscroll = lazyload;//绑定滚动事件

    function lazyload() {
      let seeHeight = document.documentElement.clientHeight;//可视区域高度
      let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;//滚动条滚动的距离
      for (let i = 0; i < num; i++) {
        if (img[i].offsetTop < seeHeight + scrollTop) {//图片进入可视区域内
          if (img[i].getAttribute("src") == "C:/Users/jc/Desktop/loading.gif") {//存在则重新赋值
            // 加载正确图片路径
            img[i].src = img[i].getAttribute("data-img")
          }
          n = i + 1;//防止重复加载
        }
      }
    }
//完整代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<style>
  img {
    display: block;
    margin: 160px auto;
  }
</style>

<body>
  <img src="C:/Users/jc/Desktop/loading.gif" data-img="img/brand01.png">
  <img src="C:/Users/jc/Desktop/loading.gif" data-img="img/brand02.png">
  <img src="C:/Users/jc/Desktop/loading.gif" data-img="img/brand03.png">
  <img src="C:/Users/jc/Desktop/loading.gif" data-img="img/brand04.png">
  <img src="C:/Users/jc/Desktop/loading.gif" data-img="img/brand05.png">
  <img src="C:/Users/jc/Desktop/loading.gif" data-img="img/brand06.png">
  <img src="C:/Users/jc/Desktop/loading.gif" data-img="img/brand07.png">
  <img src="C:/Users/jc/Desktop/loading.gif" data-img="img/brand08.png">
  <img src="C:/Users/jc/Desktop/loading.gif" data-img="img/brand09.png">
  <script>
    // 懒加载原理
    let num = document.getElementsByTagName('img').length;
    let img = document.getElementsByTagName('img');
    let n = 0;

    lazyload()//初始化
    window.onscroll = lazyload;//绑定滚动事件

    function lazyload() {
      let seeHeight = document.documentElement.clientHeight;//可视区域高度
      let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;//滚动条滚动的距离
      for (let i = 0; i < num; i++) {
        if (img[i].offsetTop < seeHeight + scrollTop) {//图片进入可视区域内
          if (img[i].getAttribute("src") == "C:/Users/jc/Desktop/loading.gif") {//存在则重新赋值
            // 加载正确图片路径
            img[i].src = img[i].getAttribute("data-img")
          }
          n = i + 1;//防止重复加载
        }
      }
    }
  </script>
</body>

</html>