炫酷的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 思路: 其实只要了解了整个流程,要实现这个插件也不难,大家都玩过俄罗斯方块吧,原理差不多,找到合适的地方叠上去就好了,在这里,每个块的宽度是必需给定的,然后计 ...
随机推荐
- 解决IIS7、IIS7.5中时间格式显示的问题
今天在用IIS7的时候发现一个关于时间格式的问题,当我在ASP中使用now()时间函数的时候,日期是以"/"来分隔,而不是以"-"来分隔的,使得我在运行程序的时 ...
- C#的反射机制
using System; using System.Collections; using System.Collections.Generic; using System.IO; using Sys ...
- Ext Js【Hello World】 ——4.1 beta 1
准备:vs+ExtJs4.1Beta1 ExtJS 4.1 xiazai_ https://yunpan.cn/cqv6bdBwtRjAj (提取码:2733) 引用,cs文件,js主入口,zh—c ...
- 【转载】 Python动态生成变量
用Python循环创建多个变量, 如创建 a1= .a2= .a3= .a4= .a5= 或 self.a1= .self.a2= . self.a3= 一. 可以通 ...
- 2014百度之星资格赛 1004:Labyrinth(DP)
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- JavaScript中判断对象类型方法大全2
在JavaScript中,有5种基本数据类型和1种复杂数据类型,基本数据类型有:Undefined, Null, Boolean, Number和String:复杂数据类型是Object,Object ...
- Web API 使用上安全吗?
Web API入门指南有些朋友回复问了些安全方面的问题,安全方面可以写的东西实在太多了,这里尽量围绕着Web API的安全性来展开,介绍一些安全的基本概念,常见安全隐患.相关的防御技巧以及Web AP ...
- HTML - DOCTYPE
HTML - DOCTYPE HTML 5 doctype <!DOCTYPE html> HTML4.01 Based on SGML. so the browser need the ...
- linux文本模式下使用PPPOE拨号ADSL上网的方法
转自:http://www.myzhenai.com.cn/post/945.html 转载请注明出处:http://www.myzhenai.com/thread-15431-1-1.html ht ...
- BuildFilePath 及打开文件对话框
也许以后就主要在这里发SOUI的介绍了. 贴一段文件相关的helper, 测试一下贴代码是不是方便. /** * Copyright (C) 2014-2050 * All rights reserv ...