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