最近做了一个瀑布流效果,思路很简单

首先计算屏幕一行可以放多少个图片,然后在第二行开始,计算每一列的高度并取出最小值,将新图片加载在最小列高度下,如此循环,并且设定一个条件,当滑动到一定距离后,开始重新加载。当然中间我们可以加上一些动画效果,让网页看起来更炫酷一些。

html'比较简单,这里用了li元素,给每个li外围设置了padding,内部容器设定颜色,以达成元素间隔效果,这样避免了使用maring元素最后一个还要特殊处理,当然我们还可以通过给ul设置负的margin值来解决这个问题,不过由于后面要进行很多处理所以设置了padding。

<div class="container">
<ul>
<!-- <li>
<div class='wrap'>
<div class="img">
<img src="data:images/1.jpg" />
</div>
<div class="text">瀑布流测试demo</div>
</div>
</li>
<li>
<div class='wrap'>
<div class="img">
<img src="data:images/2.jpg" />
</div>
<div class="text">瀑布流测试demo</div>
</div>
</li>
<li>
<div class='wrap'>
<div class="img">
<img src="data:images/3.jpg" />
</div>
<div class="text">瀑布流测试demo</div>
</div>
</li>
<li>
<div class='wrap'>
<div class="img">
<img src="data:images/4.jpg" />
</div>
<div class="text">瀑布流测试demo</div>
</div>
</li>
<li>
<div class='wrap'>
<div class="img">
<img src="data:images/5.jpg" />
</div>
<div class="text">瀑布流测试demo</div>
</div>
</li>
<li>
<div class='wrap'>
<div class="img">
<img src="data:images/6.jpg" />
</div>
<div class="text">瀑布流测试demo</div>
</div>
</li>
<li>
<div class='wrap'>
<div class="img">
<img src="data:images/7.jpg" />
</div>
<div class="text">瀑布流测试demo</div>
</div>
</li>
<li>
<div class='wrap'>
<div class="img">
<img src="data:images/8.jpg" />
</div>
<div class="text">瀑布流测试demo</div>
</div>
</li>
<li>
<div class='wrap'>
<div class="img">
<img src="data:images/9.jpg" />
</div>
<div class="text">瀑布流测试demo</div>
</div>
</li>
<li>
<div class='wrap'>
<div class="img">
<img src="data:images/10.jpg" />
</div>
<div class="text">瀑布流测试demo</div>
</div>
</li>
<li>
<div class='wrap'>
<div class="img">
<img src="data:images/11.jpg" />
</div>
<div class="text">瀑布流测试demo</div>
</div>
</li>--> </ul>
</div>

中间的li列表隐藏掉了,可有可无,效果都一样。

下面主要是js;

var number=0;
var sindex=0;
var arr=[]; //存放每列高度的数组
var data = [
{'src':'1.jpg','title':'瀑布流测试'},
{'src':'2.jpg','title':'瀑布流测试'},
{'src':'3.jpg','title':'瀑布流测试'},
{'src':'4.jpg','title':'瀑布流测试'},
{'src':'5.jpg','title':'瀑布流测试'},
{'src':'6.jpg','title':'瀑布流测试'},
{'src':'7.jpg','title':'瀑布流测试'},
{'src':'8.jpg','title':'瀑布流测试'},
{'src':'9.jpg','title':'瀑布流测试'},
{'src':'10.jpg','title':'瀑布流测试'},
{'src':'11.jpg','title':'瀑布流测试'}
];

第一步设定了变量,number为每个元素的索引,arr为存储每列高度数组,并通过data数组来模拟加载。calc是执行计算的函数。

 window.onscroll=function(){
if($(window).scrollTop()+$(window).height()+20>$(document).height()){
//alert(23)
$.each(data,function(i,val){
var sHtml='<li><div class="wrap"><div class="img"><img src="data:images/'+val.src+'"/></div>'
sHtml+='<div class="text">'+val.title+number+'</div></div></li>'
$("ul").append(sHtml)
number++
})
calc()
}
}
window.onload=function(){
//alert(23)
$.each(data,function(i,val){
var sHtml='<li><div class="wrap"><div class="img"><img src="data:images/'+val.src+'"/></div>'
sHtml+='<div class="text">'+val.title+number+'</div></div></li>'
$("ul").append(sHtml)
number++
})
setTimeout(calc,10)
}

