zoukankan      html  css  js  c++  java
  • 简单瀑布流实现

    瀑布流通常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>

    可直接复制运行

  • 相关阅读:
    PHP中如何获取多个checkbox的值
    修改Netbeans默认使用UTF-8编码
    php用户注册
    windows环境下MySQL重启的命令行说明
    wampserver修改mysql数据库密码后phpMyAdmin无法连接数据库
    JavaScript判断闰年
    移动端300毫秒事件响应延迟解决方法[fastclick]
    移动端一像素边框解决方案[css scale]
    移动端禁止缩放<meta>
    数据结构概念
  • 原文地址:https://www.cnblogs.com/yijinc/p/5252436.html
Copyright © 2011-2022 走看看