原生js实现图片懒加载

2023-04-12 15:52:29 浏览数 (1)

目的:

  • 大量图片的网站,一次性加载所有图片会存在速度变慢,卡顿等问题。
  • 我们可以使用图片懒加载技术,只加载视口内的图片,其余图片用默认小图片 (由于所有图片都使用这一张小图片,只会发送一次请求,不会增加性能负担。) 或者骨架屏代替。
  • 等图片滚动到可视区后,再给图片url赋值。
  • 这样优化了前端加载速度,提高了性能

核心思路:

scrollTop 判断图片滚动的距离, innerHeight求当前视口高度,offsetTop得到图片相对于父元素的位置,然后scrollTop clientH - elementTop - 图片自身的高度 得到元素当前的位置。 如果 >=0 说明该元素在视口内,给元素的url赋值

代码实现:

代码语言:javascript复制
<!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>
  <style>
    *{
        margin: 0;
        padding: 0;
    }
    ul{
        list-style: none;
    }
    li{
        width: 100%;    
        height: 200px;
        text-align: center;
        line-height: 200px
    }
    img{
        display: block;
        height: 200px;
    }
    </style>
</head>
<body>
  
  <!-- <img data-url="真实图片地址" src="小图片地址"/> -->
  <img src="./images/1pxImg.png" data-url="./images/01.jpg">
  <img src="./images/1pxImg.png" data-url="./images/01.jpg">
  <img src="./images/1pxImg.png" data-url="./images/02.jpg">
  <img src="./images/1pxImg.png" data-url="./images/02.jpg">
  <img src="./images/1pxImg.png" data-url="./images/03.jpg">
  <img src="./images/1pxImg.png" data-url="./images/03.jpg">
  <img src="./images/1pxImg.png" data-url="./images/04.jpg">
  <img src="./images/1pxImg.png" data-url="./images/04.jpg">

  
  <script>
    let imgs = document.querySelectorAll('img')
    console.log(imgs);
    scrollFn()
    // 监听滚动事件
    window.onscroll = scrollFn
    function scrollFn() {
      let clientH = window.innerHeight // 可视区高度
      let scrollTop = document.documentElement.scrollTop // 滚动的高度
      console.log(clientH, scrollTop)
      Array.from(imgs).forEach(item => {
        let elementTop = item.offsetTop // 元素相对于父元素的位置
        // console.log('eleTop', elementTop)
        let count = scrollTop   clientH - elementTop - item.height // 元素的位置
        console.log('count',count)
        if(count >= 0) {
          // 如果大于等于0,说明在可视区内,给图片赋值
          item.setAttribute('src', item.getAttribute('data-url'))
        }
      })
    }
  </script>
</body>
</html>

0 人点赞