在页面加载,页面滚动到下部时,我们循环生成li元素,并且执行calc方法,在页面加载时,对calc函数进行了延时处理,如果直接执行,会出现计算错误,不知道还有没有更好的办法解决。

 function calc(){
var $_li=$('li');
var length=$_li.length;
var li_width=$("li").eq(0).outerWidth();
var pad_width=$("li").eq(0).width();
var documentWidth=$(window).width();
var column=Math.floor(documentWidth/li_width); //每一行可显示的图片数
$("ul").css("width",column*li_width) ; //计算外围容器宽度
for(i=sindex;i<length;i++){
if(i<column){ //第一列图片正常排列
arr[i]=$_li.eq(i).outerHeight();
$_li.eq(i).css({"position":'absolute', //元素设为绝对定位
"left":i*li_width,
"top":100,
"opacity":"0",
'width':"0px"
}).addClass("ani")
$_li.eq(i).animate({
opacity:"1",
top:"0px",
left:i*li_width,
width:pad_width
},700)
}else{
var minHeight=Math.min.apply(null,arr) //计算最小高度确定位置
//console.log(arr)
var index=compare(minHeight,arr);
put($_li,i,index,column,minHeight)
arr[index]+=$_li.eq(i).outerHeight()
}
console.log(minHeight)
}
sindex=length }

主要的元素,calc元素,通过屏幕宽度与li宽度进行每行可放置li的数量,其中第一行的元素直接赋值,每个元素的left为别为i*300,其中有些属性查了些资料才弄清楚。

jquery中获取元素宽度为width(),这个宽度只包括元素的width部分,而outerWidth()获取的宽度包括元素的padding与border,outerWidth(true)则默认包括margin。

在js中对应为offsetWidth。

获取元素相对于文档(document)的距离在jquery方法分别为offset().top,offset().left,js中为offsetHeight,offsetLeft。

在排列过程,我添加了透明度+top值得动画,同时运用css3属性进行了反转动画(scale(-1,1)效果等同于rotateY(180)).

在calc中运用了方法compare与put。如下:

 function compare(height,sum){
var $_length=sum.length;
for(j=0;j<$_length;j++){
if(sum[j]==height){
return j
}
}
}
function put(obj,index,minIndex,column,height){
obj.eq(index).css({"position":'absolute', //元素设为绝对定位
"left":obj.eq(Math.floor(column/2)).css("left"),
"top":parseInt(height)+100,
"opacity":"0",
'width':"0px"
}).addClass("ani")
obj.eq(index).stop().animate({
opacity:"1",
top:height,
left:obj.eq(minIndex).css("left"),
width:"280px"
},700)
}

css写的比较随意:

