• 页面中的img元素,如果没有src属性,浏览器就不会发出请求去下载图片,只有通过javascript设置了图片路径,浏览器才会发送请求。
  • 加载图片的过程是异步的

一、懒加载

1、介绍

  • 懒加载也就是延迟加载。
  • 当访问一个页面的时候,先把所有img标签的src设为同一张空白图片的路径(占位图,只需请求一次),将其真正的图片地址存储在img标签的自定义属性中(比如data-src)
  • 两种加载情况:
    • 条件加载:符合某些条件,或触发了某些事件,才将自定义属性中的地址存储到src属性中,开始异步加载
    • 可视区加载:仅加载用户可以看到的区域。当js监听到该图片元素进入可视窗口时,将自定义属性中的地址存储到src属性中,开始异步加载。
#1、既然懒加载的原理是基于判断元素是否出现在窗口可视范围内,首先我们写一个函数判断元素是否出现在可视范围内:
function isVisible($node){
    var winH = $(window).height(),
        scrollTop = $(window).scrollTop(),
        offSetTop = $(window).offSet().top;
    if (offSetTop < winH + scrollTop) {
        return true;
    } else {
        return false;
    }
}

#2、再添加上浏览器的事件监听函数,让浏览器每次滚动就检查元素是否出现在窗口可视范围内:
$(window).on("scroll", function{
    if (isVisible($node)){
        console.log(true);
    }
})

#3、我们已经很接近了,现在我们要做的是,让元素只在第一次被检查到时打印true,之后就不再打印了
var hasShowed = false;
$(window).on("sroll",function{
    if (hasShowed) {
        return;
    } else {
        if (isVisible($node)) {
            hasShowed = !hasShowed;
            console.log(true);
        }
    }
})

实现代码:

  1 <!DOCTYPE html>
  2 <html>
  3 <head>
  4     <script src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.js
  5 "></script>
  6     <title>demo lazyload</title>
  7     <meta charset="utf-8">
  8     <style type="text/css">
  9         * {
 10             padding: 0;
 11             margin: 0;
 12             text-decoration: none;
 13             list-style: none;
 14         }
 15         .layout {
 16             margin: 0 auto;
 17             width: 1000px;
 18         }
 19         .lazyload img {
 20             width: 300px;
 21             height: 400px;
 22         }
 23         .img-ct {
 24             margin-left: -50px;
 25             overflow: auto;
 26         }
 27         .item {
 28             float: left;
 29             margin-left: 50px;
 30             margin-bottom: 30px;
 31         }
 32     </style>
 33 </head>
 34 <body>
 35 <div class="lazyload">
 36   <div class="layout">
 37     <ul class="img-ct">
 38         <li class="item">
 39             <a href="javascript:void(0)"><img data-img="img/Tsingtao.jpeg" src="img/blank.jpg"></a>
 40         </li>
 41         <li class="item">
 42             <a href="javascript:void(0)"><img data-img="img/Tsingtao.jpeg" src="img/blank.jpg"></a>
 43         </li>
 44         <li class="item">
 45             <a href="javascript:void(0)"><img data-img="img/Tsingtao.jpeg" src="img/blank.jpg"></a>
 46         </li>
 47         <li class="item">
 48             <a href="javascript:void(0)"><img data-img="img/Tsingtao.jpeg" src="img/blank.jpg"></a>
 49         </li>
 50         <li class="item">
 51             <a href="javascript:void(0)"><img data-img="img/Tsingtao.jpeg" src="img/blank.jpg"></a>
 52         </li>
 53         <li class="item">
 54             <a href="javascript:void(0)"><img data-img="img/Tsingtao.jpeg" src="img/blank.jpg"></a>
 55         </li>
 56         <li class="item">
 57             <a href="javascript:void(0)"><img data-img="img/Tsingtao.jpeg" src="img/blank.jpg"></a>
 58         </li>
 59         <li class="item">
 60             <a href="javascript:void(0)"><img data-img="img/Tsingtao.jpeg" src="img/blank.jpg"></a>
 61         </li>
 62         <li class="item">
 63             <a href="javascript:void(0)"><img data-img="img/Tsingtao.jpeg" src="img/blank.jpg"></a>
 64         </li>
 65         <li class="item">
 66             <a href="javascript:void(0)"><img data-img="img/Tsingtao.jpeg" src="img/blank.jpg"></a>
 67         </li>
 68         <li class="item">
 69             <a href="javascript:void(0)"><img data-img="img/Tsingtao.jpeg" src="img/blank.jpg"></a>
 70         </li>
 71         <li class="item">
 72             <a href="javascript:void(0)"><img data-img="img/Tsingtao.jpeg" src="img/blank.jpg"></a>
 73         </li>
 74         <li class="item">
 75             <a href="javascript:void(0)"><img data-img="img/Tsingtao.jpeg" src="img/blank.jpg"></a>
 76         </li>
 77         <li class="item">
 78             <a href="javascript:void(0)"><img data-img="img/Tsingtao.jpeg" src="img/blank.jpg"></a>
 79         </li>
 80     </ul>
 81   </div>
 82 </div>
 83 
 84 
 85 <script type="text/javascript">
 86 var lazyLoad = (function(){
 87     var clock;
 88     
 89     function init(){
 90         $(window).on("scroll", function(){
 91             if (clock) {
 92                 clearTimeout(clock);
 93             }
 94             clock = setTimeout(function(){
 95                 checkShow();
 96             }, 200);
 97         })
 98         checkShow();
 99     }
100     
101     function checkShow(){
102         $(".lazyload img").each(function(){
103             var $cur =$(this);
104             if($cur.attr('isLoaded')){
105                 return;
106               }
107             if(shouldShow($cur)){
108                 showImg($cur);
109             }
110         })
111     }
112     function shouldShow($node){
113         var scrollH = $(window).scrollTop(),
114             winH = $(window).height(),
115             top = $node.offset().top;
116         if(top < winH + scrollH){
117               return true;
118           }else{
119               return false;
120           }
121     }
122     function showImg($node){
123         $node.attr('src', $node.attr('data-img'));
124         $node.attr('isLoaded', true);
125     }
126     return {
127         init: init
128     }
129 })()
130 lazyLoad.init();
131 </script>
132 </body>
133 </html>
View Code

相关文章:

  • 2021-12-10
  • 2022-01-15
  • 2021-09-16
  • 2021-09-29
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2018-09-28
相关资源
相似解决方案