炫酷的jquery瀑布流

最近做了一个瀑布流效果,思路很简单
首先计算屏幕一行可以放多少个图片,然后在第二行开始,计算每一列的高度并取出最小值,将新图片加载在最小列高度下,如此循环,并且设定一个条件,当滑动到一定距离后,开始重新加载。当然中间我们可以加上一些动画效果,让网页看起来更炫酷一些。
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瀑布流的更多相关文章
- 8款实用的Jquery瀑布流插件
1.网友Null分享Jquery响应式瀑布流布局插件 首先非常感谢网友Null的无私分享,此作品是一款响应式瀑布流布局Jquery插件,网友Null增加了一个屏幕自适应和响应式,响应式就是支持智能手机 ...
- 炫酷的jQuery对话框插gDialog
js有alert,prompt和confirm对话框,不过不是很美体验也不是很好,用jQuery也能实现, 体验效果:http://hovertree.com/texiao/jquery/34/ 代码 ...
- jQuery瀑布流从不同方向加载3种效果演示
很实用的一款插件jQuery瀑布流从不同方向加载3种效果演示在线预览 下载地址 实例代码 <section class="grid-wrap"> <ul clas ...
- 一款非常炫酷的jQuery动态随机背景滚动特效
一款非常炫酷的jQuery动态随机背景滚动特效 图片背景会不停息的滚动,带有那种漂浮的视觉效果,小圈圈飘动. 更好的是还兼容IE6浏览器,大伙可以好好研究研究. 适用浏览器:IE6.IE7.IE8.3 ...
- jquery瀑布流排列样式代码
<!DOCTYPE html><html><head lang="en"> <meta charset="gb2312" ...
- 10个非常炫酷的jQuery相册动画赏析
我们经常可以在网页上看到形式各异的jQuery相册插件,由于现在浏览器对HTML5和CSS3的兼容越来越好了,所以很多jQuery相册插件都运用了CSS3的相关特性,形成了许多炫酷的动画特效.本文收集 ...
- jQuery超酷响应式瀑布流效果
参考 http://www.sucaihuo.com/js/74.html <script src="scripts/blocksit.min.js"></scr ...
- jquery瀑布流的制作
首先,还是来看一下炫酷的页面: 今天就边做边说了: 一.准备工作 新建css,js,img文件夹存放相应文件,并在demo.html文件中引入外部文件(注意要把jquery文件引入),这里就不过多描述 ...
- jQuery瀑布流插件——jQuery.Waterfall
插件--jQuery.Waterfall 思路: 其实只要了解了整个流程,要实现这个插件也不难,大家都玩过俄罗斯方块吧,原理差不多,找到合适的地方叠上去就好了,在这里,每个块的宽度是必需给定的,然后计 ...
随机推荐
- 【Jquery】【控件】flexigrid 自定义查询
最近用flexigrid作报表,需要自定义条件进行查询,界面如下: 翻了半天文档也没找到如何用POST方法自行传递参数进行查询. 找了一个台湾人写的博客,却要改flexigrid的源代码,更不靠谱. ...
- 算法系列:HMM
隐马尔可夫(HMM)好讲,简单易懂不好讲. 用最经典的例子,掷骰子.假设我手里有三个不同的骰子.第一个骰子是我们平常见的骰子(称这个骰子为D6),6个面,每个面(1,2,3,4,5,6)出现的概率是1 ...
- 对服务器的ftp端口进行修改
对服务器的ftp端口进行了修改,把21端口改了,比如221端口,就这样用221连接的时候,连接登录成功,但打不开目录,为何,总结如下: 1.完成一个FTP的传输过程不仅仅只需要21一个端口,而是2个端 ...
- ORA-03113:通信通道的文件结尾解决
今天跟往常一样,登陆PL/SQL,确登陆失败,出现一个错误“ORA-01034”和“ORA-27101”如图: 然后就就通过命令提示符去登陆Oracle,去查看怎么回事,然后问题进一步出现,错误“OR ...
- 提供给Android和iOS开发人员的UWP移植向导
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:前几天微软发布了一个针对Android和iOS开发人员理解Windows Apps概念 ...
- Linux SSH远程文件/目录传输命令scp
转载地址:http://www.vpser.net/manage/scp.html 相信各位VPSer在使用VPS时会经常在不同VPS间互相备份数据或者转移数据,大部分情况下VPS上都已经安装了Ngi ...
- C# 编码转换 UTF8转GB2312 GB2312转UTF8
/// <summary> /// GB2312转换成UTF8 /// </summary> /// <param name="text">&l ...
- Linux学习笔记(20) Linux系统管理
1.进程管理 进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源. 进程管理的作用有判断服务器健康状态.查看系统中所有进程及杀死进程.一般都可以采用 ...
- EventBus的使用,数据传递
通常情况下安卓下数据的传递有下面几种方法: 1.通过intent传递,包括显式意图和隐式意图,广播(Broadcast)和服务都能通过Intent传递 传递的数据类型包括8大基本数据类型 实现P ...
- ZK常用命令
zkcli脚本命令介绍 zkcli 连接默认zookeeper服务器 zkcli -server ip:port 连接指定的zookeeper服务器 create -s -e path d ...