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

  1.布局。

  首先我们创建一个项目,导入jquery.js,以及十张图片。图片大小可以不一致。

  先放入一个容器div(container)。然后创建一个div(box)用来承载图片及其他边缘效果,比如文字介绍等。在这个div里面再指定一个div(content)用来承载图片。

  代码如下:

  1. <div id="container">
  2. <div class="box">
  3. <div class="content">
  4. <img src="img/1.jpg">
  5. </div>
  6. </div>
  7. <div class="box">
  8. <div class="content">
  9. <img src="img/2.jpg">
  10. </div>
  11. </div>
  12. ...
  13. <div class="box">
  14. <div class="content">
  15. <img src="img/9.jpg">
  16. </div>
  17. </div>
  18. <div class="box">
  19. <div class="content">
  20. <img src="img/0.jpg">
  21. </div>
  22. </div>
  23. </div>

  这时候图片是依次向下排列的,我们来加一个样式。首先通配符设置margin和padding都是0。然后box设置相对定位和向左浮动,这样图片就一张张挨在一起了。为了好看我们再给content加上一个边框。img固定一个宽度,高度设为auto。代码:

  1. * {
  2. margin:;
  3. padding:;
  4. }
  5.  
  6. .box {
  7. position: relative;
  8. float: left;
  9. }
  10.  
  11. .content {
  12. padding: 10px;
  13. border: 1px solid #ccc;
  14. border-radius: 5px;
  15. }
  16.  
  17. .content img {
  18. width: 200px;
  19. height: auto;
  20. }

  为了效果明显,我们将图片div多复制几个。至此布局基本上完成了,我们可以看到此时大致的样式出来了,但是图片上下排列还不够紧密。下面要修改图片的位置摆放。

  2.图片位置摆放

  根据瀑布流效果可以看出,第二排的第一张图片应该放在第一排最短的一张图片下面,之后也是依次按照这个规则摆放。下面我们用jQuery实现:

  1. $(document).ready(function(){//加载文档
  2. $(window).on("load",function(){//监听window的加载事件
  3. imgLocation();
  4. });
  5. });
  6.  
  7. function imgLocation(){//确定图片加载的位置
  8. var box = $(".box");//创建盒子对象
  9. var boxWidth = box.eq(0).width();//获取盒子宽度
  10. var num = Math.floor($(window).width()/boxWidth);//计算一排可以摆放几个
  11. var boxArr = [];//获取这一排盒子的高度,好找到最短的一个
  12. box.each(function(index,value){//each遍历
  13. //index是图片位置,value是相对应的元素。
  14. var boxHeight = box.eq(index).height();
  15. if(index<num){
  16. boxArr[index] = boxHeight;
  17. }else{
  18. var minboxHeight = Math.min.apply(null,boxArr);//获取最小高度var minboxIndex = $.inArray(minboxHeight,boxArr);//获取最小高度图片的位置
  19. $(value).css({
  20. "position":"absolute",
  21. "top":minboxHeight,
  22. "left":box.eq(minboxIndex).position().left
  23. });//下一张图片摆放在最短图片的下面
  24. boxArr[minboxIndex]+=box.eq(index).height();//重新计算最短图片的高度
  25. }
  26. });
  27. }

  此时已经实现了瀑布流的效果。

