您的位置:首页 > Web前端 > JQuery

jquery瀑布流下拉加载(position定位版)

2015-10-24 23:09 555 查看
 瀑布流的算法一直是迷惑我很久的一个东西,我虽知道原理但自己凭空尝试仍是自己做不来,于是借鉴园子里别人写的代码的思路和自己找的一些关于瀑布流布局的教程,一步步来,终于自己独立做出来了。

(本着学习分享为主,只贴出js逻辑部分,布局和css都不发了就。)

数据用的:http://www.wookmark.com/api

jquery版本:1.9.1

效果图如下:



jquery code:
1 <script>
2 $(function(){
3     /*
4         1.通过可视区域的宽度 除以 每一块的宽度 可以得出多少列
5         2.放一个存储每一块top值的高度数组arrT(初始化为[0,0,0,0....])
6         3.getshort()方法找出 最短列数的索引值,并动态创建一个“新的模块box”放在索引值的位置(当前最短的那一列),设置top值等	      于数组arrT[最短列的索引值],最后并把arrT[最短列的索引值]+="新的模块box"的高度
7         4.下拉时候加载数据
8
9     */
10     var container=$('.container');//外层div
11     var oLoading=$('.loading');//loading
12     var oNomre=$('.nomre');//end
13     var iWidth=200;//每一列数宽
14     var iSpace=10;//间距
15     var iCell=0;//列数
16     var iPage=0;//页数
17     var arrL=[];//存放left值
18     var arrT=[];//存放top值
19     var iBtn=true;
20     var iOuterWidth=iWidth+iSpace;
21     var iUrl='http://www.wookmark.com/api/json/popular?callback=?'
22     //计算列数
23     function setCell(){
24         var winWidth=$(window).innerWidth();//可视觉区的宽
25         iCell=Math.floor(winWidth/iOuterWidth);
26         //最小3列,最大6列显示
27         if (iCell < 3) {
28             iCell = 3;
29         } else if (iCell > 6) {
30             iCell = 6;
31         }
32         //container 总宽度
33         var totalWidth=iOuterWidth*iCell-iSpace;
34         //设置总宽度
35         container.css('width',totalWidth);
36     }
37     setCell();//初始化列数
38
39     //存储每一列的left值
40     for(var i=0;i<iCell;i++){
41
42         //每一列的left值等于i*每列站位的宽
43         var iLeft=i*iOuterWidth;
44         arrL.push(iLeft);
45         arrT.push(0);
46
47     }
48
49     //请求数据
50     function getDataFn(){
51         if(iBtn){
52           iBtn=false;
53           oLoading.show();
54           $.getJSON(iUrl,'page='+iPage,function(data){
55                   $.each(data,function(index,obj){
56                       var _index=getShort();//获取arrT最小值所在的位置
57                       var imgWidth=obj.width;//图片原始宽度
58                       var imgHeight=obj.height;//图片原始高度
59                       var nowWidth=iWidth-(iSpace*2);//现在的宽度 180图片宽;
60                       var nowHeight=Math.floor(nowWidth*imgHeight/imgWidth);
61
62                       var oDiv=$('<div class="box"></div');
63                       var oA=$('<a href="#"></a>');
64                       var oImg=$('<img src="'+ obj.preview+'" style="width:'+nowWidth+'px;height:'+nowHeight+'px;"/>');
65                       var oP=$('<p>'+obj.title+'</p>');
66                       oA.append(oImg);
67                       oDiv.append(oA)
68                       oDiv.append(oP);
69                       oDiv.css('left',arrL[_index]);
70                       oDiv.css('top',arrT[_index]);
71                       container.append(oDiv)
72                       var oThisHeight=oDiv.outerHeight();
73                       arrT[_index]+=oThisHeight+iSpace;
74                       oLoading.hide();
75                       iBtn=true;
76               });
77
78           });
79         }
80
81     }
82
83     getDataFn();//初始化数据
84
85     //获取高度最短的一列 返回最短一列的index
86     function getShort(){
87         var iv=arrT[0];
88         var _index=0;
89         for(var i=0;i<arrT.length;i++){
90             if(arrT[i]<iv){
91                 iv=arrT[i];
92                 _index=i;
93             }
94         }
95
96         return _index;
97     }
98     //滚动时候加载数据
99     $(window).scroll(function(){
100         var iH=$(window).scrollTop()+$(window).innerHeight();
101         var _index=getShort();//获取arrT最小值所在的位置
102         var minObjHeight=arrT[_index];
103         if(iH>minObjHeight){
104             iPage++;
105             if(iPage>10){
106               var len=$('.box').length;
107               var lastBox=$('.box').eq(len-1);
108               var lastHeight=lastBox.offset().top+lastBox.outerHeight();
109               container.css('height',lastHeight);
110                 setTimeout(function(){oNomre.css('display','block');},1000)
111                 return;
112             }
113             getDataFn();
114         }
115
116     });
117     //窗口变化时候,列变化同时加动画
118     $(window).on('resize',function(){
119         setCell();//列数
120         arrL=[];
121         arrT=[];
122         for(var i=0;i<iCell;i++){
123
124             //每一列的left值等于i*每列站位的宽
125             var iLeft=i*iOuterWidth;
126             arrL.push(iLeft);
127             arrT.push(0);
128         }
129         var oBox=$('.box');//获取所有图片
130         oBox.each(function(index,elem){
131              var _index=getShort();//获取arrT最小值所在的位置
132              $(this).animate({'left':arrL[_index]});
133              $(this).animate({'top':arrT[_index]});
134               arrT[_index]+=$(this).outerHeight()+iSpace;
135         });
136
137     });
138
139 });
140 </script>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: