js实现瀑布流

在本次项目中,我们要实现很多效果,瀑布流是其中一个

思路:可以先排列一行,然后根据每列的高度判断以下的内容模块要放置在那一列。瀑布流所在父容器高度随之改变。而所有子元素的定位均使用绝对定位。

部分html代码:

<body> 
<ul id="flow-box"> 
<li><img src="../images/1.jpg"/><a href="#">图片标题1</a></li> 
<li><img src="../images/18.jpg"/><a href="#">图片标题2</a></li> 
<li><img src="../images/15.jpg"/><a href="#">图片标题3</a></li> 
<li><img src="../images/17.jpg"/><a href="#">图片标题4</a></li> 
<li><img src="../images/5.jpg"/><a href="#">图片标题5</a></li> 
<li><img src="../images/6.jpg"/><a href="#">图片标题6</a></li> 
<li><img src="../images/7.jpg"/><a href="#">图片标题7</a></li> 
<li><img src="../images/8.jpg"/><a href="#">图片标题8</a></li> 
<li><img src="../images/9.jpg"/><a href="#">图片标题9</a></li> 
<li><img src="../images/3.jpg"/><a href="#">图片标题10</a></li> 
<li><img src="../images/11.jpg"/><a href="#">图片标题11</a></li> 
<li><img src="../images/12.jpg"/><a href="#">图片标题12</a></li> 
<li><img src="../images/13.jpg"/><a href="#">图片标题13</a></li> 
<li><img src="../images/14.jpg"/><a href="#">图片标题14</a></li> 
<li><img src="../images/2.jpg"/><a href="#">图片标题15</a></li> 
<li><img src="../images/16.jpg"/><a href="#">图片标题16</a></li> 
<li><img src="../images/10.jpg"/><a href="#">图片标题17</a></li> 
<li><img src="../images/4.jpg"/><a href="#">图片标题18</a></li> 
</ul> 
<div class="loadwrap" id="jz">加载</div> 
</body> 

css代码:

<style type="text/css"> 
body{margin:0; font-family:微软雅黑;} 
#flow-box
{
	margin:10px auto 0 auto;
	padding:0; 
	position:relative;
	border:1px solid #000;
}
#flow-box li
{ 
	width:190px;
	position:absolute;
	padding:10px;
	border:solid 1px #f00;
	list-style:none; 
		opacity:0; 
		-moz-opacity:0; 
		filter:alpha(opacity=0); 
			-webkit-transition:opacity 500ms ease-in-out; 
			-moz-transition:opacity 500ms ease-in-out; 
			-o-transition:opaicty 500ms ease-in-out; 
			transition:opaicty 500ms ease-in-out;
} 
#flow-box li img
{
	width:100%;
} 
#flow-box li a
{
	display:block;
	width:100%;
	text-align:center;
	font-size:14px;
	color:#333;
	line-height:18px;
	margin-top:10px;
	text-decoration:none;
} 
.loadwrap
{
	position:absolute;
	left:0;
	width:100%; 
	text-align:center;
	border:1px solid red;
	
} 
</style> 
<script type="text/javascript">
	function flow(mh,mv)
	{
		try{
		//计算可放入数据块的列数
		var wid=document.documentElement.offsetWidth;
		//alert("文档宽度="+wid);
		var ul=document.getElementById("flow-box");
		var lis=document.getElementsByTagName('li');
		//alert(lis[0].offsetWidth);
		var blockwidth=lis[0].offsetWidth+mh;//数据块的宽度
		//alert("数据块宽度="+blockwidth);
		var cols=Math.floor(wid/blockwidth);
		//alert("可以放的列数="+cols);
		ul.style.width=blockwidth*cols-mh+"px";
		
		//将各个数据块的高度记入数组中。
		var harr=[];
		for(var i=0;i<lis.length;i++)
		{
			//alert(i+"个高度="+lis[i].offsetHeight);
			harr.push(lis[i].offsetHeight);
		}
		//将数据块第一行排列好,并将列高度记入数组
		var colH=[];
		for(var j=0;j<cols;j++)
			{
			lis[j].style.top="0";
			
			alert("第"+j+"个的top="+lis[j].style.top);
			//alert(blockwidth);
			lis[j].style.left=j*blockwidth+"px";
			alert("第"+j+"个的left="+lis[j].style.left);
			lis[j].style.opacity = "1"; 
			lis[j].style["-moz-opacity"] = "1"; 
			lis[j].style["filter"] = "alpha(opacity=100)"; 
			colH.push(harr[j]);
			}
			for(var i=cols;i<lis.length;i++)
			{
				var key=_getMinKey(colH);
				lis[i].style.top=colH[key]+mv+"px";
				lis[i].style.left=key*blockwidth+"px";
				lis[i].style.opacity = "1"; 
				lis[i].style["-moz-opacity"] = "1"; 
				lis[i].style["filter"] = "alpha(opacity=100)"; 
				colH[key]+=harr[i]+mv;
			}
			for(var k=0;k<colH.length;k++)
			{
				alert("colH数组的第"+k+"个元素是:"+colH[k]);
			}
			var top=_getMaxValue(colH)+50+"px";
			alert("top="+top);
			document.getElementById("jz").style.top=top;
		}
		
		catch(e)
		{
		alert(e);
		}
	}
	window.οnlοad=function()
	{
		flow(10,10);
	}
	function _getMinKey(arr)
	{//计算数组中的最小高度的索引值
		var a=arr[0];
		var b=0;
		for(var i in arr)
		{	if(arr[i]<a)
			{
			a=arr[i];
			b=i;
			}
		}
		return b;
	}
	function _getMaxValue(arr) 
	{//计算数组中的最大值	
		var a = arr[0]; 
		for (var k in arr) 
		{ 
		if (arr[k] > a) 
		{ 
		a = arr[k]; 
		} 
		}	 
	return a; 
	} 
</script>


瀑布流样式





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值