3.滚动加载实现

  首先要监听鼠标滚动事件。当最后一张图片滚动到一半的时候,创建对象,加载图片。

  代码如下:

  1. $(document).ready(function(){//加载文档
  2. $(window).on("load",function(){//监听window的加载事件
  3. imgLocation();
  4. var dataImg = {"data":[{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"},{"src":"7.jpg"}]}
  5. window.onscroll = function(){
  6. if(scrollside()){
  7. $.each(dataImg.data,function(index,value){
  8. //jQuery动态创建div和img
  9. var box = $("<div>").addClass("box").appendTo($("#container"));//创建一个div,添加class,加载到容器中
  10. var content = $("<div>").addClass("content").appendTo(box);//创建内容div加载到box中
  11. $("<img>").attr("src","./img/"+$(value).attr("src")).appendTo(content);//创建图片加载到内容中
  12. imgLocation();//新加入的图片遵循瀑布流布局的规则
  13. });
  14. }
  15. }
  16. });
  17. });
  18. function scrollside(){
  19. var box = $(".box");
  20. var lastboxHeight = box.last().get(0).offsetTop+Math.floor(box.last().height()/2);//最后一张图片距离顶端的距离加上最后一张图片高度的一半
  21. var documentHeight = $(document).height();//当前容器的高度
  22. var scrollHeight = $(window).scrollTop();//鼠标滚动的高度
  23. return (lastboxHeight<scrollHeight+documentHeight)?true:false;
  24. }

4.bug修复。

  上面的代码在窗口大小不断变化时会出现bug,列数不随窗口大小改变。修复这个bug我们可以在window的加载事件监听的地方加上一个监听窗口大小变化的函数,当窗口大小改变时调用一遍布局函数imgLocation();

  这样窗口拉小已经可以跟着改变,但是重新拉大列数不会跟着增加,而是叠加在已有列上。这是因为拉大以后余出的空间没有box,获取到的box的left是原有列的,所以新图片会叠加在前面的列上。所以我们在if(index<num)时重新赋一遍位置。

  如下黄色底色部分就是修改的代码。  最终js代码如下:

  1. $(document).ready(function() { //加载文档
  2. $(window).on("load", function() { //监听window的加载事件
  3. imgLocation();
  4. var dataImg = { "data": [{ "src": "0.jpg" }, { "src": "9.jpg" }, { "src": "3.jpg" }, { "src": "4.jpg" }, { "src": "5.jpg" }, { "src": "6.jpg" }, { "src": "7.jpg" }] }
  5. /*鼠标滚动时:*/
  6. window.onscroll = function() {
  7. if (scrollside()) {
  8. $.each(dataImg.data, function(index, value) {
  9. //jQuery动态创建div和img
  10. var box = $("<div>").addClass("box").appendTo($("#container")); //创建一个div,添加class,加载到容器中
  11. var content = $("<div>").addClass("content").appendTo(box); //创建内容div加载到box中
  12. $("<img>").attr("src", "./img/" + $(value).attr("src")).appendTo(content); //创建图片加载到内容中
  13. imgLocation(); //新加入的图片遵循瀑布流布局的规则
  14. });
  15. }
  16. }
  17. /*窗口大小变化时:*/
  18. window.onresize = function() {
  19. imgLocation();
  20. }
  21. });
  22. });
  23.  
  24. /*动态加载*/
  25. function scrollside() {
  26. var box = $(".box");
  27. var lastboxHeight = box.last().get(0).offsetTop + Math.floor(box.last().height() / 2); //最后一张图片距离顶端的距离加上最后一张图片高度的一半
  28. var documentHeight = $(document).height(); //当前容器的高度
  29. var scrollHeight = $(window).scrollTop(); //鼠标滚动的高度
  30. return (lastboxHeight < scrollHeight + documentHeight) ? true : false;
  31. }
  32.  
  33. /*瀑布流布局实现*/
  34. function imgLocation() { //确定图片加载的位置
  35. var box = $(".box"); //创建盒子对象
  36. var boxWidth = box.eq(0).width(); //获取盒子宽度
  37. var num = Math.floor($(window).width() / boxWidth); //计算一排可以摆放几个
  38. var boxArr = []; //获取这一排盒子的高度,好找到最短的一个
  39. box.each(function(index, value) { //each遍历
  40. //index是图片位置,value是相对应的元素。
  41. var boxHeight = box.eq(index).height();
  42.  
  43. if (index < num) {
  44. boxArr[index] = boxHeight;
  45. /*重新设置第一行的元素位置,避免窗口由小拉大时出错:*/
  46. $(value).css({
  47. "position": "absolute",
  48. "top": 0,
  49. "left": boxWidth * index
  50. });
  51. } else {
  52. var minboxHeight = Math.min.apply(null, boxArr); //获取最小高度
  53. //console.log(minboxHeight);
  54. var minboxIndex = $.inArray(minboxHeight, boxArr); //获取最小高度图片的位置
  55. // console.log("minboxIndex:"+minboxIndex);
  56. $(value).css({
  57. "position": "absolute",
  58. "top": minboxHeight,
  59. "left": box.eq(minboxIndex).position().left
  60. }); //下一张图片摆放在最短图片的下面
  61. boxArr[minboxIndex] += box.eq(index).height(); //重新计算最短图片的高度
  62. }
  63. });
  64. }

以上。

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,jquery.masonry.min.js <!DOCTYPE ...

  7. jquery版瀑布流

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

  8. jQuery制作瀑布流(转)

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

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

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

随机推荐

  1. LeetCode "477. Total Hamming Distance"

    Fun one.. the punch line of this problem is quite common in Bit related problems on HackerRank - vis ...

  2. bzoj3051: [wc2013]平面图

    Description Input Output 扫描线求出平面图的对偶图然后求最小生成树,用并查集按秩合并,以便查询两点间路径最大权 #include<stdio.h> #include ...

  3. LINQ实现递归算法

    LINQ的使代码更加整洁,但往常递归都会需要定义两个方法,如果使用Razor语法书写递归就会变得无从下手.所以推荐使用LINQ实现递归 @{ //统计名片认证数量 ; Func<int, int ...

  4. 黄聪:远程连接mysql数据库注意事项记录(远程连接慢skip-name-resolve)

    远程连接慢 慢是一个很大的问题,网上的办法是在my.ini的“[mysqld]”下面加入一行“skip-name-resolve”,就像这样: 然后保存并重启mysql服务即可. 下面是其它网友的补充 ...

  5. maven 项目无法发布,无法编译的解决办法

    1 Web Deployment Assembly信息都合理2 重新clear项目,让JAVA代码重新生成.class文件在target目录中

  6. maven 记录

    1. Can't find parent:  工程中的pom.xml中定义的”project -> version”或者”parent project -> version”设置的不对导致 ...

  7. 【OpenCV练习】图片腐蚀

    在简单显示出图片之后,这次尝试一下将图片进行腐蚀操作,代码如下. #include <iostream> #include <opencv2/highgui/highgui.hpp& ...

  8. Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8)

    Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8) 本次演示为升级oracle rac数据库,用GI的psu升级,从11.2.0.4.0升级到11.2.0.4.8 ...

  9. sql语句-ALTER TABLE

    在工作中常遇到要维护数据库表的列,这里主要介绍sql语句中的ALTER TABLE 语句.ALTER TABLE 语句用于在已有的表中添加.修改或删除列. 如需在表中添加列,请使用下列语法: ALTE ...

  10. android studio新建hello world时出现Rendering Problems

    The following classes could not be instantiated:        - android.support.v7.internal.widget.ActionB ...