由于css实现瀑布流的两种方法都有一定的局限性,不能满足需求。
css 方法 最简单的是 给父元素 添加 column-count: xx 属性 xx 代表需要展示的列数。缺点是从后端拿到的数据会 以先 竖向排列 再横向排列。
js方法
.content_main { //这个父元素
position: relative;
}
.module { //需要排列的元素
height: auto;
position: absolute;
}
let container = document.getElementById("content_main_id")
根据id 拿到父元素
let item = document.getElementsByClassName("module")
根据class 拿到子元素 也就是需要需要排列的元素
waterFall:function(){
// 1. 设置container盒子的宽度
// 注意:浏览器的可视区域的宽度 / 一个item元素的宽度 = 一行的排列的元素的个数
let container = document.getElementById("content_main_id")
let item = document.getElementsByClassName("module")
//获取元素的宽度(含border,padding)
let width = item[0].offsetWidth
//计算出浏览器窗口的宽度
let clientWidth = document.documentElement.clientWidth;
//计算出应该放几列(向下取整)
let columnCount = Math.floor(clientWidth / width)
//设置容器(父盒子)的宽度
// container.style.width = columnCount*width+"px"
// 2.设置每一个item元素的排列位置
// 第一行整体的top值都是0 后面的依次找上一行高度最小的容器,在它下面进行排列
let hrr = []
for(let i= 0 ;i<item.length;i++){
//定位第一行的图片
if(i<4){ //需要展示几列
item[i].style.top = "0px"
if(i == 0){ //处理item的间隔
item[i].style.left = i* width+"px"
}else{
item[i].style.left = (i* width+i*20)+"px"
}
hrr.push(item[i].offsetHeight)
}else{
//第一行之后的
//选择总高度最小的列
let min = Math.min(...hrr)
let index = hrr.indexOf(min)
//将每个元素定位到当前总高度最小的列下
min = min + parseInt(i/4)*20 //处理top值
item[i].style.top = min+"px"
item[i].style.left = (index * width+ index*20)+"px"
//当前定位的元素加入该列
hrr[index] += item[i].offsetHeight
}
}
},