简单瀑布流实现

瀑布流通常2种形式

1.固定n列(固定宽度),列中图片高度不等,如 花瓣网 http://huaban.com/all/ 

2.固定n行(固定高度),行中图片宽度不等,如 百度图片 http://image.baidu.com/search/index

列数可根据浏览器可视化窗口大小改变(也可固定)

原理:在#container定义等宽4列,每一列的高度自动,(ajax获取数据)然后在这4列添加图片;

获取每一列图片的最低(矮)位置,下一个图片(数据)添加到这个位置,并更新这列的高度。用一个4列数组来存放高度,获取最低高度的下标即可

    当最低的那列到达可视区的底部,再次加载数据 (当前列的offsetHeight+offsetTop < scrollTop+clientHeight)

  1 <!DOCTYPE HTML>
  2 <html>
  3 <head>
  4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5 <title>瀑布流</title>
  6 <style>
  7 * {margin: 0; padding: 0;}
  8 #container { width: 1000px; border: 1px solid red; position: relative; margin: 50px auto 0; }
  9 #container img { position: absolute; }
 10 #loader { width: 100%; height: 60px; background: url(‘loader.gif‘) no-repeat center #FFF; position: fixed; bottom: 0; left: 0; display: none; }
 11 </style>
 12 <!-- ************* 新浪CDN ***********-->
 13 <script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
 14 <script>
 15 /*
 16 固定列:浮动布局
 17 定位
 18 */
 19 $(function() {
 20
 21     var oContainer = $(‘#container‘);
 22     //列数
 23     var iCells = 0;
 24     //每一列的宽度
 25     var iWidth = 200;
 26     //列的间隙宽
 27     var iSpace = 10;
 28     var iOuterWidth = iWidth + iSpace;
 29     var sUrl = ‘http://www.wookmark.com/api/json/popular?callback=?‘;
 30     //图片top
 31     var arrT = [];
 32     //图片距离left
 33     var arrL = [];
 34     var iPage = 0;
 35     var iBtn = true;
 36
 37     function setCell() {
 38         //设置 列数 = 可视区窗口宽度 / 每列宽度  向下舍整
 39         iCells = Math.floor($(window).innerWidth() / iOuterWidth);
 40         if (iCells < 3) {
 41             iCells = 3;
 42         } else if (iCells > 6) {
 43             iCells = 6;
 44         }
 45         //alert(iCells);
 46         oContainer.css(‘width‘, iCells * iOuterWidth) - 10;
 47     }
 48     setCell();
 49
 50     for (var i=0; i<iCells; i++) {
 51         arrT[i] = 0;
 52         arrL[i] = iOuterWidth * i;
 53     }
 54     //console.log(iCells);
 55     //console.log(arrL);
 56
 57     function getData() {
 58         if (!iBtn) {
 59             return ;
 60         }
 61         iBtn = false;
 62         iPage++;
 63         $.getJSON(sUrl, {page:iPage}, function(jData) {
 64             $(‘#loader‘).show();
 65             $.each(jData, function(index, obj) {
 66
 67                 var oImg = $(‘<img />‘);
 68
 69                 //宽高
 70                 var iHeight = obj.height * (iWidth / obj.width);
 71                 oImg.css({
 72                     width    :    iWidth,
 73                     height    :    iHeight
 74                 });
 75
 76                 var _index = getMin();
 77                 oImg.css({
 78                     left    :    arrL[_index],
 79                     top        :    arrT[_index]
 80                 });
 81                 arrT[_index] += iHeight + 10;    //
 82
 83                 oContainer.append(oImg);
 84
 85                 var objImg = new Image();
 86                 objImg.onload = function() {
 87                     oImg.attr(‘src‘, this.src);
 88                 }
 89                 objImg.src = obj.preview;
 90
 91                 setTimeout(function() {
 92                     $(‘#loader‘).hide();
 93                 },1000)
 94
 95                 iBtn = true;
 96
 97             })
 98
 99         });
100     }
101     getData();
102     //arrT = [11,23,5,7];
103     // 获取 每一列最短 高度 的下标
104     function getMin() {
105         var v = arrT[0];
106         var _index = 0;
107
108         for (var i=1; i<arrT.length; i++) {
109             if (arrT[i] < v) {
110                 v = arrT[i];
111                 _index = i;
112             }
113         }
114         return _index;
115     }
116
117     //alert(getMin());
118
119     $(window).on(‘scroll‘, function() {
120         var _index =getMin();
121         var iH = $(window).scrollTop() + $(window).innerHeight();
122         document.title = iH + ‘:‘ + (arrT[_index] + 50);
123         if (arrT[_index] + 50 < iH) {
124             getData();
125         }
126
127     })
128
129     $(window).on(‘resize‘, function() {
130         var iLen = iCells;
131         setCell();
132         if (iLen == iCells) {
133             return ;
134         }
135         arrT = [];
136         arrL = [];
137         for (var i=0; i<iCells; i++) {
138             arrT[i] = 0;
139             arrL[i] = iOuterWidth * i;
140         }
141         oContainer.find(‘img‘).each(function() {
142
143             var _index = getMin();
144             /*$(this).css({
145                 left    :    arrL[_index],
146                 top        :    arrT[_index]
147             });*/
148             $(this).animate({
149                 left    :    arrL[_index],
150                 top        :    arrT[_index]
151             }, 1000);
152             arrT[_index] += $(this).height() + 10;
153
154         });
155     })
156
157
158
159 })
160 </script>
161 </head>
162
163 <body>
164     <div id="container"></div>
165     <div id="loader"></div>
166 </body>
167 </html>

可直接复制运行

时间: 2024-10-31 12:52:44

简单瀑布流实现的相关文章

iOS之简单瀑布流的实现

iOS之简单瀑布流的实现 前言 超简单的瀑布流实现,这里说一下笔者的思路,详细代码在这里. 实现思路 collectionView能实现各中吊炸天的布局,其精髓就在于UICollectionViewLayout,因此我们要自定义一个layout来继承系统的UICollectionViewLayout,所有工作都在这个类中进行. 1.定义所需属性 瀑布流的思路就是,从上往下,那一列最短,就把下一个item放在哪一列,因此我们需要定义一个字典来记录每一列的最大y值 每一个item都有一个attrib

简单瀑布流封装

function createLi(){ var oLi=document.createElement('li'); oLi.style.height=parseInt(50+Math.random()*400)+'px'; oLi.style.background='rgb('+rnd(0,255)+','+rnd(0,255)+','+rnd(0,255)+')'; return oLi; }; function rnd(n,m){ return parseInt(Math.random()

jquery实现简单瀑布流代码

测试环境:ie8 ff13.0.1  chrome22 可以将分页获取的内容依次填入四个div中,瀑布流的分页可以以多页(比如5页)为单位二次分页,这样可以减少后台算法的复杂度 [html] view plaincopy <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&

javascript-实现简单瀑布流

直接上代码: <style> *{ margin:0; padding:0; } .waterfall_item{ border:solid 3px #ccc; box-shadow:1px 1px 3px #eee; border-radius:8px; font:normal 12px/22px 'Microsoft yahei'; text-align: center; padding: 20px 0; overflow: hidden; } </style> <scr

iOS开发-UICollectionView实现瀑布流

关于瀑布流的实现网上有很多种解法,自定义控件,TableView+ScrollView,UICollectionView是iOS6发布之后用于展示集合视图,算起来已经发布三年左右了,不过知识点是不变的,集合视图提供了一个更优雅的方式去展示图片或者文字信息.UICollectionView与UITableView相似,UICollectionViewController与UITableViewController都负责视图,存储需要的数据,并且能处理数据源与委托协议. 简单瀑布流 首先来看一个简单

javascript 简单的瀑布流

刚开始接触js,就想写写经典的瀑布流,搜了下网上的教程,发现大多是用jquery写的,非常简单,用它也不用考虑兼容性的问题(jquery已经考虑到了),就想自己用原生的js写个简单的瀑布流模型,暂且没有考虑到拖动时自动排版的情形,以后再添加.(发现用原生的js果然步骤比较多啊!很多方法都很底层的!) <!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content=&qu

UICollectionView 很简单的写个瀑布流

你项目中要用到它吗? 可能会在你的项目中用到这玩意,最近也是要用就简单的写了一个 Demo.没多少代码,就不放Git了,下面会详细点的说说代码的,要还有什么问题的小伙伴可以直接Q我,也可以把Demo发给你,这里有Q可以找一下加我 多多交流,互相学习! 下面是简单的一个效果图,先给看看效果图! 先说说控制器里面的代码,控制器里面就是我们的  UICollectionView  的一些基本的创建了.其实它和 UITableView 相比较的话,但从创建使用看的话,是挺相似的,但其实它真的比 UITa

jQuery实现瀑布流的简单方法

HTML代码 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>waterFall</title> <link rel="stylesheet" href="wf.css"> <script src="jquery.js">

利用JS实现简单的瀑布流效果

哈哈, 我又来啦, 在这一段时间里, 我简单的学习了一下javascript(JS), 虽然不是很懂啦, 但是我也简单的尝试着做了点小东西, 就比如现在流行的瀑布流效果, 经过我的努力终于成功的完成了, 虽然中间非常的坎坷, 并不是一帆风顺但是最终我还是实现了个简单的效果, 下面就为大家简单的介绍下, 不知道的友友们, 有兴趣的话, 可以来参考下, 欢迎指出缺点和不足! 一.瀑布流之准备工作   首先声明下, 为了方便演示和联系, 我使用的是本地图片, 如果大家有需要的话可以尝试着写下网络的,