懒加载

作者: jrg_memo | 来源:发表于2017-01-30 23:28 被阅读25次

    解析

    懒加载,又称为延迟加载。
    在程序启动的时候先不加载,在程序运行的时候再去加载需要的资源。

    作用

    在访问数据量过大时,减少并发量,降低系统资源的消耗,节省内存空间;
    优化网站性能,提高用户体验。

    原理

    图片懒加载:
    h 将所有img标签的src指向同一张图,当页面加载时作为占位图存在;
    h 自定义属性data-src,用来存储真实的图片链接;
    0 给window绑定scroll事件
    1 判断图片是否出现在可视区域即需要加载此资源;
    2 把src的值替换为data-src开始加载图片并显示;
    3 添加arrt或class为loaded防止重复加载

    新闻懒加载:
    0 给window绑定scroll事件;
    1 判断新闻是否出现在可视区域;
    2 用ajax获得后台news数据;
    3 把数据填充在html标签里,放在页面上;

    核心

    可视区域 scrollTop、offsetTop......
    由于 :
    窗口高度 + 垂直滚动距离 = 元素垂直方向距离
    所以 :
    窗口高度 + 垂直滚动距离 > 元素垂直方向距离 元素开始出现
    垂直滚动距离 > 元素垂直方向距离 元素开始消失
    垂直滚动距离 > 元素垂直方向距离 + 元素自身高度 元素消失完毕

    ------------------------------------判断可视区域
    function isVisible($node) {
      var windowHeight = $(window).height(),       //窗口高度          
          scrollTop = $(window).scrollTop()     //垂直滚动距离  
          offsetTop = $node.offset().top,  //此元素垂直方向距离
          nodeHeight = $node.outerHeight(true); //元素自身高度
    
     if (windowHeight + scrollTop > offsetTop  &&  offsetTop + nodeHeight  > scrollTop){
             return true }
       return false
     }
    
    
    ------------------------------------每当元素出现在窗口,控制台输出true
    $(window).on('scroll',function result(){
            if( isVisible($node) ){
                console.log(true);
            }
    })
    
    
    ------------------------------------仅当元素第一次出现在窗口,控制台输出true
    $(window).on('scroll',result);
    function result(){
            if($node.not('.show').length === 1 && isVisible($node)){
                console.log(true);
                $node.addClass('.show');
            }
            else if(!isVisible($node)){
            }
        }
    

    应用

    demo-图片懒加载
    demo-新闻懒加载

    问题

    1 一开始是空白?
    首先检查是否在可视范围,进行加载

    2 鼠标滚动,连续多次触发事件?
    添加状态锁,本次加载完成前不触发事件

    3 数据获取一直进行,无法结束?
    添加数据锁,检测到没有新数据,不加载并退出

    相关文章

      网友评论

          本文标题:懒加载

          本文链接:https://www.haomeiwen.com/subject/gitqittx.html