懒加载

作者: Rising_suns | 来源:发表于2017-05-26 15:00 被阅读0次

    1.如何判断一个元素是否出现在窗口可视范围(浏览器的上边缘和下边缘之间,肉眼可视)。写一个函数 isVisible实现。

    function isVisible($node){ var windowHeight=$(window).height(); var scrollTop=$(window).scrollTop(); var nodeOffsetTop=$node.offset().top(); var nodeHeight=$node.outerHeight(); if((windowHeight+scrollTop)>nodeOffsetTop && scrollTop<(nodeOffsetTop+nodeHeight)){ return true; }else{ return false; } }

    2.当窗口滚动时,判断一个元素是不是出现在窗口可视范围。每次出现都在控制台打印 true 。用代码实现。

    $(window).on("scroll",function(){ if(isVisible($("#btn"))){ console.log(true); } }) function isVisible($node){ var windowHeight=$(window).height(); var scrollTop=$(window).scrollTop(); var nodeOffsetTop=$node.offset().top(); var nodeHeight=$node.outerHeight(); if((windowHeight+scrollTop)>nodeOffsetTop && scrollTop<(nodeOffsetTop+nodeHeight)){ return true; }else{ return false; } }

    3.当窗口滚动时,判断一个元素是不是出现在窗口可视范围。在元素第一次出现时在控制台打印 true,以后再次出现不做任何处理。用代码实现。

    //设置标志位:第一次出现过则改变状态 var isShowed=false; $(window).on("scroll",function(){ if(isVisible($("#btn")) && !isShowed){ console.log(true); isShowed=true; } })

    function isVisible($node){ var windowHeight=$(window).height(); var scrollTop=$(window).scrollTop(); var nodeOffsetTop=$node.offset().top(); var nodeHeight=$node.outerHeight(); if((windowHeight+scrollTop)>nodeOffsetTop && scrollTop<(nodeOffsetTop+nodeHeight)){ return true; }else{ return false; } }

    4.图片懒加载的原理是什么?

    一、原理

    1. 在浏览器滚动的时候,遍历所有图片,若图片在视窗可视区域,则加载该图片

    2. 将图片地址存放在自定义属性中(data-src),需要加载图片再从中取出来

    3. 判断图片可见:

    • 图片上部分进入可视窗体
      windowHeight + scrollTop > offsetTop
    • 图片下部分进入可视窗体
      offsetTop + nodeHeight > scrollTop

    二、如何实现

    1. 需要用到4个高度
      let windowHeight = $(window).height(), //视窗高度
      scrollTop = $(window).scrollTop(), //滚动条滚动距离
      offsetTop = $node.offset().top() //图片相对于文档的垂直坐标
      nodeHeight = $node.outerHeight(); //图片高度

    2. 判断图片可见

      if ( (windowHeight + scrollTop) > offsetTop && (offsetTop + 
      nodeHeight ) > scrollTop) {
           return true;
      } else {
          return false;
      }
      
    3. 方法:是否显示该图片

      const isShow = ($node) => {
          let windowHeight = $(window).height(),
          scrollTop = $(window).scrollTop(),
          offsetTop = $node.offset().top();
          nodeHeight = $node.outerHeight();
          if (windowHeight + scrollTop > offsetTop && offsetTop + 
          nodeHeight > scrollTop) {
              return true;
          } else {
             return false;
          }
      }
      
    4. 方法:遍历所有图片,加载没有load类名且isShow返回true的图片(加载前给图片加类名load)

      const loadImgs = ()=>{
         console.log('1');
         $('.wrapper img').not('.load').each(function(index){
             console.log('2');
             let $node = $(this);
             if(isShow($node)){
             $node.addClass('load');
             $node.attr('src',$node.attr('data-src'));
             }
         });
       }
      
    5. 最后,监听屏幕滚动事件,并在一开始进入界面时加载图片
      loadImgs();
      $(window).scroll(function () {
      loadImgs();
      })

    5.实现视频中的图片懒加载效果

    代码
    展示

    6.实现视频中的新闻懒加载效果

    代码

    相关文章

      网友评论

          本文标题:懒加载

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