瀑布流布局

一堆等宽不等高的数据块组成的页面
现在好多网站都采用这种瀑布流布局,如蘑菇街。美丽说等等。
首先要实现它就要明白它是怎样排列的。
每一行的列数都是根据图片的宽度和页面的宽度算比例算下来的。。
第一行就是按顺序排列,其他的数据块都是在每一列中挑选出最低的那一列依次排进去的

1、固定栏数布局

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			body,ul,li{
				padding: 0;
				margin: 0;
			}
			li{
				list-style: none;
				border: 1px solid #CECECE;
				margin: 10px 0;
			}
			ul{
				float: left;
				margin: 0 10px;
			}
			img{
				display: block;
				border:none;
			}
		</style>
	</head>
	<body>
		<ul>
			<li><img src="img2/1.jpg"></li>
			<li><img src="img2/3.jpg"></li>
			<li><img src="img2/5.jpg"></li>
			<li><img src="img2/7.jpg"></li>
			<li><img src="img2/9.jpg"></li>
			<li><img src="img2/2.jpg"></li>
			<li><img src="img2/4.jpg"></li>
			<li><img src="img2/6.jpg"></li>
			<li><img src="img2/1.jpg"></li>
			<li><img src="img2/1.jpg"></li>
		</ul>
		<ul>
			<li><img src="img2/2.jpg"></li>
			<li><img src="img2/3.jpg"></li>
			<li><img src="img2/3.jpg"></li>
			<li><img src="img2/1.jpg"></li>
			<li><img src="img2/9.jpg"></li>
			<li><img src="img2/1.jpg"></li>
			<li><img src="img2/3.jpg"></li>
			<li><img src="img2/5.jpg"></li>
			<li><img src="img2/1.jpg"></li>
			<li><img src="img2/2.jpg"></li>
		</ul>
		<ul>
			<li><img src="img2/9.jpg"></li>
			<li><img src="img2/7.jpg"></li>
			<li><img src="img2/6.jpg"></li>
			<li><img src="img2/3.jpg"></li>
			<li><img src="img2/1.jpg"></li>
			<li><img src="img2/1.jpg"></li>
			<li><img src="img2/2.jpg"></li>
			<li><img src="img2/3.jpg"></li>
			<li><img src="img2/8.jpg"></li>
			<li><img src="img2/4.jpg"></li>
		</ul>
		<script type="text/javascript">
			var aUl = document.getElementsByTagName("ul");
			console.log(aUl,Array.from(aUl));
			
			var ch = document.documentElement.clientHeight;
			var data = ["img2/3.jpg","img2/8.jpg","img2/5.jpg"];
			window.onscroll = function(){
				var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
				for(let i = 0; i < aUl.length; i++){
					if(aUl[i].offsetHeight < scrollTop + ch){
						var str = "";
						
						data.forEach(function(item){
							str+=`<li><img src="${item}"></li>`
						});
						/*for(var j = 0; j < data.length; j++){
							str += "<li><img src='"+data[j]+"'></li>"
						}*/
						aUl[i].innerHTML += str;
					}
				}
			}
			
		</script>
	</body>
</html>

2、自适应瀑布流布局

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			body{
				padding: 0;
				margin: 0;
			}
			#wrap{
				position: relative;
			}
			#wrap div{
				position: absolute;
				border: 1px solid #CECECE;
			}
			img{
				display: block;
				border:none;
			}
		</style>
	</head>
	<body>
		<div id="wrap">
			<div><img src="img2/1.jpg"></div>
			<div><img src="img2/2.jpg"></div>
			<div><img src="img2/3.jpg"></div>
			<div><img src="img2/4.jpg"></div>
			<div><img src="img2/5.jpg"></div>
			<div><img src="img2/6.jpg"></div>
			<div><img src="img2/7.jpg"></div>
			<div><img src="img2/8.jpg"></div>
			<div><img src="img2/9.jpg"></div>
			<div><img src="img2/2.jpg"></div>
			<div><img src="img2/3.jpg"></div>
			<div><img src="img2/4.jpg"></div>
			<div><img src="img2/5.jpg"></div>
			<div><img src="img2/6.jpg"></div>
			<div><img src="img2/7.jpg"></div>
		</div>
		<script type="text/javascript">
			var data = ["img2/1.jpg","img2/3.jpg","img2/5.jpg"];
			window.onload = window.onresize = function(){
				var oWrap = document.getElementById("wrap");
				var aItems = oWrap.children;//动态获取长度
				//取总宽度
				var totalWidth =  oWrap.offsetWidth;
				//单个区块宽度
				var perWidth = aItems[0].offsetWidth;
				//一行的列数
				var cols = Math.floor(totalWidth/perWidth);
				
				//区块的间距
				var mt = ml = 10;
				
				//排第一行区块的位置
				//保存每一列高度的数组
				var arrHei = [];
				for(var i = 0; i < cols; i++){
					aItems[i].style.top = 0;
					aItems[i].style.left = (perWidth+ml)*i + "px";
					arrHei.push(aItems[i].offsetHeight);
				}
				
				//排剩余的区块
				conPos(cols);
				
				function conPos(startNum){
					for(var i = startNum; i < aItems.length; i++){
						aItems[i].style.left = aItems[getMinIndex(arrHei)].style.left;
						aItems[i].style.top = arrHei[getMinIndex(arrHei)] + mt + "px";
						//拍完一个之后,更新数组
						arrHei[getMinIndex(arrHei)] += aItems[i].offsetHeight + mt;
					}
				}
				
				//定义一个取最小值索引的方法
				
				function getMinIndex(arr){
					var minVal = Math.min.apply(null,arr);
					var minIndex = arr.indexOf(minVal);
					return minIndex;
				}
				
				var ch = document.documentElement.clientHeight;
				window.onscroll = function(){
					var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
					if(arrHei[getMinIndex(arrHei)]<ch+scrollTop){
						var str = "";
						data.forEach(function(item){
							str += `<div><img src="${item}"></div>`;
						})
						oWrap.innerHTML += str;
						conPos(aItems.length-data.length);
					}
				}
				
			}
		</script>
	</body>
</html>

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值