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 相关文章推荐
用JavaScript和注册表脚本实现右键收藏Web页选中文本
Jan 28 Javascript
jscript之List Excel Color Values
Jun 13 Javascript
无阻塞加载脚本分析[全]
Jan 20 Javascript
详解JavaScript的while循环的使用
Jun 03 Javascript
JS基于FileSystemObject创建一个指定路径的TXT文本文件
Aug 05 Javascript
jQuery AJAX timeout 超时问题详解
Jun 21 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
Feb 18 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
Mar 25 jQuery
微信小程序开发之好友列表字母列表跳转对应位置
Sep 26 Javascript
Vue中&quot;This dependency was not found&quot;问题的解决方法
Jun 19 Javascript
Vue开发Html5微信公众号的步骤
Apr 11 Javascript
js+css实现扇形导航效果
Aug 18 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
php中call_user_func函数使用注意事项
2014/11/21 PHP
php使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
js类 from qq
2006/11/13 Javascript
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
js简单实现HTML标签Select联动带跳转
2013/10/23 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
javascript中call apply 与 bind方法详解
2016/03/10 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
2016/08/25 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
关于axios不能使用Vue.use()浅析
2018/01/12 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
JavaScript私有变量实例详解
2019/01/24 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
layui 阻止图片上传的实例(before方法)
2019/09/26 Javascript
Vue实现手机计算器
2020/08/17 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
python实现倒计时的示例
2014/02/14 Python
pygame播放音乐的方法
2015/05/19 Python
使用Python实现跳一跳自动跳跃功能
2019/07/10 Python
详解使用django-mama-cas快速搭建CAS服务的实现
2019/10/30 Python
python爬虫基础知识点整理
2020/06/02 Python
python遍历路径破解表单的示例
2020/11/21 Python
小学趣味运动会加油稿
2014/09/25 职场文书
医院护士工作检讨书
2014/10/26 职场文书
先进集体申报材料
2014/12/25 职场文书
环保宣传语大全
2015/07/13 职场文书
2016大学生形势与政策心得体会
2016/01/12 职场文书
小学三年级语文教学反思
2016/03/03 职场文书
Python机器学习之基于Pytorch实现猫狗分类
2021/06/08 Python
MySQL窗口函数的具体使用
2021/11/17 MySQL