瀑布流的特点就是容器等宽不等高,计算其高度,选择最矮的一个容器的下面将插入第二行的第一个容器,以此类推,因此容器需要设置为绝对定位
首先需要确定一行有多少列,列数 = 页面的宽度 / 容器的宽度
获取页面的宽度:window.innerWidth或者document.documentElement.clientWidth或者document.body.clientWidth
获取页面的高度:window.innerHeight或者document.documentElement.clientHeight或者document.body.clientHeight
页面宽度:.width,容器宽度:.offsetWidth
得到了列数后,还需要得到全部容器的高度,因此还需要用到数组,用来存储容器的高度
遍历全部容器,还需要判断是否到了第二行,i<列数
而第一行的全部容器,设置头部和左边定位,左边定位设置为容器的宽度*i,保证不会被覆盖或者溢出,同时将arr[i].offsetWidth传入新的数组中
然后找到上一行最矮的容器,只需要将全部得到的容器的宽度判断一下就可以,首先假释一下第一个容器就是最矮的,当遍历的容器小于该容器时,那么将该容器设置为当前遍历的容器,而当前遍历的i就是最矮的容器索引值
然后就设置下一行的容器的位置就可以了,头部:最矮的容器的高度,左边:最矮的容器距离页面最左边的宽度
因为已经设置了下一行的容器,因此还需要重新获取一下当前容器的高度,当前容器高度 = 当前容器高度+间隙 +拼接过来的容器的高度
为了体验更好,可以将上面操作封装到一个函数中,当网页加载完毕加执行(window.onload),当页面宽度高度发送变化时也执行(window.onresize)
例如:
var data = document.getElementsByClassName('imgs');
function datamain(){
var datawidtha = window.innerWidth;
var datawidthb = Math.floor(data[0].offsetWidth);
var dataab = Math.floor(datawidtha/datawidthb);
var ints = Math.floor((datawidtha - dataab*datawidthb)/(dataab+1))
var arr = [];
for(var i=0;i<data.length;i++){
if(i<dataab){
data[i].style.top = 0;
data[i].style.left = (datawidthb+ints) * i + "px";
arr.push(data[i].offsetHeight);
}else{
var datamin = arr[0];
var index = 0;
for(var a = 0; a<arr.length; a++){
if(datamin > arr[a]){
datamin = arr[a];
index = a;
}
}
data[i].style.top = arr[index]+ ints +"px";
data[i].style.left = data[index].offsetLeft + "px";
arr[index] = arr[index] + data[i].offsetHeight + ints;
}
}
}
window.onload = function () {
datamain();
}
window.onresize = function () {
datamain();
}