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

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

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. php判断当前的访问是手机还是电脑

    <?php function check_wap() { if (isset($_SERVER['HTTP_VIA'])) return true; if (isset($_SERVER['HT ...

  2. js或jquery实现页面打印可局部打印

    方法一:直接用js的打印方法 <input id="btnPrint" type="button" value="打印" onclic ...

  3. PHP json数据格式化方法

    php 的json_encode能把数组转换为json格式的字符串.字符串没有缩进,中文会转为unicode编码,例如\u975a\u4ed4.人阅读比较困难.现在这个方法在json_encode的基 ...

  4. 【leetcode】Candy

    题目描述: There are N children standing in a line. Each child is assigned a rating value. You are giving ...

  5. hdu 4031 2011成都赛区网络赛A题 线段树 ***

    就是不知道时间该怎么处理,想了好久,看了别人的题解发现原来是暴力,暴力也很巧妙啊,想不出来的那种  -_-! #include<cstdio> #include<iostream&g ...

  6. checkbox全选和子选

    用jq: $(function() { var $subBox = $("input[name='subBox']"); $("#checkAll").clic ...

  7. LoadRunner编程之跳出迭代

    LoadRunner编程之跳出迭代 51Testing软件测试网3p6pK.Yo LoadRunner中 提供了函数exit(-1)来结束迭代. 使用return 0 来结束本次迭代,进入下一次迭代. ...

  8. WinForm支持拖拽效果

    有一个MSDN客户提问在WinForm中如何实现拖拽效果——比如在WinForm中有一个Button,我要实现的效果是拖拽这个Button到目标位置后生成一个该控件的副本. 其实这个操作主要分成三步走 ...

  9. POJ 2774 后缀数组

    题目链接:http://poj.org/problem?id=2774 题意:给定两个只含小写字母的字符串,求字符串的最长公共子串长度. 思路:根据<<后缀数组——处理字符串的有力工具&g ...

  10. Ipython console in Spyder stuck on “connecting to kernel”

    简短地记录下,今天排除的spyder的BUG, 现象:打开Spyder时其他正常,但是Ipython console 不能正常获取到kernel,一直转圈,显示“connecting to kerne ...