一个月前用jquery实现了瀑布流效果,看着当时的代码有点难过……今天抽时间稍微修改了一下。额,现在看起来不是那么难受了,就来和大家分享一下。废话不多说,开始正题~

  一、演示效果

  二、html代码

  1. <div class="header">header</div>
  2. <div class="box clearfix">
  3. <div class="waterFall">
  4. <ul>
  5. <li>
  6. <a href="#"><img src="data:images/image_1.png"/></a>
  7. <div><strong>图片1</strong></div>
  8. </li>
  9. <li>
  10. <a href="#"><img src="data:images/image_2.png"/></a>
  11. <div><strong>图片2</strong></div>
  12. </li>
  13. <li>
  14. <a href="#"><img src="data:images/image_3.png"/></a>
  15. <div><strong>图片3</strong></div>
  16. </li>
  17. <li>
  18. <a href="#"><img src="data:images/image_4.png"/></a>
  19. <div><strong>图片4</strong></div>
  20. </li>
  21. <li>
  22. <a href="#"><img src="data:images/image_5.png"/></a>
  23. <div><strong>图片5</strong></div>
  24. </li>
  25. <li>
  26. <a href="#"><img src="data:images/image_6.png"/></a>
  27. <div><strong>图片6</strong></div>
  28. </li>
  29. <li>
  30. <a href="#"><img src="data:images/image_7.png"/></a>
  31. <div><strong>图片7</strong></div>
  32. </li>
  33. <li>
  34. <a href="#"><img src="data:images/image_8.png"/></a>
  35. <div><strong>图片8</strong></div>
  36. </li>
  37. <li>
  38. <a href="#"><img src="data:images/image_9.png"/></a>
  39. <div><strong>图片9</strong></div>
  40. </li>
  41. <li>
  42. <a href="#"><img src="data:images/image_10.png"/></a>
  43. <div><strong>图片10</strong></div>
  44. </li>
  45. <li>
  46. <a href="#"><img src="data:images/image_11.png"/></a>
  47. <div><strong>图片11</strong></div>
  48. </li>
  49. <li>
  50. <a href="#"><img src="data:images/image_12.png"/></a>
  51. <div><strong>图片12</strong></div>
  52. </li>
  53. <li>
  54. <a href="#"><img src="data:images/image_13.png"/></a>
  55. <div><strong>图片13</strong></div>
  56. </li>
  57. <li>
  58. <a href="#"><img src="data:images/image_14.png"/></a>
  59. <div><strong>图片14</strong></div>
  60. </li>
  61. <li>
  62. <a href="#"><img src="data:images/image_15.png"/></a>
  63. <div><strong>图片15</strong></div>
  64. </li>
  65. <li>
  66. <a href="#"><img src="data:images/image_16.png"/></a>
  67. <div><strong>图片16</strong></div>
  68. </li>
  69. <li>
  70. <a href="#"><img src="data:images/image_17.png"/></a>
  71. <div><strong>图片17</strong></div>
  72. </li>
  73. <li>
  74. <a href="#"><img src="data:images/image_18.png"/></a>
  75. <div><strong>图片18</strong></div>
  76. </li>
  77. <li>
  78. <a href="#"><img src="data:images/image_19.png"/></a>
  79. <div><strong>图片19</strong></div>
  80. </li>
  81. <li>
  82. <a href="#"><img src="data:images/image_20.png"/></a>
  83. <div><strong>图片20</strong></div>
  84. </li>
  85. </ul>
  86. </div>
  87. </div>
  88. <div class="footer"></div>

  三、css代码

  1. .header {width: 1000px; height: 200px; background: url("images/header_bg.jpg") no-repeat; margin: auto; border: 1px solid #DDDDDD; box-shadow: 0 0 8px rgba(0,0,0,0.5)}
  2. .box {width: 1000px; margin: 10px auto; padding: 20px;}
  3. .waterFall {position: relative; height: auto;}
  4. .waterFall ul li {position: absolute; width: 200px; padding: 10px; border: 1px solid #CCCCCC; text-align: center; box-shadow: 0 0 5px rgba(0,0,0,0.5); background: #ffffff;}
  5. .waterFall ul li div {font-size: 16px;}
  6. .footer {width: 1000px; height: 200px; background: url("images/footer_bg.jpg") no-repeat top right; margin: auto; border: 1px solid #DDDDDD; box-shadow: 0 0 8px rgba(0,0,0,0.5)}

  四、js代码

  1. /* 等图片加载完成 */
  2. $(window).load(function(){
  3. var $waterFall = $(".waterFall"),
  4. li = '<li>'+
  5. '<a href="#"><img src=""/></a>'+
  6. '<div><strong></strong></div>'+
  7. '</li>',/* 要添加的li */
  8. liWidth = $waterFall.find("li").outerWidth(true), /* li宽度*/
  9. liHeight = [], /* li高度,随机的,由图片高度决定 */
  10. liLeft = 0, /* li距离左边位置 */
  11. liTop = [], /* li距离顶部位置 */
  12. leftDistance, /* li间距 */
  13. rowCount = 4, /* 一行显示的图片个数 */
  14. liAllCount = $waterFall.find("li").length, /* li总个数,也就是图片总个数 */
  15. scrollTop, /* 滚动条距离顶部的距离 */
  16. boxWidth = $(".box").width(), /* 盒子宽度 */
  17. wHeight, /* 窗口的高度 */
  18. page = 0; /* json数组中显示的页数 */
  19.  
  20. var event = {
  21. init: function(){
  22. /* 初始化li,给每个li定位 */
  23. $waterFall.find("li").each(function(){
  24. var _index = $(this).index();
  25. liTop[_index] = 0; /* 默认第一行图片距离顶部距离为0 */
  26. event.getLeftAndTop(_index);
  27. })
  28. },
  29. /* 设置li标签left和top值,li定位 */
  30. getLeftAndTop: function(index){
  31. var _row = index % rowCount; /* 第几列 */
  32. leftDistance = (boxWidth - liWidth*rowCount)/(rowCount-1); /* li间距 */
  33. liLeft = _row*(liWidth + leftDistance); /* 第index个图片距离左边距离 */
  34. liHeight[index] = $waterFall.find("li").eq(index).outerHeight(true); /* 表示第index个图片的高度 */
  35. if(index < rowCount){ /* 第一行,距离顶部距离都为0 */
  36. $waterFall.find("li").eq(index).css({left: liLeft+"px",top: 0});
  37. }else if(index >= rowCount){
  38. liTop[_row] += liHeight[index - rowCount] + 10; /* 行数大于2,高度自身以上距离+间距 */
  39. $waterFall.find("li").eq(index).css({left: liLeft+"px",top: liTop[_row]});
  40. }
  41. event.setMaxHeight();
  42. },
  43. /* 设计盒子高度,为了放置footer */
  44. setMaxHeight: function(){
  45. var newLiTop = [],maxHeight;
  46. for(var i = 0; i < liTop.length; i++){
  47. newLiTop[i] = liTop[i] + liHeight[i]; /* 得出四列的高度数组 */
  48. }
  49. maxHeight = Math.max.apply(Math,newLiTop); /* 选出高度最大值 */
  50. $waterFall.height(maxHeight); /* 赋值 */
  51. },
  52. scrollFun: function(){
  53. scrollTop = $(document).scrollTop();
  54. wHeight = $(window).height();
  55. if (($(window).height() + $(window).scrollTop()) >= $(document).height() - 10) { /* 当窗口高度+滚动条高度大于文档高度-10时触发ajax */
  56. $.ajax({
  57. url: "js/imagesUrl.json",
  58. dataType: "json",
  59. success: function(result){
  60. if(result[page] != undefined){
  61. var i, max = result[page].page.length; /* max为第page页的图片总个数 */
  62. for(i = 0; i< max; i++){
  63. $waterFall.find("ul").append(li);
  64. liAllCount = $waterFall.find("li").length - 1; /* 得出最末尾的index数 */
  65. $waterFall.find("li").eq(liAllCount).find("img").attr("src",result[page].page[i].url); /* 给图片url赋值 */
  66. $waterFall.find("li").eq(liAllCount).find("strong").text("图片"+i);
  67. event.getLeftAndTop(liAllCount); /* 调用图片定位 */
  68. }
  69. page++; /* 页数增加 */
  70. }
  71. }
  72.  
  73. })
  74. /* end ajax */
  75. }
  76. }
  77. }
  78.  
  79. /*---------------------------调用事件-------------------------*/
  80.  
  81. /* 初始化 */
  82. event.init();
  83.  
  84. /* 触发滚动条 */
  85. $(window).scroll(function(){
  86. event.scrollFun();
  87. })
  88.  
  89. })

  分析:

  制作瀑布流之前,我就在想想它是以什么形式出现的?不就是看起来像瀑布一样流线型出现的嘛(好抽象……)。图片高度宽度呢?宽度为固定值,li高度是由图片高度决定的。什么时候让图片流动?就是当滚动条触发某个临界值时,开始加载一些新的图片进来。总之就是由很多宽度固定高度不固定的图片组成,在一定情况下触发事件加载新的图片在盒子中。

  init是初始化图片,给每个图片按照某种规律定位。

  getLeftAndTop是给图片定位,这里是根据图片宽度和高度定位的。首先想一下,li的宽度固定而高度是不固定的,liLeft设置只需知道是第几列和它们之间的间距即可,因为第n列所有图片距离左边的距离总是保持一致。第0列距离左边为0,第一列为第0列的宽度+一个li间距,第二列为第一列+第二列宽度+两个li间距(列数*(li宽度+间距)),这样就能得出结果:liLeft = _row*(liWidth + leftDistance)。

  那现在有个问题,高度不固定那要怎么定义呢?这个好办,根据图片高度来就ok了(说起来简单,当时这个问题纠结了很久……)。我采取数组的方式,有多少列就有多少个数组(什么意思?),我们定义图片top值是不是和它上面的图片有关系?等于它上面图片的高度值相加再加上之间的间距,比如:我现在要求第五张图片的top值,就是第一张图片的高度+它们之间的间距;第九张图片就是第一张+第五张图片高度+两张图片间距,以此类推,liTop += liHeight[index] + 10,但是有个问题图片高度不一样,你这样做肯定不行,所有图片高度都相加了,我只需要我头顶以上的高度!那改成liTop[_row] += liHeight[index] + 10,也不行啊,这样第一行也下面去了。那我对第一行单独处理,top值设为0,其他行:liTop[_row] += liHeight[index - rowCount] + 10,现在liTop就可以了。

  那现在考虑setMaxHeight,其实前面也提到过,有四列,取里面每列图片加起来最大值的就可以了,即:maxHeight = Math.max.apply(Math,newLiTop)。

  最后就是加载图片的问题,在json文件中定义图片地址就可以了,我这边是以数组的方式实现:

  这里数组长度为2,可以以 result[p].page[i].url获取里面的url值,result[p]表示加载了p次,result[p].page[i]表示加载了p次的第i个url。json数组中引用page属性,可能容易混淆,大家可以自己定义,它就是表示图片的个数。

  希望这些能给大家一丁点帮助,如果有哪里讲得不好或者不对的对方欢迎指正,谢谢~ 

下载代码

jquery版瀑布流的更多相关文章

  1. 网友微笑分享原创Jquery实现瀑布流特效

    首先非常感谢网友微笑的无私分享,此Jquery特效是一款非常流行和实用的瀑布流布局,核心代码只有几十行,是我见过代码量最少的瀑布流布局,非常适合网友们学习哦,希望大家好好看一下这个Jquery特效的原 ...

  2. 用jQuery实现瀑布流效果学习笔记

    jQuery一直没系统的学,只知道是js库,封装了好多js函数,方便了开发.以前做过一个原生的图片网站瀑布流效果,超级麻烦,这次用了jQuery方法,瞬间代码浓缩了,只有56行js代码.神奇的让我来把 ...

  3. 用JavaScript和jQuery实现瀑布流

    ▓▓▓▓▓▓ 大致介绍 在慕课网上学习了用原生js和jQuery实现瀑布流,在这里做个笔记 ▓▓▓▓▓▓ 用JavaScript实现 基本结构: <div id="main" ...

  4. 【前端】用jQuery实现瀑布流效果

    jQuery实现瀑布流效果 何为瀑布流: 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早 ...

  5. 用jquery实现瀑布流案例

    一.瀑布流是我们常见的案例,这里主要讲述,用jquery的方式实现瀑布流的功能! 引言:我们经常见到很多网站的瀑布流功能,如淘宝.京东这些商品等等.. 实现它我们首先考虑几个问题:1.获取到数据   ...

  6. jQuery实现瀑布流

    瀑布流布局多用于加载图片,或者图片配上文字.视觉表现为参差不齐的多栏布局.随着页面滚动条向下滚动,还会不断加载数据块并附加至当前尾部.本文就来利用jQuery实现一个图片瀑布流的效果. 1.布局. 首 ...

  7. Jquery简单瀑布流代码示例

    最近很多网站都采用瀑布流风格设计,感觉挺有个性的,比较合适做图片类型的网站,没事仿开心网做一个瀑布流示例. 需要用到Jquery,jquery.masonry.min.js <!DOCTYPE ...

  8. jQuery制作瀑布流(转)

    “瀑布流布局”随着pinterest网的流行而出名,现在国内使用这种风格布局的网站也越来越多,比如说Mark之,蘑菇街,点点网,哇哦等等.我第一次听到这个布局名称是来自于“乔花写的<瀑布流布局浅 ...

  9. jQuery实现瀑布流(pc、移动通用)

    使用 jQuery 的 Masonry 插件来实现这种页面形式 1,分别下载 jQuery 与 Masonry ,然后把他们都加载到页面中使用. 加载代码: <script src=" ...

随机推荐

  1. 服务器配置ssl证书支持苹果ATS方法

    服务器配置ssl证书支持苹果ATS方法 发布日期:2016-12-14 苹果安全工程&架构部门主管Ivan Kristic表示ATS将在今年底成为App Sotre app的必要条件,这将大幅 ...

  2. Ztree的简单使用和后台交互的写法(一)

    一.引入ztree的头文件 <!-- 引入ztree/--> <script type="text/javascript" src="${pageCon ...

  3. 10月16日下午MySQL数据库CRUD操作(增加、删除、修改、查询)

    1.MySQL注释语法--,# 2.2.后缀是.sql的文件是数据库查询文件. 3.保存查询. 关闭查询时会弹出提示是否保存,保存的是这段文字,不是表格(只要是执行成功了表格已经建立了).保存以后下次 ...

  4. Java数据结构——双端链表

    //================================================= // File Name : FirstLastList_demo //------------ ...

  5. Java排序算法——冒泡排序

    import java.util.Arrays; //================================================= // File Name : Bubble_S ...

  6. HTML学习笔记——锚链接、pre标签、实体

    1>锚链接 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  7. 【经典】C++&RPG对战游戏

    博文背景: 还记大二上学期的时候看的这个C++&RPG游戏(博主大一下学期自学的php,涵盖oop内容),一个外校的同学他们大一学的C++,大二初期C++实训要求做一个程序填空,就是这个 RP ...

  8. 通过XHR  API来下载和上传图片

    1.不用HTML中的img标签来下载图片,通过XHR  api来下载图片: var xhr = new XMLHttpRequest(); xhr.open('GET','/img/tooth-int ...

  9. Linux python <tab>自动补全

    为Python添加交互模式下TAB自动补全以及命令历史功能. 1.获取python目录 [root@localhost ~]# python Python 2.6.6 (r266:84292, Jul ...

  10. Yii2 如何更好的在页面注入JavaScript

    先添加一个widgets <?php /** * User: yiqing * Date: 14-9-15 * Time: 下午12:09 */ namespace common\widgets ...