炫酷的jquery瀑布流

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

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

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

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

</ul>
</div>

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

下面主要是js;

var number=0;
    var sindex=0;
    var arr=[];                                      //存放每列高度的数组
    calc()
    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是执行计算的函数。

 1 window.onscroll=function(){
 2         if($(window).scrollTop()+$(window).height()+20>$(document).height()){
 3         //alert(23)
 4             $.each(data,function(i,val){
 5                 var sHtml=‘<li><div class="wrap"><div class="img"><img src="images/‘+val.src+‘"/></div>‘
 6                 sHtml+=‘<div class="text">‘+val.title+number+‘</div></div></li>‘
 7                 $("ul").append(sHtml)
 8                 number++
 9             })
10             calc()
11         }
12     }
13     window.onload=function(){
14         //alert(23)
15             $.each(data,function(i,val){
16                 var sHtml=‘<li><div class="wrap"><div class="img"><img src="images/‘+val.src+‘"/></div>‘
17                 sHtml+=‘<div class="text">‘+val.title+number+‘</div></div></li>‘
18                 $("ul").append(sHtml)
19                 number++
20             })
21             setTimeout(calc,10)
22     }

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

 1 function calc(){
 2         var $_li=$(‘li‘);
 3         var length=$_li.length;
 4         var li_width=$("li").eq(0).outerWidth();
 5         var pad_width=$("li").eq(0).width();
 6         var documentWidth=$(window).width();
 7         var column=Math.floor(documentWidth/li_width);   //每一行可显示的图片数
 8         $("ul").css("width",column*li_width) ;           //计算外围容器宽度
 9           for(i=sindex;i<length;i++){
10               if(i<column){                                //第一列图片正常排列
11                   arr[i]=$_li.eq(i).outerHeight();
12                   $_li.eq(i).css({"position":‘absolute‘,                         //元素设为绝对定位
13                         "left":i*li_width,
14                         "top":100,
15                         "opacity":"0",
16                         ‘width‘:"0px"
17                         }).addClass("ani")
18                   $_li.eq(i).animate({
19                            opacity:"1",
20                            top:"0px",
21                            left:i*li_width,
22                            width:pad_width
23                   },700)
24               }else{
25                   var minHeight=Math.min.apply(null,arr)  //计算最小高度确定位置
26                   //console.log(arr)
27                   var index=compare(minHeight,arr);
28                   put($_li,i,index,column,minHeight)
29                   arr[index]+=$_li.eq(i).outerHeight()
30               }
31               console.log(minHeight)
32         }
33         sindex=length
34
35     }

主要的元素,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。如下:

 1 function compare(height,sum){
 2         var $_length=sum.length;
 3         for(j=0;j<$_length;j++){
 4             if(sum[j]==height){
 5                return j
 6             }
 7         }
 8     }
 9     function put(obj,index,minIndex,column,height){
10         obj.eq(index).css({"position":‘absolute‘,                         //元素设为绝对定位
11                         "left":obj.eq(Math.floor(column/2)).css("left"),
12                         "top":parseInt(height)+100,
13                         "opacity":"0",
14                         ‘width‘:"0px"
15                         }).addClass("ani")
16         obj.eq(index).stop().animate({
17                  opacity:"1",
18                  top:height,
19                  left:obj.eq(minIndex).css("left"),
20                  width:"280px"
21         },700)
22     }

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:1}
    20%{opacity:0.5}
    100%{opacity:1}
}
@-moz-keyframes fadein{
    0%{opacity:1}
    20%{opacity:0.5}
    100%{opacity:1}
}
@-ms-keyframes fadein{
    0%{opacity:1}
    20%{opacity:0.5}
    100%{opacity:1}
}
@-o-keyframes fadein{
    0%{opacity:1}
    20%{opacity:0.5}
    100%{opacity:1}
}
@-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 ,努力吧!

有错误欢迎随时指出。

时间: 2024-11-07 17:38:57

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

8款实用的Jquery瀑布流插件

1.网友Null分享Jquery响应式瀑布流布局插件 首先非常感谢网友Null的无私分享,此作品是一款响应式瀑布流布局Jquery插件,网友Null增加了一个屏幕自适应和响应式,响应式就是支持智能手机浏览,效果非常棒,遗憾的是不支持IE9以下版本,所以网友们在演示的时候请使用谷歌.火狐等浏览器... 分享JquerySchool网站里面的8款Jquery瀑布流插件 2.网友sole分享23行Jquery代码实现定位瀑布流布局特效 首先非常感谢网友sole的无私分享,此Jquery特效是我从互联网

