原生HTML和JS实现瀑布流布局的大概思路,效果和代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div class="list">
<div class="leftList"></div>
<div class="rightList"></div>
</div>
<script>
var page = 1;
var listLeft = [];
var listRight = [];
var leftHeight = 0;
var rightHeight = 0;
var loading = false;
getList();
document.getElementsByClassName('list')[0].addEventListener('scroll', function (e) {
let scrollHeight = e.target.scrollHeight;
let clientHeight = e.target.clientHeight
let scrollTop = e.target.scrollTop;
if (clientHeight + scrollTop + 50 >= scrollHeight) {
if (loading == true) return;
loading = true;
page += 1;
getList()
}
})
function getList() {
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", `https://picsum.photos/v2/list?page=${page}&limit=10`, true);
xmlhttp.send();
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
console.log('JSON.parse(xmlhttp.responseText)', JSON.parse(xmlhttp.responseText))
JSON.parse(xmlhttp.responseText).forEach(item => {
if (leftHeight <= rightHeight) {
var showHeight = item.height * (300 / item.width);
item.showHeight = showHeight;
listLeft.push(item);
leftHeight += showHeight;
} else {
var showHeight = item.height * (300 / item.width);
item.showHeight = showHeight;
listRight.push(item)
rightHeight += showHeight;
}
});
var leftListText = ''
listLeft.forEach(iteml => {
leftListText += `<img src=${iteml.download_url} style='height:${iteml.showHeight}px' alt='正在加载' />`
})
document.getElementsByClassName("leftList")[0].innerHTML = leftListText;
var rightListText = ''
listRight.forEach(itemr => {
rightListText += `<img src=${itemr.download_url} style='height:${itemr.showHeight}px' alt='正在加载' />`
})
document.getElementsByClassName("rightList")[0].innerHTML = rightListText;
loading = false;
}
}
}
</script>
</body>
<style>
.list {
display: flex;
width: 620px;
height: 90vh;
overflow: auto;
background: #e9e9e9;
margin: 5vh auto 0;
}
.leftList,
.rightList {
width: 300px;
}
img {
width: 300px;
}
</style>
</html>