Jquery实现瀑布流布局(备有详细注释)


Posted in Javascript onJuly 31, 2015

本文实例讲述了Jquery实现瀑布流布局的方法。分享给大家供大家参考。具体如下:

瀑布流布局最近真的很流行,很多人都跟我一样想知道是怎么做出来的吧,经过网上搜索大量的参考结合N边的实验今天终于被我写出来了,为了便于大家理解我使用了jQuery(当然用源生js代码执行的效率会高一些,但是很多人多源生js不是很熟练)。

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Jquery瀑布流布局(每行代码都有详细注释)-作者:刘晓帆</title>
<style type="text/css">
body, ul, li, h3 { margin: 0; padding: 0; list-style: none; font: bold 12px "微软雅黑"; }
/*瀑布流布局样式*/
#lxf-box { position: relative; }
#lxf-box li { position: absolute; background: #fff; border: solid 1px #ccc; text-align: center; padding: 10px; left: 0px; top: 0; }
h3 { padding-top: 8px; }
img { width: 200px; height: auto; display: block; border: 0 }
/*css3动画*/
li { -webkit-transition: all .7s ease-out .1s; -moz-transition: all .7s ease-out; -o-transition: all .7s ease-out .1s; transition: all .7s ease-out .1s }
</style>
<script src="/js/jquery-1.6.4.min.js" type="text/javascript"></script>
</head>
<body>
<ul id="lxf-box">
 <li><a href="/"><img src="/demo/waterfall/OLqypfV.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/msbvKWyQQzZuZy.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/WbWXwqpcxqcued.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/rabGVkIGq.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/rSmEiZGlAvvuZ.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/YewRtz.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/STVDndiZsIduZyLv.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/mWFuVrzCzpPdzdje.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/MsZvAyOFukxdzdjefXwi.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/OEycuedk.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/YwabRquVKrxd.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/+nwbuJpc.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/qymffF.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/DvKZdxCjtfqMv.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/SOmyOQZtlUfdzdjefXwi.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/REsUNXUvAkrdzdj.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/DQJwrFnDpgtdz.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/eJupzWlGPxz.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/IWpjipjp.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/OXsDgKacJeTdzdjefXwi.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/QPIzxiMkmlHdzdjefX.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/mrTNaJTaQyluZyLvvnWS.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/mqXLNuWiPrbdz.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/MiEJRJdimxPdzdjefXw.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/CczowVxqM.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/rabGVkIGq.jpg"></a>
 <h3>图片标题</h3>
 </li>
 <li><a href="/"><img src="/demo/waterfall/zwPqjasxHYvdz.jpg"></a>
 <h3>图片标题</h3>
 </li>
</ul>
<script>
/*
原理:
1.把所有的li的高度值放到数组里面
2.第一行的top都为0
3.计算高度值最小的值是哪个li
4.把接下来的li放到那个li的下面
*/
var margin = 10;//这里设置间距
var li=$("li");//这里是区块名称
var  li_W = li[0].offsetWidth+margin;
//取区块的实际宽度(包含间距,这里使用源生的offsetWidth函数,不适用jQuery的width()函数是因为它不能取得实际宽度,例如元素内有pandding就不行了)
function liuxiaofan(){//定义成函数便于调用
  var h=[];//记录区块高度的数组
  var n = document.documentElement.offsetWidth/li_W|0;
  //窗口的宽度除以区块宽度就是一行能放几个区块
  for(var i = 0;i < li.length;i++) {//有多少个li就循环多少次
    li_H = li[i].offsetHeight;//获取每个li的高度
    if(i < n) {//n是一行最多的li,所以小于n就是第一行了
      h[i]=li_H;//把每个li放到数组里面
      li.eq(i).css("top",0);//第一行的Li的top值为0
      li.eq(i).css("left",i * li_W);
      //第i个li的左坐标就是i*li的宽度
      }
    else{
      min_H =Math.min.apply(null,h) ;//取得数组中的最小值,区块中高度值最小的那个
      minKey = getarraykey(h, min_H);//最小的值对应的指针
      h[minKey] += li_H+margin ;//加上新高度后更新高度值
      li.eq(i).css("top",min_H+margin);//先得到高度最小的Li,然后把接下来的li放到它的下面
      li.eq(i).css("left",minKey * li_W);  //第i个li的左坐标就是i*li的宽度
    }
    $("h3").eq(i).text("编号:"+i+",高度:"+li_H);//把区块的序号和它的高度值写入对应的区块H3标题里面
  }
}
/* 使用for in运算返回数组中某一值的对应项数(比如算出最小的高度值是数组里面的第几个) */
function getarraykey(s, v) {for(k in s) {if(s[k] == v) {return k;}}}
/*这里一定要用onload,因为图片不加载完就不知道高度值*/
window.onload = function() {liuxiaofan();};
/*浏览器窗口改变时也运行函数*/
window.onresize = function() {liuxiaofan();};
</script>
</body>
</html>

