HTML部分
<!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>
<style>
#water {
width: 90%;
margin: 0 auto;
outline: 1px solid;
}
#water img{
transition: all .5s;
}
</style>
</head>
<body>
<div id="water">
</div>
<script src="./script/waterfall.js"></script>
<script>
var mockImgs = [];
for (let i = 0; i < 41; i++) {
mockImgs.push("./img/" + i + ".jpg");
}
createWaterfallArea(document.getElementById("water"), mockImgs);
</script>
</body>
</html>
JS部分
function createWaterfallArea(areaDom, imgs, imgWidth = 220) {
areaDom.innerHTML = "";
areaDom.style.position = "relative";
var containerWidth;
var colNumber;
var gap;
var imgArray = [];
addImgs();
setPositions();
var timer = null;
window.addEventListener("resize", function(){
if(timer){
clearInterval(timer);
}
timer = setTimeout(() => {
setPositions();
}, 500);
})
function setParameters() {
containerWidth = parseInt(areaDom.clientWidth);
colNumber = parseInt(containerWidth / imgWidth);
gap = containerWidth - colNumber * imgWidth
if (colNumber > 1) {
gap = gap / (colNumber - 1);
}
}
function addImgs() {
for (var i = 0; i < imgs.length; i++) {
var url = imgs[i];
var img = document.createElement("img");
img.src = url;
img.style.width = imgWidth + "px";
img.style.position = "absolute";
img.addEventListener("load", function () {
setPositions();
})
areaDom.appendChild(img);
imgArray.push(img);
}
}
function setPositions() {
setParameters();
var nextYs = new Array(colNumber);
nextYs.fill(0);
for (var i = 0; i < imgArray.length; i++) {
var img = imgArray[i];
var y = Math.min(...nextYs);
var colIndex = nextYs.indexOf(y);
img.style.left = imgWidth * colIndex + gap * colIndex + "px";
img.style.top = y + "px";
nextYs[colIndex] += parseInt(img.height) + gap;
}
areaDom.style.height = Math.max(...nextYs) + "px";
}
}