如何在用户滚动图像时仅加载图像

时间:2010-06-29 10:10:46

标签: jquery performance image scroll lazy-loading

许多网站似乎只下载图片或生成文档的一部分(例如用于评论),当用户向下滚动到页面足够远以实际看到它们时。

这显然可以为您提供更快的加载页面,并为任何不打算向下滚动的人节省带宽。

如何完成,理想情况下使用jquery?或者换一种方式,如何检测到丢失的图像刚刚滚动到视图中并需要获取?

2 个答案:

答案 0 :(得分:6)

这是我自己的。玩得开心。 (不需要jQuery!)

经过测试: IE 5.5 +,FF 2 +,Chrome,Opera 9.6 +

用法:

  1. 你的lazyloaded图片应该在thumb属性中有真正的src

  2. 只需在内联或外部包含javascript文件。

  3. 如果您不想在整个页面上使用它,可以执行以下操作:

     LazyImg().destroy(); // stop global fetching
     LazyImg("watch-only-this-div");
    

    注意:当您包含文件时,已创建全局实例,请注意整个文档。你需要先停止它并启动你自己的实例。

    1. 设置预取的自定义偏移量(应该在多大程度上取出图像)

       // watch the whole document
       // prefetch offset: 300px
       LazyImg(document, 300); 
      
  4. <强>代码:

    //
    //  LAZY Loading Images 
    //
    //  Handles lazy loading of images in one or more targeted divs, 
    //  or in the entire page. It also keeps track of scrolling and 
    //  resizing events, and removes itself if the work is done. 
    //
    //  Licensed under the terms of the MIT license.
    //
    //  (c) 2010 Balázs Galambosi
    //
    
    (function(){
    
    // glocal variables
    var window    = this, 
        instances = {},
        winH;
    
    // cross browser event handling
    function addEvent( el, type, fn ) {
      if ( window.addEventListener ) {
        el.addEventListener( type, fn, false );
      } else if ( window.attachEvent ) {
        el.attachEvent( "on" + type, fn );
      } else {
        var old = el["on" + type];
        el["on" + type] = function() { old(); fn(); };
      }
    }
    
    // cross browser event handling
    function removeEvent( el, type, fn ) {
      if ( window.removeEventListener ) {
        el.removeEventListener( type, fn, false );
      } else if ( window.attachEvent ) {
        el.detachEvent( "on" + type, fn );
      }
    }
    
    // cross browser window height
    function getWindowHeight() {
      if ( window.innerHeight ) {
        winH = window.innerHeight;
      } else if ( document.documentElement.clientHeight ) {
        winH = document.documentElement.clientHeight;
      } else if ( document.body && document.body.clientHeight ) {
        winH = document.body.clientHeight;
      } else {        // fallback:
        winH = 10000; // just load all the images
      }
      return winH;
    }
    
    // getBoundingClientRect alternative
    function findPos(obj) {
      var top  = 0;
      if (obj && obj.offsetParent) {
        do {
          top += obj.offsetTop || 0;
          top -= obj.scrollTop || 0;
        } while (obj = obj.offsetParent); // 
        return { "top" : top };
      }
    }
    
    // top position of an element
    var getTopPos = (function() {
      var dummy = document.createElement("div");
      if ( dummy.getBoundingClientRect ) {
        return function( el ) { 
          return el.$$top || el.getBoundingClientRect().top;
        };
      } else {
        return function( el ) { 
          return el.$$top || findPos( el ).top;
        };
      }
    })();
    
    // sorts images by their vertical positions
    function img_sort( a, b ) {
      return getTopPos( a ) - getTopPos( b );
    }
    
    // let's just provide some interface 
    // for the outside world
    var LazyImg = function( target, offset ) {
    
      var imgs,    // images array (ordered)
          last,    // last visible image (index)
          id,      // id of the target element
          self;    // this instance
    
      offset = offset || 200; // for prefetching
    
      if ( !target ) {
        target = document;
        id = "$document";
      } else if ( typeof target === "string" ) {
        id = target;
        target = document.getElementById( target );
      } else {
        id = target.id || "$undefined";
      }
    
      // return if this instance already exists
      if ( instances[id] ) {
        return instances[id];
      }
    
      // or make a new instance
      self = instances[id] = {
    
        // init & reset
        init: function() {
          imgs = null;
          last = 0;
          addEvent( window, "scroll", self.fetchImages );
          self.fetchImages();
          return this;
        },
    
        destroy: function() { 
          removeEvent( window, "scroll", self.fetchImages );
          delete instances[id];
        },
    
        // fetches images, starting at last (index)
        fetchImages: function() {
    
          var img, temp, len, i;
    
          // still trying to get the target
          target = target || document.getElementById( id );
    
          // if it's the first time
          // initialize images array
          if ( !imgs && target ) {
    
            temp = target.getElementsByTagName( "img" ); 
    
            if ( temp.length ) {
              imgs = [];
              len  = temp.length;
            } else return;
    
            // fill the array for sorting
            for ( i = 0; i < len; i++ ) {
              img = temp[i];
              if ( img.nodeType === 1 && img.getAttribute("thumb") ) {
    
                  // store them and cache current
                  // positions for faster sorting
                  img.$$top = getTopPos( img );
                  imgs.push( img );
              }
            }
            imgs.sort( img_sort );
          }
    
          // loop through the images
          while ( imgs[last] ) {
    
            img = imgs[last];
    
            // delete cached position
            if ( img.$$top ) img.$$top = null;
    
            // check if the img is above the fold
            if ( getTopPos( img ) < winH + offset )  {
    
              // then change the src 
              img.src = img.getAttribute("thumb");
              last++;
            }
            else return;
          }
    
          // we've fetched the last image -> finished
          if ( last && last === imgs.length )  {
            self.destroy();
          }
        }  
      };
      return self.init();
    };
    
    // initialize
    getWindowHeight();
    addEvent( window, "load",   LazyImg().fetchImages );
    addEvent( window, "resize", getWindowHeight       ); 
    LazyImg();
    
    window.LazyImg = LazyImg;
    
    }());
    

答案 1 :(得分:3)

有插件。 Here's one ...

相关问题