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 相关文章推荐
基于jQuery的倒计时插件代码
May 07 Javascript
浅谈JS闭包中的循环绑定处理程序
Nov 09 Javascript
leaflet的开发入门教程
Nov 17 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
Jun 16 jQuery
Vuex提升学习篇
Jan 11 Javascript
vue中倒计时组件的实例代码
Jul 06 Javascript
vue中使用sessionStorage记住密码功能
Jul 24 Javascript
JS实现数组删除指定元素功能示例
Jun 05 Javascript
JS实现网站吸顶条
Jan 08 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
Jun 05 Javascript
小程序角标的添加及绑定购物车数量进行实时更新的实现代码
Dec 07 Javascript
JS中箭头函数与this的写法和理解
Jan 14 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
追忆往昔!浅谈收音机的百年发展历史
2021/03/01 无线电
PHP has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
PHP实现批量检测网站是否能够正常打开的方法
2016/08/23 PHP
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
2014/05/14 Javascript
基于jquery实现的可编辑下拉框实现代码
2014/08/02 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
Javascript监视变量变化的方法
2015/06/09 Javascript
JS实现点击上移下移LI行数据的方法
2015/08/05 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
轻松实现jquery选项卡切换效果
2016/10/10 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
2017/01/04 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
mui上拉加载更多下拉刷新数据的封装过程
2017/11/03 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
[01:32]TI珍贵瞬间系列(一)
2020/08/26 DOTA
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
PyQt 线程类 QThread使用详解
2017/07/16 Python
利用标准库fractions模块让Python支持分数类型的方法详解
2017/08/11 Python
详解 Python 与文件对象共事的实例
2017/09/11 Python
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
Python常用扩展插件使用教程解析
2020/11/02 Python
Python爬取某平台短视频的方法
2021/02/08 Python
通过HTML5规范搞定i、em、b、strong元素的区别
2017/03/04 HTML / CSS
成品库仓管员岗位职责
2014/04/06 职场文书
保证书范文大全
2014/04/28 职场文书
2014年医药代表工作总结
2014/11/22 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
行政处罚告知书
2015/07/01 职场文书
婚礼迎宾词大全
2015/08/10 职场文书
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