javascript图片懒加载

1.啥是图片懒加载 也就是 图片在浏览器可以看到的范围内 把图片加载出来

2.为啥要懒加载 因为要减少请求加载 优化速度

3.首先 我们要forEach循环所有图片  把所有图片加载一遍  
lazyRender()
function lazyRender() { $('.cover img').each(function () { 4.在循环里面进行一系列判断 if (checkShow($(this)) && !isLoaded($(this))) { loadImg($(this)); } }) }
5.我使用了两个方法来进行判断是否让他显示加载出的图片
checkShow($(this)  和  !isLoaded($(this))
6.第一个方法  根据浏览器的自身高度  和  当前位置距离浏览器的高度  以及 每个图片距离浏览器顶部的高度

function checkShow($img) { // 传入一个img的jq对象 
        var scrollTop = $(window).scrollTop(); //页面向上滚动的距离 
        var windowHeight = $(window).height(); // 浏览器自身高度
        var offsetTop = $img.offset().top;  //每张图片距离头部的距离
           if(offsetTop < (scrollTop + windowHeight) && offsetTop > scrollTop) { 
                 //在2个临界状态之间的就为出现在视野中的 
              return true;
        }
        return false;
}    
8.第二个方法 也就是判断这张图片是否加载过  目的 减少不必要的重复覆盖
function isLoaded($img) {
    return $img.attr('data-src') === $img.attr('src');
    //如果data-src和src相等那么就是已经加载过了 
}
这个方法加上个  非 也就是如果加载过是为真 那么就返回假   如果没加载过是为假 就返回真
9.怎么实时判断呢  就用 页面滚动触发函数中写

 

var clock;    //这里的clock为timeID, 返回一个 ID(数字),
 $('window').on('scroll',function(){  //只要在300毫秒内触发滚动事件,都会被clearTimeout掉,setTimeout不会执行。
 //只要在300毫秒内触发滚动事件,都会被clearTimeout掉,setTimeout不会执行。
  
  //如果有300毫秒外的操作,会得到一个新的timeID即clock,会执行一次setTimeout,然后保存这次setTimeout的ID,
    
 //对于300毫秒内的scroll事件,不会生成新的timeID值,所以会一直被clearTimeout掉,不会执行setTimeout.

     if(clock){
       clearTimeout(clock) //取消定时器
     }
     //为了不在滚轮滚动过程中就一直判定,设置个setTimeout,等停止滚动后再去判定是否出现在视野中。
       clock = setTimeout(function(){
       lazyRender()  //进行判断方法
     },300)
})

  

 
 
 
posted @ 2019-08-22 14:21  明泽的博客  阅读(239)  评论(0)    收藏  举报