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

    前言

    无聊刷网页的时候,点开了一个瀑布流的图片布局.想着无聊就试着写一个,记录一下自己现在的想法,已备以后的需求.

    思路如下

    • 首先,瀑布流是页面按设定的列来显示图片.每张图片的宽度要相同.然后依次123..,123..,一直这样排下去.
    //模仿jQuery,封装一个waterFall方法,并设定一个默认的列和边距
    $.fn.waterFall = function (option){
        var defaultOption = {col:5,padding:10};
        //$.extend可以覆盖参数,如果没传就是默认,默认写在前面
        defaultOption = $.extend(defaultOption,option);
        var col = defaultOption.col;//列数
        var padding = defaultOption.padding;//间距        
        //计算每个瀑布流块的宽度,并给每个子盒子设置宽度
        var everyItemWidth = (this.width() - (col+1)*padding)/col;
        var allItems = this.children();
        allItems.width(everyItemWidth);
    
        //循环去设置allItems每一个的left,top值
        var itemY = [];//记录每一列的高度的,它里面只有col列个值
        //第一次加载的话,高度有一个bug,所以setTimeout让其延迟加载一下
        setTimeout(function () {
            for(var i=0;i<allItems.length;i++){
                var everyItem = allItems[i];    
                if(i<col){//布局第一行,第一行的特点,top值都为0
                    $(everyItem).css({
                        top:0,
                        left:padding+(padding+everyItemWidth)*i
                    });
    
                    //将第一行的所有的元素的高度值,放在itemY数组中,方便从第二行布局时用来比较
                    itemY[i] = $(everyItem).height();
                }else{
                     //布局第二行及后面的行,找到哪一列最短,把i对应的 item放在最短的那一列下面去,把刚刚那一列的长度重新设置下
                    //假设第 0 列是最短的 循环判断 找出最短的是第几列
                    var minCol = 0;
                    for(var j=1;j<itemY.length;j++){
                        if (itemY[j]<itemY[minCol]){
                            minCol = j;
                        }
                    }    
                    //遍历到的第i个item,设置top,left
                    $(everyItem).css({    
                        top:itemY[minCol]+padding,
                        left:padding+(padding+everyItemWidth)*minCol
                    });
                    //因为增加了一个新item,把刚刚那一列的长度重新设置下    
                    itemY[minCol] = itemY[minCol] + padding + $(everyItem).height();
                }    
            }    
        
        var _this = this;//_this调用这个函数的this
        setTimeout(function () {
            //找到itemY中最高的那一列数据的高度,让它作为整个items的高度
            var maxCol = 0;    
            for (var i=1;i<itemY.length;i++){
                if (itemY[i]>itemY[maxCol]){
                    maxCol = i;
                }
            }
            var totalHeight = itemY[maxCol] + padding;
            //给正个大盒子设置一个高度
            _this.height(totalHeight);
        },200);    
    }
    
    • 拿后台数据以后用到在考虑实际情况,大体就是ajax请求获取数据,利用模板引擎添加页面元素.
    • 一个注意点
            //窗口调整时,要重新布局子元素
            $(window).on('resize',function () {
                $(".items").waterFall({padding:10});
            });
    
  • 相关阅读:
    【转】HTTP 状态码详解
    程序员自我提升之粗粮与细粮
    配置Eclipse支持MacBook Pro Retina屏幕的办法(解决Retina屏幕下eclipse字体变虚的问题)
    IE6下lineheight失效:当文字与图片img在同一行中显示时lineheight失效的解决办法
    2013年第二周的总结
    为什么这么多的云存储产品却没有一个能够统一管理它们的应用出现
    微软的云笔记:OneNote+SkyDrive
    完美的外出上网解决方案随身随地享用你的专有WIFI网络(3G无线路由器+sim卡卡托+3G资费卡)
    [转]如何才能更加有效率
    Perl Note
  • 原文地址:https://www.cnblogs.com/caijunjun/p/6701554.html
Copyright © 2011-2022 走看看