码迷,mamicode.com
首页 > Web开发 > 详细

jquery实现的图片延时加载插件

时间:2015-08-13 01:02:49      阅读:321      评论:0      收藏:0      [点我收藏+]

标签:

jquery实现的图片延时加载插件:

在很多网站尤其是图片站,都采用了图片延时加载效果,这样可以有效的减轻服务器的压力,有点自然不言而喻了,下面就和大家分享一个图片延时加载的插件,希望能够给大家带来一定的帮助。

代码如下:

<script type="text/javascript"> 
(function( $ ){ 
  $.fn.imglazyload=function( options )
  { 
    var o=$.extend({ 
      attr:‘lazy-src‘, 
      container:window, 
      event:‘scroll‘, 
      fadeIn:false, 
      threshold:0, 
      vertical:true 
    },options ), 
    event=o.event, 
    vertical=o.vertical, 
    container=$(o.container), 
    threshold=o.threshold, 
    //将jQuery对象转换成DOM数组便于操作 
    elems=$.makeArray($(this) ), 
    dataName=‘imglazyload_offset‘, 
    OFFSET=vertical? ‘top‘ : ‘left‘, 
    SCROLL=vertical?‘scrollTop‘:‘scrollLeft‘, 
    winSize=vertical?container.height():container.width(), 
    scrollCoord=container[SCROLL](), 
    docSize=winSize+scrollCoord; 
    // 延迟加载的触发器 
    var trigger={ 
      init:function(coord){ 
        return coord>=scrollCoord&&coord<=( docSize + threshold ); 
      }, 
      scroll:function(coord){ 
        var scrollCoord=container[SCROLL](); 
        return coord>=scrollCoord&&coord<=( winSize+scrollCoord+threshold); 
      }, 
      resize:function( coord ){ 
        var scrollCoord=container[ SCROLL ](), 
        winSize=vertical? 
        container.height(): 
        container.width(); 
        return coord>=scrollCoord&&coord<=(winSize+scrollCoord+threshold); 
      } 
    }; 
    var loader=function(triggerElem,event ){ 
      var i=0, 
      isCustom=false, 
      isTrigger,coord,elem,$elem,lazySrc; 
      // 自定义事件只要触发即可,无需再判断 
      if( event )
      { 
        if(event!==‘scroll‘&&event!==‘resize‘ )
        { 
          isCustom = true; 
        } 
      } 
      else
      { 
        event = ‘init‘; 
      } 
      for( ; i < elems.length; i++ )
      { 
        isTrigger = false; 
        elem = elems[i]; 
        $elem = $( elem ); 
        lazySrc = $elem.attr( o.attr ); 
        if( !lazySrc || elem.src === lazySrc )
        { 
          continue; 
        } 
        //先从缓存获取offset值,缓存中没有才获取计算值, 
        //将计算值缓存,避免重复获取引起的reflow 
        coord = $elem.data( dataName ); 
        if(coord===undefined )
        { 
          coord=$elem.offset()[ OFFSET ]; 
          $elem.data( dataName, coord ); 
        } 
        isTrigger = isCustom || trigger[ event ]( coord ); 
        if(isTrigger)
        { 
          // 加载图片 
          elem.src = lazySrc; 
          if( o.fadeIn )
          { 
            $elem.hide().fadeIn(); 
          } 
          // 移除缓存 
          $elem.removeData( dataName ); 
          // 从DOM数组中移除该DOM 
          elems.splice( i--, 1 ); 
        } 
      } 
      // 所有的图片加载完后卸载触发事件 
      if( !elems.length )
      { 
        if( triggerElem )
        { 
          triggerElem.unbind( event, fire ); 
        } 
        else
        { 
          container.unbind( o.event, fire ); 
        } 
        $( window ).unbind( ‘resize‘, fire ); 
        elems = null; 
      } 
    }; 
    var fire = function( e ){ 
      loader( $(this), e.type ); 
    }; 
    // 绑定事件 
    container = event === ‘scroll‘ ? container : $( this ); 
    container.bind( event, fire ); 
    $( window ).bind( ‘resize‘, fire ); 
    // 初始化 
    loader(); 
    return this; 
  }; 
})( jQuery ); 
</script>

实现原理:

需要先将图片的真实地址保存在一个自定义的属性中(属性名任你发挥吧,这里我用的是lazy-src),而图片的src属性中用一个占位图片来替代,这个占位图片当然是越小越好,因为它不会有显示在页面中。

<img src="images/placeholder.png" lazy-src="images/realimg.jpg" alt="" />

首先,页面开始加载时浏览器会获取所有图片在当前页面中的位置并缓存(获取offset的值时,页面的reflow会被引发),计算出可视区域,当图片的位置出现在可视区域中,利用js动态地将图片标签中的src值替换成图片真实的地址,这时,刚刚出现在可视区域的图片便开始加载。 

其次。当用户向下滚动页面时,通过js再次计算是否有图片初次出现可视区域内,如果有,刚对这些图片的src值进行替换,并开始加载真实图片。为了避免重复操作引起的内存泄漏,需要在全部图片加载完后,卸载掉相应的触发事件。 

最后。本文是将整个窗口看成是一个大容器,如果愿意,也可以在页面中设置一个小容器,在小容器中也同样可以实现图片的延迟加载。原理虽然简单,但是应用是多样的。 

原文地址是:http://www.51texiao.cn/jqueryjiaocheng/2015/0613/4219.html

最为原始地址是:http://www.softwhy.com/forum.php?mod=viewthread&tid=8672

jquery实现的图片延时加载插件

标签:

原文地址:http://www.cnblogs.com/xiaofinder/p/4725924.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!