页面性能优化-原生JS实现图片懒加载

什么是图片懒加载。

图片可以一次性加载,但是考虑到用户浏览到一半就不加载剩下的图片了,这样会大大增加服务器的压力,页面加载也会较慢,对于用户体样不是很好,所以当用户滚动到出现图片的位置时再加载图片,那就大大减少了请求的资源的浪费。

图片懒加载的好处。

  1. 可以加快页面首屏渲染的速度;
  2. 节约用户的流量。

实现的思路。

  1. 用img属性data-src来存图片的真正地址。
  2. 当滚动页面时,检查所有的img标签,判断是否出现在事业中,如果出现在视野中,继续进行判断,看是否被加载过了,如果没有加载,那就进行加载。

关键知识。

  1. 判断是否出现在视野中的两种个条件:offsetTop > scrollTop, offsetTop < (windowHeight + scrollTop);

代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>原生js实现图片懒加载</title>
  <style>
    *{
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    ul{
      overflow: hidden;
      list-style: none;
    }
    li{
      float: left;
      width: 50%;
      height: 200px;
      padding: 10px;
    }
    li img{
      display: inline-block;
      width: 100%;
      height: 100%;
    }
  </style>
</head>
<body>
<div class="container">
  <ul>
    <li><img src="http://cdn.jirengu.com/book.jirengu.com/img/1.jpg" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/1.jpg"></li>
    <li><img src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/2.jpg"></li>
    <li><img src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/3.jpg"></li>
    <li><img src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/4.jpg"></li>
    <li><img src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/5.jpg"></li>
    <li><img src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/6.jpg"></li>
    <li><img src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/7.jpg"></li>
    <li><img src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/8.jpg"></li>
    <li><img src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/9.jpg"></li>
    <li><img src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/10.jpg"></li>
    <li><img src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/11.jpg"></li>
    <li><img src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/12.jpg"></li>
    <li><img src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/13.jpg"></li>
    <li><img src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/14.jpg"></li>
    <li><img src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/15.jpg"></li>
    <li><img src="" alt="" data-src="http://cdn.jirengu.com/book.jirengu.com/img/16.jpg"></li>
  </ul>
</div>
<script>
  // window绑定滚动事件
  window.addEventListener('scroll',function(){
    // 遍历所有的img标签
    Array.prototype.slice.apply(document.getElementsByTagName('li')).forEach((li)=>{
      let img=li.getElementsByTagName('img')[0];
      // 判断当前img是否出现在了视野中
      // 判断当前img是否被加载过了
      if(checkShow(img) && !isLoaded(img)){
        loadImg(img);
      }
    })
  });

  // 判断img是否出现浏览器视野中
  function checkShow(img) {
    let scrollTop=document.documentElement.scrollTop; // 页面向上滚动的高度
    let windowHeight=window.innerHeight; //浏览器自身高度
    let offsetTop=img.offsetTop; //目标标签相对于document的高度
    return (offsetTop > scrollTop && offsetTop <(windowHeight + scrollTop));
  }

  // 判断是否已经加载过
  function isLoaded(img) {
    return img.getAttribute('src')===img.getAttribute('data-src');
  }

  // 加载图片
  function loadImg(img) {
   img.setAttribute('src',img.getAttribute('data-src'));
  }
</script>
</body>
</html>

问题分析。

  1. 这样会出现不滚动出现的图片就不会加载。

解决方法
把加载方法封装。页面一进来就执行方法。

window.addEventListener('scroll',function(){
  lazyLoading()
}
function lazyLoading(){
  Array.prototype.slice.apply(document.getElementsByTagName('li')).forEach((li)=>{
      let img=li.getElementsByTagName('img')[0];
      // 判断当前img是否出现在了视野中
      // 判断当前img是否被加载过了
      if(checkShow(img) && !isLoaded(img)){
        loadImg(img);
      }
    })
}
lazyLoading();

  1. 加载滚动平凡就会不停的执行加载方法。

方法一:用setTimeout来延时加载。

window.addEventListener('scroll',function(){
  if(timer){
      clearTimeout(timer)
    }
    timer=setTimeout(()=>{
      lazyLoading()
    },300);
}

方法二:scroll防抖

window.addEventListener('scroll',_delay,false)
posted @ 2020-11-10 17:14  年轻程序员博客  阅读(193)  评论(0)    收藏  举报