炫酷的jQuery对话框插gDialog

js有alert,prompt和confirm对话框,不过不是很美体验也不是很好,用jQuery也能实现, 体验效果:http://hovertree.com/texiao/jquery/34/ 代码如下: <!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE

超炫酷的jQuery/HTML5应用效果及源码

jQuery非常强大,我们之前也用jQuery分享过很多实用的插件.HTML5可以让网页变得更加绚丽多彩,将HTML5和jQuery结合使用那将发挥更棒的效果. 今天向大家收集了一些关于HTML5和jQuery的应用及其源码,一起来看看. HTML5动感的火焰燃烧动画特效 这又是一款基于HTML5的超炫动画特效,是一款动感的火焰燃烧动画效果.这款HTML5动画火焰燃烧非常逼真. 核心jQuery代码: $( document ).ready(function() { // Set canvas

[Jquery]瀑布流

$(window).load(function(e){    waterfall();    var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]};    $(window).scroll(function(){        if(checkscrollside){            var $main=$("#main");            $.each

jQuery超酷响应式瀑布流效果

参考 http://www.sucaihuo.com/js/74.html <script src="scripts/blocksit.min.js"></script> 1 2 3 4 5 6 7 8 <div  id="container">     <div  class="grid">         <!-- content -->     </div>     &

jQuery瀑布流插件——jQuery.Waterfall

插件--jQuery.Waterfall 思路: 其实只要了解了整个流程,要实现这个插件也不难,大家都玩过俄罗斯方块吧,原理差不多,找到合适的地方叠上去就好了,在这里,每个块的宽度是必需给定的,然后计算出列数,再维护一个数组,存储每列的高度,往最小高度的列添加块即可.滚动时,当最小高度出现在可视窗口时就启动ajax从服务器拉取更多的数据. 注意的地方: 如果瀑布流的块中包含图片,则需要事先知道图片的高度(其实就是为了要计算出整个块的高度,以便精确定位),图片的高度可以从服务器返回,本插件是整合p

jQuery瀑布流无限拖三大利器:masonry+imagesloaded+infinitescroll

瀑布流已经是几乎过时的技术了,不过对于很多想要快速实现它的朋友而言,却绝非易事,因为即使我们已经有很多现成的代码,却发现在自己的开发环境中无法快速得到自己想要的结果.就像我们现在要介绍的三大利器(masonry+imagesloaded+infinitescroll)即使它们是如此有效,却在马上要使用的时候让我们拿着如烫手山芋班很难真正达到我们想要的效果. 下面,我们从其原理来讲解它们的使用,以帮助你更好的发挥它的功效.但为了快速实现,我们不讲解它们的全部内容. 1. 合理的HTML布局是问题的

超炫酷的jQuery轮播焦点图 底部带切换缩略图

详细内容请点击 前面我们刚刚分享过一款jQuery/HTML5响应式焦点图动画应用,效果非常炫酷.这次我们再来分享一款基于jQuery的图片轮播焦点图,这款jQuery焦点图的特点是整个图片播放器是宽屏的效果,并且在焦点图底部有一排可以滑动的缩略图,点击缩略图可以快速跳转到相应的图片.  在线演示源码下载 学习来源:http://www.html5tricks.com/jquery-cool-image-slider-thumb.html 更多html5内容请点击

8个超炫酷的jQuery相册插件欣赏

在网页中,相册应用十分常见,如果你经常逛一些社交网站,那么你应该会注意到很多各式各样的网页相册应用.今天我们要来分享一些最新收集的jQuery相册插件,这些精美的jQuery相册插件可以帮助你快速搭建自己的相册浏览系统,对那些JS功底不怎么好的同学应该会有不少帮助. 1.jQuery幻灯片播放器插件 可自动播放图片 之前我们分享过很多炫酷和实用的jQuery焦点图插件,比如jQuery仿Flash横向切换焦点图插件.今天我们要再介绍一个jQuery幻灯片播放器插件,它的功能很齐全,不仅可以手动切