jQuery 实现的瀑布流 发表于 2016-07-14 | 分类于 作品直接上代码:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168<!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="http://cdn.bootcss.com/jquery/2.2.3/jquery.min.js" type="text/javascript"></script></head><body> <ul id="lxf-box"> <li> <a href="http://vsoui.com/"><img src="http://image6.huangye88.com/2013/03/28/2a569ac6dbab1216.jpg"></a> <h3>图片标题</h3> </li> <li> <a href="http://vsoui.com/"><img src="http://img1.3lian.com/2015/a2/246/d/58.jpg"></a> <h3>图片标题</h3> </li> <li> <a href="http://vsoui.com/"><img src="http://n1.itc.cn/img8/wb/recom/2016/07/14/146845457051493457.JPEG"></a> <h3>图片标题</h3> </li> <li> <a href="http://vsoui.com/"><img src="http://p3.so.qhimg.com/bdr/326__/t01d51d0555bd71a76d.jpg"></a> <h3>图片标题</h3> </li> <li> <a href="http://vsoui.com/"><img src="http://p3.so.qhimg.com/bdr/326__/t011ed903a04d9cf633.jpg"></a> <h3>图片标题</h3> </li> <li> <a href="http://vsoui.com/"><img src="http://p0.so.qhimg.com/bdr/326__/t019ee6b26618740ea0.jpg"></a> <h3>图片标题</h3> </li> <li> <a href="http://vsoui.com/"><img src="http://p3.so.qhimg.com/bdr/326__/t01d5e6034ec7672198.jpg"></a> <h3>图片标题</h3> </li> <li> <a href="http://vsoui.com/"><img src="http://p2.so.qhimg.com/bdr/326__/t01cdcd396d51ca617c.jpg"></a> <h3>图片标题</h3> </li> <li> <a href="http://vsoui.com/"><img src="http://p1.so.qhimg.com/bdr/326__/t01949ed9cd1e5a73e1.jpg"></a> <h3>图片标题</h3> </li> <li> <a href="http://vsoui.com/"><img src="http://p3.so.qhimg.com/bdr/326__/t01a86a588ac4ec80ad.jpg"></a> <h3>图片标题</h3> </li> <li> <a href="http://vsoui.com/"><img src="http://p1.so.qhimg.com/bdr/326__/t01043dc57977aa842b.jpg"></a> <h3>图片标题</h3> </li> <li> <a href="http://vsoui.com/"><img src="http://p1.so.qhimg.com/bdr/326__/t013001fc98983e1c81.jpg"></a> <h3>图片标题</h3> </li> <li> <a href="http://vsoui.com/"><img src="http://p0.so.qhimg.com/bdr/326__/t01e67b3890eee29025.jpg"></a> <h3>图片标题</h3> </li> <li> <a href="http://vsoui.com/"><img src="http://p1.so.qhimg.com/bdr/326__/t01d510ac3dd7f20d21.jpg"></a> <h3>图片标题</h3> </li> <li> <a href="http://vsoui.com/"><img src="http://p2.so.qhimg.com/bdr/326__/t0143ae2828de1a6897.jpg"></a> <h3>图片标题</h3> </li> <li> <a href="http://vsoui.com/"><img src="http://p0.so.qhimg.com/bdr/326__/t014407c4e3dfd6632a.jpg"></a> <h3>图片标题</h3> </li> <li> <a href="http://vsoui.com/"><img src="http://p4.so.qhimg.com/bdr/326__/t0144640b6809e793d9.jpg"></a> <h3>图片标题</h3> </li> </ul> <script> var margin = 10; //这里设置间距 var li = $("li"); //这里是区块名称 var li_W = li[0].offsetWidth + margin; //取区块的实际宽度(包含间距,这里使用源生的offsetWidth函数,不适用jQuery的width()函数是因为它不能取得实际宽度,例如元素内有pandding就不行了) function vsoUi() { //定义成函数便于调用 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() { vsoUi(); }; /*浏览器窗口改变时也运行函数*/ window.onresize = function() { vsoUi(); }; </script></body></html>