<style>
*{margin:0px;padding:0px}
body,html{background-color:#F5F5DC}
.container{margin:0px auto}
ul{margin:20px auto;width:auto;position:relative}
li{list-style-type:none;width:280px;padding:10px;float:left;margin-top:10px}
.wrap{background-color:#fff;box-shadow:5px 5px 10px #ccc;border-radius:10px;}
.img{padding:10px}
.img img{width:260px;border-radius:10px}
.text{height:40px;line-height:40px;text-align:center;font-family:"微软雅黑";font-size:18px}
.img img:hover{-webkit-animation:fadein ease-in-out 1s;-moz-animation:fadein ease-in-out 1s;-ms-animation:fadein ease-in-out 1s;-o-animation:fadein ease-in-out 1s}
.ani{-webkit-animation:scale 1s ease-in-out;-moz-animation:scale 1s ease-in-out;-ms-animation:scale 1s ease-in-out;-o-animation:scale 1s ease-in-out}
@-webkit-keyframes fadein{
0%{opacity:}
20%{opacity:0.5}
100%{opacity:}
}
@-moz-keyframes fadein{
0%{opacity:}
20%{opacity:0.5}
100%{opacity:}
}
@-ms-keyframes fadein{
0%{opacity:}
20%{opacity:0.5}
100%{opacity:}
}
@-o-keyframes fadein{
0%{opacity:}
20%{opacity:0.5}
100%{opacity:}
}
@-webkit-keyframes scale{
0%{-webkit-transform:scale(-1,1)}
50%{-webkit-transform:scale(1,1)}
}
@-moz-keyframes scale{
from{-moz-transform:scale(-1,1)}
to{-moz-transform:scale(1,1)}
}
@-ms-keyframes scale{
from{-ms-transform:scale(-1,1)}
to{-ms-transform:scale(1,1)}
}
@-o-keyframes scale{
from{-o-transform:scale(-1,1)}
to{-o-transform:scale(1,1)}
}
</style>

本来想按面向对象方向写,写着写着又写成了乱七八糟,没有专门学过编程,还是非常欠缺这个细胞的a ,努力吧!

有错误欢迎随时指出。

另自己新建立了一个qq群:85530789,欢迎志同道合的朋友一起多多交流技术。(现在好多技术群基本都聊不了多少真正的技术话题,失望了)

炫酷的jquery瀑布流的更多相关文章

  1. 8款实用的Jquery瀑布流插件

    1.网友Null分享Jquery响应式瀑布流布局插件 首先非常感谢网友Null的无私分享,此作品是一款响应式瀑布流布局Jquery插件,网友Null增加了一个屏幕自适应和响应式,响应式就是支持智能手机 ...

  2. 炫酷的jQuery对话框插gDialog

    js有alert,prompt和confirm对话框,不过不是很美体验也不是很好,用jQuery也能实现, 体验效果:http://hovertree.com/texiao/jquery/34/ 代码 ...

  3. jQuery瀑布流从不同方向加载3种效果演示

    很实用的一款插件jQuery瀑布流从不同方向加载3种效果演示在线预览 下载地址 实例代码 <section class="grid-wrap"> <ul clas ...

  4. 一款非常炫酷的jQuery动态随机背景滚动特效

    一款非常炫酷的jQuery动态随机背景滚动特效 图片背景会不停息的滚动,带有那种漂浮的视觉效果,小圈圈飘动. 更好的是还兼容IE6浏览器,大伙可以好好研究研究. 适用浏览器:IE6.IE7.IE8.3 ...

  5. jquery瀑布流排列样式代码

    <!DOCTYPE html><html><head lang="en"> <meta charset="gb2312" ...

  6. 10个非常炫酷的jQuery相册动画赏析

    我们经常可以在网页上看到形式各异的jQuery相册插件,由于现在浏览器对HTML5和CSS3的兼容越来越好了,所以很多jQuery相册插件都运用了CSS3的相关特性,形成了许多炫酷的动画特效.本文收集 ...

  7. jQuery超酷响应式瀑布流效果

    参考 http://www.sucaihuo.com/js/74.html <script src="scripts/blocksit.min.js"></scr ...

  8. jquery瀑布流的制作

    首先,还是来看一下炫酷的页面: 今天就边做边说了: 一.准备工作 新建css,js,img文件夹存放相应文件,并在demo.html文件中引入外部文件(注意要把jquery文件引入),这里就不过多描述 ...

  9. jQuery瀑布流插件——jQuery.Waterfall

    插件--jQuery.Waterfall 思路: 其实只要了解了整个流程,要实现这个插件也不难,大家都玩过俄罗斯方块吧,原理差不多,找到合适的地方叠上去就好了,在这里,每个块的宽度是必需给定的,然后计 ...

随机推荐

  1. 使用Modernizr探测HTML5/CSS3新特性(转载)

    转载地址:http://www.cnblogs.com/TomXu/archive/2011/11/18/detecting-html5-css3-features-using-modernizr.h ...

  2. 分佈式事務故障處理暨ORA-24756: transaction does not exist處理

    ORA-24756处理 看到警告日誌一直報ORA-24756錯誤 Errors in file /oracle/admin/NHMIX01/bdump/nhmix01_reco_4959.trc: O ...

  3. [Tools] maven-eclipse安装及配置

    [背景] 买了个surface,带到公司当做开发机器来用,各种环境都需要重新安装,写个笔记记录下maven安装步骤,虽然很简单,但是我这脑子,容易忘记,写下来以备用 [开工] 安装Maven 访问 M ...

  4. UDP穿透NAT原理解析

    转自:http://www.2cto.com/net/201201/116793.html NAT(Network Address Translators),网络地址转换:网络地址转换是在IP地址日益 ...

  5. 上四条只是我目前总结菜鸟们在学习FPGA时所最容易跑偏的地

    长期以来很多新入群的菜鸟们总 是在重复的问一些非常简单但是又让新手困惑不解的问题.作为管理员经常要给这些菜鸟们普及基础知识,但是非常不幸的是很多菜鸟怀着一种浮躁的心态来学习 FPGA,总是急于求成. ...

  6. Poisson Image Editing

    说起泊松,可以顺便提及一下泊松同学的老师,拉普拉斯.学图像或是信号的,一定对拉普拉斯算子和拉普拉斯卷积很熟悉.在泊松图像融合出现之前,也有一种叫Laplacian pyramid blending的融 ...

  7. 注解:【无连接表的】Hibernate单向N->1关联

    Person与Address关联:单向N->1,[无连接表的] Person.java package org.crazyit.app.domain; import javax.persiste ...

  8. Codeforces Round #143 (Div. 2) E. Cactus 无向图缩环+LCA

    E. Cactus   A connected undirected graph is called a vertex cactus, if each vertex of this graph bel ...

  9. linux下epoll如何实现高效处理百万句柄的

    linux下epoll如何实现高效处理百万句柄的 分类: linux 技术分享 2012-01-06 10:29 4447人阅读 评论(5) 收藏 举报 linuxsocketcachestructl ...

  10. loj 1429(可相交的最小路径覆盖)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1429 思路:这道题还是比较麻烦的,对于求有向图的可相交的最小路径覆盖,首先要解决成环问 ...