<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<style>
#box {
margin: 0;
padding: 0;
position: relative;
}
.item div {
width: 220px;
display: block;
}
.item {
box-shadow: 2px 2px 2px #999;
position: absolute;
}
</style>
</head>
<body>
<div id="box">
<div class="item">
<div class="itemContent" style="background-color: blue;height: 150px">1</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: rosybrown;height: 100px">2</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: red;height: 80px">3</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: #456;height: 100px">4</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: red;height: 200px">5</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: blue;height: 150px">6</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: red;height: 80px">7</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: green;height: 180px">8</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: #ccc;height: 80px">9</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: red;height: 280px">27</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: orange;height: 380px">10</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: blue;height: 150px">11</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: rosybrown;height: 100px">12</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: red;height: 80px">13</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: #456;height: 100px">14</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: red;height: 200px">15</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: blue;height: 150px">16</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: red;height: 80px">17</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: green;height: 180px">18</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: #ccc;height: 80px">19</div>
</div>
<div class="item">
<div class="itemContent" style="background-color: red;height: 280px">20</div>
</div>
</div>
<script>
let box = document.getElementById('box');
let items = box.children;
// 定义每一列之间的间隙 为10像素
let gap = 20;
// 封装成一个函数
const waterFall = () => {
// 1- 确定列数 = 页面的宽度 / 图片的宽度
let pageWidth = getClient().width;
pageWidth = 800;
let itemWidth = items[0].offsetWidth;
itemWidth = 280;
let columns = parseInt(pageWidth / (itemWidth + gap));
// columns = 2;
let arr = [];
Array.from(items).forEach((item, index) => {
if (index < columns) {
// 确定第一行
item.style.top = 0;
item.style.left
= (itemWidth + gap) * index + 'px';
arr.push(item.offsetHeight);
} else {
// 找到数组中最小高度和它的索引
let minHeight = arr[0];
let index = 0;
arr.forEach((tripleItems, tripleIndex) => {
if (minHeight > tripleItems) {
minHeight = tripleItems;
index = tripleIndex;
}
});
// top值就是最小列的高度 + gap
item.style.top = arr[index] + gap + 'px';
// left值就是最小列距离左边的距离
item.style.left = items[index].offsetLeft + 'px';
// 最小列的高度 = 当前自己的高度 + 拼接过来的高度 + 间隙的高度
arr[index] = arr[index] + item.offsetHeight + gap;
}
});
};
// clientWidth 处理兼容性
const getClient = () => {
return {
width: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth,
height: window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight
};
};
window.onload = function() {
// 一进来就调用一次
waterFall();
};
</script>
</body>
</html>
效果为: