JQuery

1个成员

jquery瀑布流插件使用实例

发表于 2017-02-07 3502 次查看
瀑布流效果是最近比较实用的一个实例现在像百度的图片搜索与google图片搜索都是以瀑布流形式来展示了,下面我来给大家推荐一款jquery瀑布流插件,大家也可以把自己的网站做成这种瀑布流效果哦。

直接看代码

 代码如下 复制代码

/**
 ************************************************************
 ***@project jquery瀑布流插件
 ***@author hcp0209@gmail.com
 ***@ver version 1.0
 ************************************************************
 */
;(function($){
   var
   //参数
   setting={
      column_width:204,//列宽
   column_className:'waterfall_column',//列的类名
   column_space:10,//列间距
   cell_selector:'.cell',//要排列的砖块的选择器,context为整个外部容器
   img_selector:'img',//要加载的图片的选择器
   auto_imgHeight:true,//是否需要自动计算图片的高度
   fadein:true,//是否渐显载入
   fadein_speed:600,//渐显速率,单位毫秒
   insert_type:1, //单元格插入方式,1为插入最短那列,2为按序轮流插入
   getResource:function(index){ }  //获取动态资源函数,必须返回一个砖块元素集合,传入参数为加载的次数
   },
   //
   waterfall=$.waterfall={},//对外信息对象
   $container=null;//容器
   waterfall.load_index=0, //加载次数
   $.fn.extend({
       waterfall:function(opt){
    opt=opt||{};
       setting=$.extend(setting,opt);
    $container=waterfall.$container=$(this);
    waterfall.$columns=creatColumn();
    render($(this).find(setting.cell_selector).detach(),false); //重排已存在元素时强制不渐显
    waterfall._scrollTimer2=null;
    $(window).bind('scroll',function(){
       clearTimeout(waterfall._scrollTimer2);
    waterfall._scrollTimer2=setTimeout(onScroll,300);
    });
    waterfall._scrollTimer3=null;
    $(window).bind('resize',function(){
       clearTimeout(waterfall._scrollTimer3);
    waterfall._scrollTimer3=setTimeout(onResize,300);
    });
    }
   });
   function creatColumn(){//创建列
      waterfall.column_num=calculateColumns();//列数
   //循环创建列
   var html='';
   for(var i=0;i<waterfall.column_num;i++){
      html+='</pre>
<div class="'+setting.column_className+'" style="width: '+setting.column_width+'px; display: inline-block; *display: inline; zoom: 1; margin-left: '+setting.column_space/2+'px; margin-right: '+setting.column_space/2+'px; vertical-align: top; overflow: hidden;"></div>
<pre>
';
   }
   $container.prepend(html);//插入列
   return $('.'+setting.column_className,$container);//列集合
   }
   function calculateColumns(){//计算需要的列数
      var num=Math.floor(($container.innerWidth())/(setting.column_width+setting.column_space));
   if(num0){//本身是图片或含有图片
        var image=new Image;
     var src=$(this)[0].nodeName.toLowerCase()=='img'?$(this).attr('src'):$(this).find(setting.img_selector).attr('src');
     image.onload=function(){//图片加载后才能自动计算出尺寸
         image.onreadystatechange=null;
      if(setting.insert_type==1){
         insert($(elements).eq(i),setting.fadein&&fadein);//插入元素
      }else if(setting.insert_type==2){
      insert2($(elements).eq(i),i,setting.fadein&&fadein);//插入元素
      }
      image=null;
     }
     image.onreadystatechange=function(){//处理IE等浏览器的缓存问题:图片缓存后不会再触发onload事件
         if(image.readyState == "complete"){
      image.onload=null;
      if(setting.insert_type==1){
         insert($(elements).eq(i),setting.fadein&&fadein);//插入元素
      }else if(setting.insert_type==2){
         insert2($(elements).eq(i),i,setting.fadein&&fadein);//插入元素
      }
      image=null;
      }
     }
     image.src=src;
    }else{//不用考虑图片加载
        if(setting.insert_type==1){
     insert($(elements).eq(i),setting.fadein&&fadein);//插入元素
     }else if(setting.insert_type==2){
     insert2($(elements).eq(i),i,setting.fadein&&fadein);//插入元素
     }
    }
   });
   }
   function public_render(elems){//ajax得到元素的渲染接口
      render(elems,true);
   }
   function insert($element,fadein){//把元素插入最短列
      if(fadein){//渐显
      $element.css('opacity',0).appendTo(waterfall.$columns.eq(calculateLowest())).fadeTo(setting.fadein_speed,1);
   }else{//不渐显
         $element.appendTo(waterfall.$columns.eq(calculateLowest()));
   }
   }
   function insert2($element,i,fadein){//按序轮流插入元素
      if(fadein){//渐显
      $element.css('opacity',0).appendTo(waterfall.$columns.eq(i%waterfall.column_num)).fadeTo(setting.fadein_speed,1);
   }else{//不渐显
         $element.appendTo(waterfall.$columns.eq(i%waterfall.column_num));
   }
   }
   function calculateLowest(){//计算最短的那列的索引
      var min=waterfall.$columns.eq(0).outerHeight(),min_key=0;
   waterfall.$columns.each(function(i){
   if($(this).outerHeight()=bottom-windowHeight){
    render(getElements(),true);
    }
   },100);
   }
   function onResize(){//窗口缩放时重新排列
      if(calculateColumns()==waterfall.column_num) return; //列数未改变,不需要重排
      var $cells=waterfall.$container.find(setting.cell_selector);
   waterfall.$columns.remove();
   waterfall.$columns=creatColumn();
      render($cells,false); //重排已有元素时强制不渐显
   }
})(jQuery);

插件使用方法:

 

 代码如下 复制代码
$(selector).waterfall(opt);

//其中selector为瀑布流容器的选择器,opt为配置参数对象


所需的html结构:

html结构可以就是一个空容器元素,如

里面的砖块元素通过动态加载进来。当然也可以预先放一些砖块进去,如demo页中的

 代码如下 复制代码

<div id="container">
<div class="cell"><img src="P_000.jpg" /><p>00</p></div>
<div class="cell"><img src="P_001.jpg" /><p>01</p></div>
<div class="cell"><img src="P_002.jpg" /><p>02</p></div>
<div class="cell"><img src="P_003.jpg" /><p>03</p></div>
<div class="cell"><img src="P_004.jpg" /><p>04</p></div>
<div class="cell"><img src="P_005.jpg" /><p>05</p></div>
<div class="cell"><img src="P_006.jpg" /><p>06</p></div>
<div class="cell"><img src="P_007.jpg" /><p>07</p></div>
<div class="cell"><img src="P_008.jpg" /><p>08</p></div>
<div class="cell"><img src="P_009.jpg" /><p>09</p></div>
<div class="cell"><img src="P_010.jpg" /><p>10</p></div>
<div class="cell"><img src="P_011.jpg" /><p>11</p></div>
<div class="cell"><img src="P_012.jpg" /><p>12</p></div>
<div class="cell"><img src="P_013.jpg" /><p>13</p></div>
<div class="cell"><img src="P_014.jpg" /><p>14</p></div>
<div class="cell"><img src="P_015.jpg" /><p>15</p></div>
<div class="cell"><img src="P_016.jpg" /><p>16</p></div>
<div class="cell"><img src="P_017.jpg" /><p>17</p></div>
<div class="cell"><img src="P_018.jpg" /><p>18</p></div>
<div class="cell"><img src="P_019.jpg" /><p>19</p></div>
</div>

发表回复
你还没有登录,请先登录注册