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

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

本着学习分享为主,只贴出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>
时间: 2024-10-07 05:35:00

jquery瀑布流下拉加载(position定位版)的相关文章

jQuery 滚动条下拉加载内容

现在很多网站为了更好的用户体验,那么就会预先加载一部分内容,等到滚动条下拉到底部的时候,然后使用 ajax或其它技术,请求更多的内容,这样会使网页的用户体验会更好些,那么这个是怎么样做到的呢?现在就在这里提供一种思路出来... $(function(){ //思路是:如果内容区域 小于等于 可视区高度加滚动条的高度的话那么就进行加载... $(window).scroll(function(){ // document 文档高度 var docHeight = $(document).heigh

jQuery瀑布流+无限加载图片

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> * { margin: 0px; padding: 0px; } #contianer { position: relative; font-size: 0; margin: 0 auto; }

jQuery实现下拉加载更多

<!DOCTYPE=html><html><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js&

jquery实现下拉加载功能

<script> var str = ''; if(page=="") page=1; var stop=true;//触发开关,防止多次调用事件 $(window).scroll( function(event){ //当内容滚动到底部时加载新的内容 100当距离最底部100个像素时开始加载. if ($(this).scrollTop() + $(window).height() + 10 >= $(document).height() && $(

jquery实现上拉加载更多

1 let scrollEvent = 'scroll.' + Date.now(); 2 let touchmoveEvent = 'touchmove.' + Date.now(); 3 SSpa.onModEvents('invitation/list',{ 4 ready: _=>{ 5 initVue() 6 }, 7 isShow: _=>{ 8 Vm && Vm.init() 9 let title = '我的邀请' 10 hybirdApp.setTitle(t

ASP.NET仿新浪微博下拉加载更多数据瀑布流效果

闲来无事,琢磨着写点东西.貌似页面下拉加载数据,瀑布流的效果很火,各个网站都能见到各式各样的展示效果,原理大同小异.于是乎,决定自己写一写这个效果,希望能给比我还菜的菜鸟们一点参考价值. 在开始之前,先把实现的基本原理说一下.当夜幕下拉到底部的时候,js可以判断滚动条的位置,到达底部触发js方法,执行jquery的ajax方法,向后台一般处理程序夜幕ashx文件请求数据源,得到json格式的数据源.然后,遍历json数据源,拼接一个li标签,再填充到页面上去. 首先,我们来做个简单的html页面

jQuery手机端上拉刷新下拉加载更多页面

<!doctype html> <html> <head> <title>jquery 手机端上拉刷新下拉加载更多页面</title> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta name="viewpost" content="width=device-wi

定位和xml解析和gson解析加上拉加载,下拉刷新

这里的上拉加载,下拉刷新用到是依赖包 Mainactivity,xml解析和定位 package com.exmple.autolayout; import java.util.List; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; i

vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多

一.思路分析和效果图 用vue来实现一个瀑布流效果,加载网络图片,同时有下拉刷新和上拉加载更多功能效果.然后针对这几个效果的实现,捋下思路: 根据加载数据的顺序,依次追加标签展示效果: 选择哪种方式实现瀑布流,这里选择绝对定位方式: 关键问题:由于每张图片的宽高不一样,而瀑布流中要求所有图片的宽度一致,高度随宽度等比缩放.而且由于图片的加载是异步延迟.在不知道图片高度的情况下,每个图片所在的item盒子不好绝对定位.因此在渲染页面前先获取所有图片的高度,是解决问题的关键点!这里选择用JS中的Im