关于瀑布流

前段时间看到同窗的博客,关于工做的技术博文,里面提到了瀑布流。css

瀑布流这个东西听到不少,也看过一些文章,不过就没本身动手试过。没追求,因此至今不成大器,技术一直这么渣。。。css3

先看一下demogit

瀑布流的几种常见实现方式:github

1)传统多列布局(本文采用这种)app

2)css3定义wordpress

3)绝对定位布局

写这个demo的时候,最多的是参考张鑫旭大神的文章http://www.zhangxinxu.com/wordpress/?p=2308 ,因此demo的图片来源也是效仿他的,从迅雷UED取的~~url

代码:spa

var Waterfall = (function() {

    var colNum = 3,        //列数
        imgRoot = 'http://cued.xunlei.com/demos/publ/img/',     //图片路径

        imgIndex = 0,    //当前图片索引
        perNum = 9,        //每次请求图片数
        totalImg = 160;        //图片总数


    function $(id) {
        return document.getElementById(id);
    }

    //获取最短列
    function colShortest() {
        var shortest = 0;
    //    console.log(shortest + ':  ' + $('col' + shortest).offsetHeight);
        for(var i = 1; i < colNum; i += 1) {
    //        console.log(i + ':  ' + $('col' + i).offsetHeight);
            if($('col' + i).offsetHeight < $('col' + shortest).offsetHeight) {
                shortest = i;
            }
        }
    //    console.log('shortest: ' + shortest + '\n');
        return shortest;
    }

    //获取当前须要图片url
    function getImgUrl() {
        var index = imgIndex;
        if(imgIndex < 10) {    
            index = '00' + imgIndex;
        }else if(imgIndex < 100) {
            index = '0' + imgIndex;
        }
        return imgRoot + 'P_' + index + '.jpg';
     }

     //每滚动到页面底部就更新一下页面
     function render() {
         if(isToBottom()) {
            $('loading').style.display = 'block';
            appendItem(perNum);    
        }
    }
        

     //建立一个项
     function createItem() {
         var frag = document.createDocumentFragment(),
             div = document.createElement('div'),
            imgUrl = getImgUrl(),
            img = '<img src="' + imgUrl + '" />';
        div.className = 'item';
        div.innerHTML = img;
        frag.appendChild(div);
        return frag;
     }

     //append num个图片
     function appendItem(num) {
         var newItem = [];
         for(var i = 0; i < num; i += 1) {
             if(totalImg >= 0) {
                 newItem.push(createItem());
                 imgIndex += 1;
                totalImg -= 1;
             }
         }
         var curCol = 0;
         for(var i = 0, len = newItem.length; i < len; i += 1) {
             if(curCol >= colNum) {
                 curCol = 0;
             }
             $('col' + curCol).appendChild(newItem[i]);
         //     $('col' + colShortest()).appendChild(newItem[i]);
             curCol += 1;
         }
         $('loading').style.display = 'none';
     }
     //增长一个图片项
    // function appendItem() {
    //     var frag = document.createDocumentFragment(),
    //         div = document.createElement('div'),
    //         imgUrl = getImgUrl(),
    //         image = new Image(),
    //         img = '<img src="' + imgUrl + '" />';
    //     div.className = 'item';
    //     div.innerHTML = img;
    //     frag.appendChild(div);
    //     colShortest().appendChild(frag);        
    // }

    //判断是否滚动到底部
    function isToBottom() {
        var scrollT = document.body.scrollTop || document.documentElement.scrollTop,    //滚动高度
            winH =document.documentElement.clientHeight,        //窗口可视高度
            bodyH = document.body.offsetHeight;    //正文高度

        if((bodyH - scrollT) <= (winH + 10)) {
            return true;
        }
        return false;

    }
    //初始化
    function init() {
        appendItem(15);    //先加载15张图片
        window.onscroll = function() {        //滚动事件
            render();
        }
    }

    return {
        init:init
    } 

})();

Waterfall.init();

 

在写这个demo的过程当中遇到了一个问题,就是本来思路每次取9张图片,而后循环插入到当前最短列中去,可是。。。我果真想得太简单了,真实状况它会将9张图片所有插入到同一列中,根本缘由是在计算最短列的时候,以前插入的图片还没插好因此计算的时候没有算到,致使最短列常常是同一个。。。因此,改了,改为将取到的图片分别插入不一样列。这样的话,虽然均匀了一点,可是仍是存在问题,由于这样的插入法就是说每个差很少有一样多张的图片,若是某一列中长的图片比较多,某一列中短的图片又比较多的话,那么,最终长度也会良莠不齐的。。。如今这个demo就是了:code

 

 

很简陋的一个瀑布流,代码很水,还要改进

相关文章
相关标签/搜索