瀑布流式布局

瀑布流就是像瀑布一样的网站——丰富的网站内容,特别适应于图片。宽度固定,高度不固定。参差不齐的多栏布局。还可以响应式地适应不同大小的设备。

实现思路如下:

一.页面布局:一个装图片的div;一个装加载图片的div

二.js代码:

1.设置图片的宽度iWidth和图片间的间隙iSpace,列宽iOuterWidth=图片的宽度+图片间的间隙

2.列数iCells=获取的窗口大小/列宽

3.定义两个数组arrL和arrT来存储图片的位置,arrL存储图片left定位,arrT存储图片Top定位

4.初始化数组,确定第一行图片的定位

for(var i=0;i<iCells;i++){
arrT.push(0);
arrL.push(i*iOuterWidth);
}

5.根据定好的图片的宽度和图片宽高算出图片的高度

6.设置图片的宽高

7.获取页面中高度最小的列的索引值,把图片依次插入高度较小的列中。这样就完成了最简单的瀑布流局

 

三.性能优化的js代码:

1.图片的数据有时候是在一个URL中:如:http://www.wookmark.com/api/json/popular?callback=?  而庞大的数据通常是会分页的,这样可以一页页的加载数据,等一页数据加载完再加载下一页数据。所以js代码中要加判断条件,当滑动鼠标时触发函数判断是否需要加载下一页的数据

2.响应式设计:当窗口大小改变时,根据窗口大小重新算出列数,再重定位图片的位置即实现了响应式设计

 

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0,minimal-ui" />
    <title>waterfall</title>
    <style type="text/css">
    *{
        margin: 0;
        padding: 0;
    }
    #container{
        margin: 10px auto;
        position: relative;
    }
    #container img{
        position: absolute;
    }
    #load{
        width: 100%;
        height: 60px;
        background: url('loader.gif') no-repeat center #fff;
        position: fixed;
        bottom: 0;
        left: 0;
    }
    </style>
    <script type="text/javascript" src="jquery-1.9.1.min.js"></script>
    <script type="text/javascript">
    $(function(){
        var container=$('#container'); //放瀑布流图片的div
        var load=$('#load');          //放加载图片的div的类名
        var sUrl = 'http://www.wookmark.com/api/json/popular?callback=?';
        var iWidth=50;                    //单列的宽度
        var iSpace=10;                    //间隔的宽度
        var iOuterWidth=iWidth+iSpace;   //实际列宽单列宽+间隔宽
        var iCells=0;                   //初始化列数
        var ipage=0;                    //初始化Json的页数
        var iBtn=true;  //设置一个参数,当参数为true时才执行函数,防止函数不断执行

        var arrL=[];                   //定位图片left的数组
        var arrT=[];                   //定位图片top的数组

        //根据窗口的大小和列宽设置列数
        function setCells(){
            iCells=Math.floor($(window).innerWidth()/iOuterWidth);
            container.css('width',iOuterWidth*iCells-iSpace);
        }
        setCells();

        //先初始化数组,确定第一行图片的定位
        for(var i=0;i<iCells;i++){
            arrT.push(0);
            arrL.push(i*iOuterWidth);        
        }
        //获取一行中高度最小的列,返回该列的索引
        function getMin(){
            var iv=arrT[0];
            var _index=0;
            for(var i=0;i<arrT.length;i++){
                if(arrT[i]<iv){
                    iv=arrT[i];
                    _index=i;
                }
            }
            return _index;
        }

        //获取一行中高度最大的列,返回该列的索引
        function getMax(){
            var iv=arrT[0];
            var _index=0;
            for(var i=0;i>arrT.length;i++){
                if(arrT[i]<iv){
                    iv=arrT[i];
                    _index=i;
                }
            }
            return _index;
        }

        // 获取数据输出
        function getData(){
            if(iBtn){
                iBtn=false;
                load.show();//显示加载图片
                $.getJSON(sUrl,'page+=ipage',function(data){
                    $.each(data,function(index,obj){
                        //把图片显示在页面上
                        var oImg=$('<img />');
                        oImg.attr('src',obj.preview);
                        container.append(oImg);

                        //根据定好的图片的宽度和图片宽高算出图片的高度
                        var iHeight=iWidth/obj.width*obj.height;

                        //设置图片的宽高
                        oImg.css({
                            width : iWidth,
                            height : iHeight
                        })
                        // 获取高度最小的列的索引值
                        var iMinIndex=getMin();
                        // 获取高度最高的列的索引值
                        var iMaxIndex=getMax();
                        //设置装图片的容器的高度
                        container.css('height',arrT[iMaxIndex]);
                        // 定位图片的位置
                        oImg.css({
                            left : arrL[iMinIndex],
                            top : arrT[iMinIndex]
                        });
                        //上下图片间加10px的间隙
                        arrT[iMinIndex]+=iHeight+10;
                        //一页的数据图片加载完成隐藏加载图片
                        load.hide();
                        iBtn=true;
                    })
                    //使其一开始时就触发scroll事件来判断数据是否需要加载下一页
                    if(ipage<2){
                        $(window).trigger('scroll');
                    }
                })
            }
        }

        getData();

        //当滑动鼠标时触发函数判断是否需要加载下一页的数据
        $(window).on('scroll',function(){
            var iH=$(window).scrollTop()+$(window).innerHeight();
            var iMinIndex=getMin();
            if(arrT[iMinIndex]+container.offset().top<iH){
                ipage++;
                getData();
            }
        });

        

        //当窗口大小改变时,重新调整图片。即响应式设计
        $(window).on('resize', function() {
            var iLen = iCells;
            setCells();
            if (iLen == iCells) {
                return ;
            }
            arrT = [];
            arrL = [];
            for (var i=0; i<iCells; i++) {
                arrT[i] = 0;
                arrL[i] = iOuterWidth * i;
            }
            container.find('img').each(function() {
                
                var _index = getMin();
                /*$(this).css({
                    left    :    arrL[_index],
                    top        :    arrT[_index]
                });*/
                $(this).animate({
                    left    :    arrL[_index],
                    top        :    arrT[_index]
                }, 1000);
                arrT[_index] += $(this).height() + 10;
                
            });
        })

    })
    </script>
</head>
<body>
    <div id="container"></div>
    <div id="load"></div>
</body>
</html>

 

posted @ 2014-10-22 16:06  jellyANDjammy  阅读(373)  评论(0编辑  收藏  举报