javascript 瀑布流

23 篇文章 0 订阅
15 篇文章 0 订阅
 

现在图片网与商城流行一种叫“瀑布流”的布局,我们公司也不小心得了“流行性感冒”,要搞这个。于是我就写了一个,现在再用我的框架mass重写一下,发布出来,顺便宣传一下我的框架。

瀑布流其实没什么东西,就是列布局与无限拖的结合。由于要支持IE6就没有CSS3,直接对列进行绝对定位。列就是一个DIV。然后就是列中每个板块的添加问题,我管它为砖头。每添加一块砖头前,比较一下哪列最短,就往哪里塞。最后就是无限拖,太easy了。加之,我的框架对样式,事件等设置非常简单,比jQuery更方便。

下面就是源码,用到了并行加载技术,预设时加载了random,ready,css,event这几个模块,它们就会自行加载其依赖模块了。

$.require( "more/random,ready,css,event" , function (random){
     //容器的CSS表达式,列数,每列的宽度
     var Waterfall = function (expr, col, colWidth){
         //构建整体轮廓
         var container = this .container = $(expr);
         var pw = container.width(); //容器的宽
         var gw = (pw - col * colWidth)/(col-1); //列间距离
         this .colWidth = colWidth;
         this .cols = [];
         for ( var i = 0; i < col ; i++){ //随机生成列
             this .cols[i] = $( "<div class='waterfall' />" ).css({
                 position: "absolute" ,
                 top: 0,
                 left: (colWidth + gw) * i,
                 width: colWidth,
                 backgroundColor: random.hex()
             }).appendTo(container);
         }
     }
     Waterfall.prototype = {
         //添加板块
         addBlocks : function (){
             for ( var i = 0; i < 40; i++){ //随机生成40个板砖
                 $( "<div class='waterfall_block' />" ).css({
                     margin: 5,
                     width: this .colWidth - 10 ,
                     height: random.num(80, 300),
                     backgroundColor: random.hex()
                 }).appendTo( this .whichCol() );
             }
         },
         //计算出最短的栏栅
         whichCol: function (el, ret, h){
             for ( var i = 0, shortest = 0; el = this .cols[i]; i++){
                 h = el.height();
                 if (i == 0){
                     shortest = h;
                     ret = el;
                 }
                 if (h < shortest ){
                     shortest = h;
                     ret = el;
                 }
             }
             return ret;
         }
     };
 
     var waterfall = new Waterfall( "body" ,4,300)
     waterfall.addBlocks();
     $(window).scroll( function (){
         var clientHeight = $(window).height(),
         scrollTop = $(window).scrollTop(),
         scrollHeight = $(document).height();
         if (clientHeight + scrollTop >=  scrollHeight ){
             waterfall.addBlocks();
         }
     })
})

源码放于github中。

IE下如果报错,请它刷新页面

最后附上微博上对它的评论:Pinterest创造的瀑布流样式,有几个预设前提:1、图片极重要,文字不重要;2、用户浏览无明确目的,对复杂的索引无依赖性;3、图片整体美观度较高。因此恰恰适合Pinterest这样的“好图挖掘与收藏网站”。最近几个月国内跟风瀑布流,也太盲目了些。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里是一个简单的 JavaScript 瀑布流实现的代码,可以供您参考: ```html <!DOCTYPE html> <html> <head> <title>瀑布流示例</title> <style> #container { width: 800px; margin: 0 auto; } .item { width: 380px; margin: 10px; padding: 10px; border: 1px solid #ccc; float: left; background-color: #f0f0f0; } </style> </head> <body> <div id="container"> <div class="item">这是第一个瀑布流元素</div> <div class="item">这是第二个瀑布流元素</div> <div class="item">这是第三个瀑布流元素</div> ... <div class="item">这是最后一个瀑布流元素</div> </div> <script> window.onload = function() { var container = document.getElementById('container'); var items = container.getElementsByClassName('item'); var columns = 3; // 3列 var column_heights = [0, 0, 0]; // 列高度初始化为0 for (var i = 0; i < items.length; i++) { var shortest_column = 0; for (var j = 1; j < columns; j++) { if (column_heights[j] < column_heights[shortest_column]) { shortest_column = j; } } items[i].style.left = (shortest_column * 400) + 'px'; // 400是item的宽度加上margin的宽度 items[i].style.top = column_heights[shortest_column] + 'px'; column_heights[shortest_column] += items[i].offsetHeight + 20; // 20是item的margin-top和margin-bottom的高度 } } </script> </body> </html> ``` 这个代码实现了一个简单的瀑布流布局,包含了3列,每列宽度固定为380px,每个元素之间有10px的margin。代码中使用了JavaScript来计算每个元素的位置,首先初始化每列的高度为0,然后依次遍历每个元素,找到当前高度最短的列,将元素放在该列下面,更新该列的高度。元素的位置使用CSS的left和top属性来控制。 当然,这只是一个简单的瀑布流实现,实际上还有很多细节需要考虑,比如异步加载图片、滚动加载等等。如果您需要实现一个完整的瀑布流布局,建议使用现成的库或框架,比如Masonry、Isotope等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值