炫酷的jquery瀑布流

时间:2022-01-20 03:52:45

炫酷的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瀑布流的更多相关文章

  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&quot ...

  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&period;Waterfall

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

随机推荐

  1. C&sol;C&plus;&plus;内存泄漏及检测

    参考 http://www.cnblogs.com/skynet/archive/2011/02/20/1959162.html

  2. remove mysql

    apt-get --purge remove mysql-server mysql-client mysql-common apt-get autoremove rm -rf /etc/mysql r ...

  3. 个人网页的留言板实现与sae的数据库账户配置

    个人网页(github)的留言板终于搞定了.总之后端的东西不会写,只有修改以前教程里面的文件.记录一下重要的过程. 使用了留言保存的send()函数,模版有注册登录功能.根据需求修改了一下,去掉了登录 ...

  4. 【BZOJ-1009】GT考试 KMP&plus;DP&plus;矩阵乘法&plus;快速幂

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2745  Solved: 1694[Submit][Statu ...

  5. eclipse内置tomcat启动方法

    tomcat:run -Dmaven.tomcat.port=

  6. 怎样用Google APIs和Google的应用系统进行集成&lpar;1&rpar;----Google APIs简介

    Google的应用系统提供了非常多的应用,比方 Google广告.Google 任务,Google 日历.Google blogger,Google Plus,Google 地图等等非常的多的应用,请 ...

  7. hdu1166 敌兵布阵

    敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动 ...

  8. Java进阶&lpar;三十三&rpar;java基础-filter

    java基础-filter 我们先看看没有filter的时候,整个web客户端-服务端的一个流程. 接下来我们再看看引入了filter之后的Uml图.尝试分析这两者之间的差别. filter从哪里来? ...

  9. 怎样写一个与Win8 IE11兼容的标准BHO?

    怎样写一个与Win8 IE11兼容的标准BHO? 环境:Windows8.1 x86 IE11(其它环境未讨论) 作者:magictong 日期:2014/02/02 概述 微软在2013年6月份推出 ...

  10. L1-Day12

    1.凡是杀不死你的都会让你变得更强.(什么关系?主语是什么?)[我的翻译]There is no killing you makes you stronger.[标准答案]What doesn’t k ...