1.懒加载的作用和原理
      在我们展示多图片的场景下,类似淘宝或者百度图片,由于图片的数目过多,全部从服务器请求会给用户糟糕的用户体验,为了提升用户体验,我们这里使用懒加载,随着下拉逐步加载。
      每个图片的src会有一个get请求,我们把不能看到的图片src设置为相同的图片,这些图片发一次请求即可,设置属性data-src为真正的图片路径。当图片滚动到可视区,我们就用js把data-src 赋值给 src,简单的懒加载就可以实现了。
    2.简单的js实现懒加载

    1. <script type="text/javascript">
    2. let imgArr = document.querySelectorAll('img');
    3. let len = imgArr.length;
    4. window.onscroll = function () {
    5. let seeHeight = document.documentElement.clientHeight;
    6. let scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
    7. for(let i=0; i<len; i++){
    8. console.log(imgArr[i].offsetTop);
    9. if(imgArr[i].offsetTop < seeHeight + scrollTop){
    10. if(imgArr[i].getAttribute('src')=='timg.jpg'){
    11. imgArr[i].src = imgArr[i].getAttribute('data-src');
    12. }
    13. }
    14. }
    15. }
    16. </script>

    我们根据js代码分析一下,主要有两部分
    1>.如何加载图片?
       img.src = img.getAttribute(‘data-src’);
    2>.如何判断是否在可视区
        就是 图片的 offsetTop < scrollTop + clientHeigth 即可
      懒加载js实现和优化 - 图1


    好了上面就是我们简单的js实现和原理,但是看到各位大佬提到这里有需要优化的地方。
    1.在初始条件下,应该有图片显示,只要在加载完毕之后滚动之前执行图片的加载即可
    2.函数节流,但我们在高频度的滚动时,每隔一段事件开始图片的渲染。实现原理是 加入一个开关变量, 控制每隔固定的一段时间,函数才可能被触发

    1. <script type="text/javascript">
    2. let imgArr = document.querySelectorAll('img');
    3. let len = imgArr.length;
    4. let n = 0; //记录加载图片的位置,避免从第一张开始加载
    5. let canrun = true;
    6. let seeHeight = document.documentElement.clientHeight; // 窗口的可视高度
    7. lazyLoad();
    8. window.onscroll = function () {
    9. if(!canrun){
    10. return ;
    11. }
    12. canrun = false;
    13. setTimeout(function () {
    14. lazyLoad();
    15. canrun= true;
    16. },1000);
    17. }
    18. function lazyLoad() {
    19. // 每次触发函数时获取当前滚动条距离顶部的距离
    20. let scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
    21. for(let i=0; i<len; i++){
    22. // 当图片距离顶部的距离 小于 视口的高度加滚动条距离顶部的距离时(屏幕滚动到图片位置时)
    23. if(imgArr[i].offsetTop < seeHeight + scrollTop){
    24. if(imgArr[i].getAttribute('src')=='timg.jpg'){
    25. imgArr[i].src = imgArr[i].getAttribute('data-src');
    26. }
    27. n = i+1;
    28. }
    29. }
    30. }
    31. </script>