关注用户体验,分享前端技术

瀑布流布局

摘要:

  瀑布流布局已经很早就流行起来了,最近项目中用到了,就整理了下。最早使用的是pinterest(https://www.pinterest.com/),在国内最常见的就是淘宝了(http://guang.taobao.com/),蘑菇街了(http://www.mogujie.com/book/clothing/)等等。本文主要为了说明两点,一个是如何实现瀑布流,另一个就是瀑布流布局。

瀑布流原理:

  瀑布流是为了解决​一次性加载数据比较慢而设计的。其原理类似于数据列表分页,但是事件对象不一样,一个是click事假,另一个是mousescroll事件。瀑布流是当用户滚动一定距离时向服务端请求数据加载进来。下面是一个瀑布流的Demo:

  1 <!DOCTYPE html>
  2 <html>
  3     <head>
  4         <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  5         <style>
  6             .content {
  7                 width: 230px;
  8                 height: 300px;
  9                 margin: 0 auto;
 10                 border: 1px solid;
 11                 overflow-y: auto;
 12             }
 13             .content ul li {
 14                 list-style: none;
 15             }
 16         </style>
 17     </head>
 18     <body>
 19         <div class="content">
 20             <ul id="list">
 21                 <li>
 22                     这是一条模拟数据
 23                 </li>
 24                 <li>
 25                     这是一条模拟数据
 26                 </li>
 27                 <li>
 28                     这是一条模拟数据
 29                 </li>
 30                 <li>
 31                     这是一条模拟数据
 32                 </li>
 33                 <li>
 34                     这是一条模拟数据
 35                 </li>
 36                 <li>
 37                     这是一条模拟数据
 38                 </li>
 39                 <li>
 40                     这是一条模拟数据
 41                 </li>
 42                 <li>
 43                     这是一条模拟数据
 44                 </li>
 45                 <li>
 46                     这是一条模拟数据
 47                 </li>
 48                 <li>
 49                     这是一条模拟数据
 50                 </li>
 51                 <li>
 52                     这是一条模拟数据
 53                 </li>
 54                 <li>
 55                     这是一条模拟数据
 56                 </li>
 57                 <li>
 58                     这是一条模拟数据
 59                 </li>
 60                 <li>
 61                     这是一条模拟数据
 62                 </li>
 63                 <li>
 64                     这是一条模拟数据
 65                 </li>
 66                 <li>
 67                     这是一条模拟数据
 68                 </li>
 69                 <li>
 70                     这是一条模拟数据
 71                 </li>
 72                 <li>
 73                     这是一条模拟数据
 74                 </li>
 75                 <li>
 76                     这是一条模拟数据
 77                 </li>
 78                 <li>
 79                     这是一条模拟数据
 80                 </li>
 81             </ul>
 82         </div>
 83         <script src="js/jquery.min.js"></script>
 84         <script>
 85             $(".content").scroll(function() {
 86                 //滚动到距离底部h高度时加载
 87                 var h = 269,i=0;
 88                 //滚动条距离底部还有多少像素的时候加载
 89                 console.log($("#list").height() - $(".content").scrollTop());
 90                 if ($("#list").height() - $(".content").scrollTop() < h) {
 91                     // 如果请求服务器端数据,执行下面这段代码,传入的参数代表页数
 92                     /*remoteload(++i);*/
 93                     //如果是本地模拟,执行下面代码
 94                     for(var j = 0; j < 10; j++) {
 95                         $('<li>这是一条模拟数据</li>').appendTo($('#list'));
 96                     }
 97                 }
 98             });
 99 
100             function remoteload(page) {
101                 $.ajax({
102                     url: 你的接口+'?page='+page
103                 })
104                 .done(function() {
105                     //和本地模拟处理一样
106                 });
107             }
108         </script>
109     </body>
110 </html>

瀑布流布局:

  有两种样式的布局,一种像蘑菇街这种高宽固定的

  另一种就像淘宝高度不统一的

 

 对于上面那种高宽都统一的,有几种实现方式:

  • 将各列固定宽度,并且左浮动就可以了
  • 绝对定位
  • CSS3,如下
     1 <!DOCTYPE html>
     2 <html>
     3     <head>
     4         <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
     5         <style>
     6             #content {
     7                 -webkit-column-count: 3; /* 列数 */
     8                 -webkit-column-gap: 20px; /* 列间隔 */
     9                 -webkit-column-rule: 1px solid red; /* 间隔边线 */
    10                 -webkit-column-width: 150px; /* 列宽 */
    11 
    12                 -moz-column-count: 3;
    13                 -moz-column-gap: 20px;
    14                 -moz-column-rule: 1px solid red;
    15                 -moz-column-width: 150px;
    16 
    17                 column-count: 3;
    18                 column-gap: 20px;
    19                 column-rule: 1px solid red;
    20                 column-width: 150px;
    21             }
    22         </style>
    23     </head>
    24     <body>
    25         <div id="content">
    26             <div>
    27                 瀑布流布局1
    28             </div>
    29             <div>
    30                 瀑布流布局2
    31             </div>
    32             <div>
    33                 瀑布流布局3
    34             </div>
    35             <div>
    36                 瀑布流布局4
    37             </div>
    38             <div>
    39                 瀑布流布局5
    40             </div>
    41             <div>
    42                 瀑布流布局6
    43             </div>
    44             <div>
    45                 瀑布流布局7
    46             </div>
    47             <div>
    48                 瀑布流布局8
    49             </div>
    50             <div>
    51                 瀑布流布局9
    52             </div>
    53         </div>
    54     </body>
    55 </html>

对于淘宝高度不统一的布局需要用js来计算当前元素的left和top值,后面将分享几款类似这种布局的插件。

 

posted @ 2014-11-03 08:49  夕阳白雪  阅读(1076)  评论(0编辑  收藏  举报