希望本文所述对大家的jquery程序设计有所帮助。

Javascript 相关文章推荐
疯掉了,尽然有js写的操作系统
Apr 23 Javascript
javascript firefox不显示本地预览图片问题的解决方法
Nov 12 Javascript
js href的用法
May 13 Javascript
IE无法设置短域名下Cookie
Sep 23 Javascript
jquery live()重复绑定的解决方法介绍
Jan 03 Javascript
Js控制滑轮左右滑动实例
Feb 13 Javascript
JavaScript基础篇(6)之函数表达式闭包
Dec 11 Javascript
防止页面url缓存中ajax中post请求的处理方法
Oct 10 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
Feb 02 jQuery
关于vuejs中v-if和v-show的区别及v-show不起作用问题
Mar 26 Javascript
vue3.0 搭建项目总结(详细步骤)
May 20 Javascript
微信小程序登录时如何获取input框中的内容
Dec 04 Javascript
jquery实现仿JqueryUi可拖动的DIV实例
Jul 31 #Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
Jul 31 #Javascript
JavaScript实现图片轮播的方法
Jul 31 #Javascript
基于bootstrap3和jquery的分页插件
Jul 31 #Javascript
jquery-tips悬浮提示插件分享
Jul 31 #Javascript
javascript实现检验的各种规则
Jul 31 #Javascript
纯JS实现本地图片预览的方法
Jul 31 #Javascript
You might like
使用PHPCMS搭建wap手机网站
2015/09/20 PHP
关于laravel后台模板laravel-admin select框的使用详解
2019/10/03 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
在网页中屏蔽快捷键
2006/09/06 Javascript
jquery 3D球状导航的文章分类
2010/07/06 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
2015/08/15 Javascript
jquery背景跟随鼠标滑动导航
2015/11/20 Javascript
js实现String.Fomat的实例代码
2016/09/02 Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
2017/07/21 Javascript
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
2018/02/09 Javascript
微信小程序实现美团菜单
2018/06/06 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
浅谈Webpack下多环境配置的思路
2018/06/27 Javascript
Vue中使用vux配置代码详解
2018/09/16 Javascript
vue-cli 3 全局过滤器的实例代码详解
2019/06/03 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
解决Layui数据表格显示无数据提示的问题
2019/11/14 Javascript
在vue中使用echarts(折线图的demo,markline用法)
2020/07/20 Javascript
python实现问号表达式(?)的方法
2013/11/27 Python
python使用append合并两个数组的方法
2015/04/28 Python
python实时监控cpu小工具
2018/06/21 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
基于Python的Jenkins的二次开发操作
2020/05/12 Python
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
纽约海:Sea New York
2018/11/04 全球购物
银行毕业实习自我鉴定
2013/09/19 职场文书
会计电算化专业毕业生推荐信
2013/12/24 职场文书
工程专业求职自荐书范文
2014/02/08 职场文书
吸烟检讨书2000字
2014/02/13 职场文书
中职毕业生自我鉴定
2014/09/13 职场文书
工作自我推荐信范文
2015/03/25 职场文书
教师见习总结范文
2015/06/23 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书