面试官:你还不会手搓一个懒加载???

761 阅读2分钟

什么是懒加载?

  • 懒加载(Lazy Loading),也称为延迟加载,是一种优化网页性能的技术。它的核心思想是延迟加载网页中的某些资源(如图像、视频、脚本等),直到需要使用这些资源的时候才进行加载。这样可以避免在页面初始加载时加载所有资源,从而减少页面的初始加载时间和数据流量,提高页面的加载速度和性能。
  • 总结的来说当我们并不需要某些资源在进入界面时就进行加载,比如说一个html界面存在大量的图片地址,我们只需要加载首先进入界面的那几张图片即可,并不需要,一次性将几百张几千张图片一起加载出来。这样的方式会大大提高页面性能。

视窗与页面滚动

image.png 首先让我们先看一张图,视窗指的是在页面中我们能够看到的窗口,称为视窗。

在我们使用滚动条往下面滚动时,由于视窗的高度是有限度的,所以随着往下滑动的过程前面的内容就会被隐藏掉。

我们可以通过webAPI分别算出视窗与滚动隐藏的具体值。

clientHeight

document.documentElement.clientHeight

document.documentElement表示得到网页的根元素html

document.documentElement.clientHeight表示得到了视窗的高度

scrollTop

let scrollTop = document.documentElement.scrollTop || document.body.scrollTop

由于不同浏览器的版本兼容问题,给出了两种计算滚动隐藏的具体值的方式

document.body.scrollTop、document.documentElement.scrollTop

滚动监听

window.addEventListener('scroll', ()=>{})

滚动条在滚动的时候持续触发的事件,用来监听整个页面滚动 或者某个元素滚动

自定义属性

<body>
  <div class="test" data-test="hello"></div>
  <script>
    const x = document.querySelector('.test')
    console.log(x.dataset.test);
  </script>
</body>

image.png

我们可以使用data-随意定义属于我们自己的属性,并通过.dataset方式得到写入的值。

完整代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    * {
      padding: 0;
      margin: 0;
    }

    img {
      width: 60%;
    }
  </style>
</head>

<body>
  <img data-src="https://tse2-mm.cn.bing.net/th/id/OIP-C.Ww3zLTOAXOUTYAoV3E5UOQHaKX?rs=1&pid=ImgDetMain">
  <img data-src="https://tse2-mm.cn.bing.net/th/id/OIP-C.Ww3zLTOAXOUTYAoV3E5UOQHaKX?rs=1&pid=ImgDetMain">
  <img data-src="https://tse2-mm.cn.bing.net/th/id/OIP-C.Ww3zLTOAXOUTYAoV3E5UOQHaKX?rs=1&pid=ImgDetMain">
  <img data-src="https://tse2-mm.cn.bing.net/th/id/OIP-C.Ww3zLTOAXOUTYAoV3E5UOQHaKX?rs=1&pid=ImgDetMain">
  <img data-src="https://tse2-mm.cn.bing.net/th/id/OIP-C.Ww3zLTOAXOUTYAoV3E5UOQHaKX?rs=1&pid=ImgDetMain">
  <img data-src="https://tse2-mm.cn.bing.net/th/id/OIP-C.Ww3zLTOAXOUTYAoV3E5UOQHaKX?rs=1&pid=ImgDetMain">
  <img data-src="https://tse2-mm.cn.bing.net/th/id/OIP-C.Ww3zLTOAXOUTYAoV3E5UOQHaKX?rs=1&pid=ImgDetMain">
  <img data-src="https://tse2-mm.cn.bing.net/th/id/OIP-C.Ww3zLTOAXOUTYAoV3E5UOQHaKX?rs=1&pid=ImgDetMain">
  <script>
    //获取imgs数组
    const imgs = document.querySelectorAll('img')

    //储存数组长度,优化性能
    const num = imgs.length

    //记录懒加载的图片数量,便于移除监听
    let n = 0

    //自定义具名函数laodImage,便于后续调用
    function laodImage() {
      //计算视窗的高度
      let screenHeight = document.documentElement.clientHeight

      //计算视窗头部的高度
      let scrollTop = document.documentElement.scrollTop || document.body.scrollTop

      //遍历数组对象,实现监听
      for (let i = 0; i < num; i++) {
        //将图片移动位置与(视窗+视窗上方)大小对比,若小于则满足懒加载的要求
        if (imgs[i].offsetTop < screenHeight + scrollTop) {

          //将自定义属性赋给src,实现图片的加载
          imgs[i].src = imgs[i].dataset.src

          //累加n,判断懒加载是否全部结束
          n = i + 1
          if (n === num) {
            //加载完毕
            window.removeEventListener('scroll', laodImage)
          }
        }
      }
    }
    laodImage()
    //调用scroll监听
    window.addEventListener('scroll', laodImage)
  </script>
</body>

</html>