• 瀑布流布局实现总结


      瀑布流最早出现在Pinterest上。

      然后在国内大大小小的网站上疯狂流行。花瓣美丽说Mark之蘑菇街点点网,以及淘宝最新上线的“哇哦” 等等。

      这种布局适合于小数据块,每个数据块内容相近且没有侧重。通常,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。所以,我们给这样的布局起了一个形象的名字 — 瀑布流式布局

    一、总览

    淘宝UED介绍:http://ued.taobao.com/blog/2011/09/waterfall/

     

    二、实现思路

    (1) 传统多列浮动。即 蘑菇街和哇哦 采用的方式,如下图所示:

    • 各列固定宽度,并且左浮动;
    • 一列中的数据块为一组,列中的每个数据块依次排列即可;
    • 更多数据加载时,需要分别插入到不同的列上;
    • 线上例子

    优点:

       1. 布局简单,应该说没啥特别的难点;

      2. 不用明确知道数据块高度,当数据块中有图片时,就不需要指定图片高度。

    缺点:

      1.列数固定,扩展不易,当浏览器窗口大小变化时,只能固定的x列,如果要添加一列,很难调整数据块的排列;

       2. 滚动加载更多数据时,还要指定插入到第几列中,还是不方便。

    (2) CSS3 定义。W3C 中有讲述关于多列布局的文档,排列出来的样子:

    • 由 chrome/ff 浏览器直接渲染出来,可以指定容器的列个数,列间距,列中间边框,列宽度来实现;

    优点:

      1.直接 CSS 定义,最方便了;

      2.扩展方便,直接往容器里添加内容即可。

    缺点:

      1.只有高级浏览器中才能使用而且,更适合于文字多栏排列

      2.还有一个缺点,他的数据块排列是从上到下排列到一定高度后,再把剩余元素依次添加到下一列,这个本质上就不一样了;

    (3) 绝对定位。即 Pinterest ,Mark之,KISSY 采用的方式:


      可谓是最优的一种方案,方便添加数据内容,窗口变化,列数/数据块都会自动调整;

      线上例子

    缺点:

      1. 需要实现知道数据块高度,如果其中包含图片,需要知道图片高度;

      2. JS 动态计算数据块位置,当窗口缩放频繁,可能会狂耗性能。

    三、代码实现

    首选:masonry 插件   http://masonry.desandro.com/   Masonry是一 个用来布局的jQuery插件,国内外大量网站在使用它实现瀑布流布局,Pinterest 使用的也是此方法,简洁易用,代码量少,这真是极好的。

    其他方法:  1. 淘宝kissy waterfall  http://docs.kissyui.com/docs/html/demo/component/waterfall/ ;

           2. jquery.waterfall 插件;

           3. 蓝色梦想——Ublue jQuery Waterfall,准备自己动手尝试一下的同学,可以参考借鉴一下。 

    masonery 最好在github上下载 https://github.com/desandro/masonry/tree/gh-pages  有masonry.js  和 jquery.masonry.js,在此我们使用Jquery版。

    【插件参数】

    itemSelector     class选择器,默认'.item'
    columnWidth     一列的宽度
    isAnimated     使用jquery的布局变化,默认true
    animationOptions     animate属性渐变效果(Object { queue: false, duration: 500 })
    gutterWidth     列的间隙 Integer
    isFitWidth     适应宽度Boolean
    isResizableL     是否可调整大小 Boolean
    isRTL     使用从右到左的布局 Boolean

    example.1

    js代码:

    <script type="text/javascript" src="jquery.min.js"></script>
    <script type="text/javascript" src="jquery.masonry.min.js"></script>
    <script>
    $(function(){
        $('.container').masonry({
            itemSelector : '.item'    
        });
    });
    </script>

    css 代码:  

    .container {
      background: #EEE;
      margin-bottom: 20px;
      position: relative;
    }
    .item {
      width:182px;
      padding:4px;
      float: left;
      border: 1px solid;
      background: #09F;
    }
    .h1{height:120px;}
    .h2{height:150px;}
    .h3{height:240px;}
    .h4{height:330px;}

    html 代码:

        <div class="container">
            <div class="item h2"></div>
            <div class="item h4"></div>
            <div class="item h1"></div>
            <div class="item h1"></div>
            <div class="item h3"></div>
            <div class="item h4"></div>
            <div class="item h2"></div>
            <div class="item h2"></div>
            <div class="item h1"></div>
            <div class="item h1"></div>
            <div class="item h1"></div>
            <div class="item h3"></div>
        </div>

    效果:

    example.2  排列图片 

    使用imagesLoaded函数在图像加载完成后才开始排列图片。

     jquery.masonry.js中内置了imagesLoaded Plugin,我们可以结合使用此功能。

    <script>
    $(function(){
         var $container = $('#container');
    
        $container.imagesLoaded( function(){
                $container.masonry({
                    itemSelector : '.item'
            });
        });
    });
    </script>

    3、滚动动画

    <script>
    $(function(){
         var $container = $('#container');
    
        $container.imagesLoaded( function(){
            $container.masonry({
                itemSelector : '.item',
                isAnimated : true
            });
        });
    });
    </script>

    /* CSS3 实现动画*/
    
    #container,
    .item {
        -webkit-transition-duration: 0.7s;
        -moz-transition-duration: 0.7s;
        -ms-transition-duration: 0.7s;
        -o-transition-duration: 0.7s;
        transition-duration: 0.7s;
    }
    
    #container {
        -webkit-transition-property: height, width;
        -moz-transition-property: height, width;
        -ms-transition-property: height, width;
        -o-transition-property: height, width;
        transition-property: height, width;
    }
    
    .item {
        -webkit-transition-property: left, right, top;
        -moz-transition-property: left, right, top;
        -ms-transition-property: left, right, top;
        -o-transition-property: left, right, top;
        transition-property: left, right, top;
    }

    4、固定宽度

      添加css样式

    #container {
        width: 1000px;
    }
  • 相关阅读:
    如何解决由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例。该连接将关闭。
    客户端中检测到有潜在危险的Request.Form 值的处理办法 VS2010 .NET 4.0
    VS2010中解决数据集和ObjectDataSource无法自动生成UPDATA和DELETE方法
    使用Eclipse的几个必须掌握的快捷方式
    使用OjectDataSource数据源绑定ListView 高效分页
    NVIDIA SDK 10
    [转]我要的不多
    本月推荐电影
    加/解密
    GDC 2007 Presentations of NV now available.
  • 原文地址:https://www.cnblogs.com/v10258/p/3256844.html
Copyright © 2020-2023  润新知