实现图片懒加载

456 阅读1分钟

图片懒加载就是当页面需要展示较多图片时, 首先只加载显示在当前屏幕位置的图片, 在页面向下滚动时, 再加载其他需要显示在当前屏幕位置的图片, 这样可以防止一次性对服务器发送大量请求, 并可以在用户不需要完整浏览页面的情况下减少服务器资源消耗

实例

<!DOCTYPE html>
<html>
<head>
  <title>图片懒加载</title>
  <style type="text/css">
    .imgUnitContainer {
      height: 300px;						/* 固定一个高度 */
      width: 500px;							/* 固定一个宽度 */
      overflow: hidden;					/* 图片超出容器则隐藏 */
      border: 1px solid #eee;		/* 边框 */
      margin: 10px;							/* 外边框 */
      display: flex;						/* 弹性布局 */
      align-items: center;			/* 垂直居中 */
      justify-content: center;	/* 水平居中 */
    }
  </style>
</head>

<body>
  <div id="container"></div>		/* 图片容器 */
</body>

<script type="text/javascript">
  let imgNodeList = [];					// 所有懒加载图片的引用 
  (function () {
    let imgUrlArr = [						// 所有需要加载的图片链接
      "imgUrl",
      "imgUrl",
      "imgUrl",
      "imgUrl",
      "imgUrl",
      "imgUrl",
      "imgUrl",
      "imgUrl",
      "imgUrl",
    ];
    let innerContainer = document.createElement("div");		// 最小化操作DOM, 全部图片首先加载到此节点, 最后一并挂载到图片容器
    imgUrlArr.forEach(v => {		// 遍历图片的引用
      let imgUnitContainer = document.createElement("div");		// 图片外层div, 主要为统一图片尺寸
      imgUnitContainer.className = "imgUnitContainer";				// 设置class
      let img = new Image();			// new一个img节点
      img.src = "https://cdn.jsdelivr.net/gh/sentsin/layui@15d7241/dist/css/modules/layer/default/loading-2.gif"													// 显示loading
      img.setAttribute("data-src", v);				// 存储真实需要加载的url
      img.setAttribute("loaded", "no");				// 存储图片是否加载完成
      imgNodeList.push(img);			// 将节点引用加入数组
      imgUnitContainer.appendChild(img);			// 将img加入外层div
      innerContainer.appendChild(imgUnitContainer);						// 将外层div加入内部容器
    })
    document.getElementById("container").appendChild(innerContainer);
})();

  const lazylod = () => {
    let height = window.innerHeightl					// 可视区域高度
    let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;					// 滚动区域高度
    imgNodeList.forEach(v = > {								// 遍历			
      if (v.getAttribute("loaded") === "yes") return;					// 如果已经加载完成, 便不再重复加载
      if (height + scrollTop) > v.offsetTop {
        v.setAttribute("loaded", "yes");			// 首先设置已加载避免重复
        let tmp = new Image();								// new一个缓存img节点, 主要是为了实现隐式加载
        tmp.src = v.getAttribute("data-src");	// 设置缓存节点的src使其开始加载
        tmp.onload = () => {									// 缓存img加载完成
          v.src = v.getAttribute("data-src");	// 缓存img加载完成后将真实url赋值文档显示的图片节点, 浏览器会直接读取缓存
        }
      }
    })
  } 
  
  window.sroll = () => {
    lazyload();
  }
  window.onload = () => {
    lazyload();
  } 
</script>
</html>