效果


过程
1、导入masonry库,官网
<script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>
2、绑定页面父元素和子元素
var parent = document.querySelector('.media-container');
var msnry = new Masonry(elem, {
itemSelector: '.media-item',
});
3、页面元素的排布:
- 父元素包含默认要显示的子元素
- 其他子元素放到父元素外(很重要!!!不这样做会导致masonry计算出bug)
4、完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Masonry Layout Example</title>
<style>
.grid {
margin: 0 auto;
position: relative;
}
.item {
width: 30%;
margin-bottom: 10px;
margin-right: 10px;
background-color: #ddd;
padding: 20px;
box-sizing: border-box;
}
.view-more {
margin-top: 20px;
text-align: center;
}
.view-more button {
padding: 10px 20px;
cursor: pointer;
background-color: #007bff;
color: white;
border: none;
border-radius: 5px;
}
.hidden-item {
display: none;
}
.item:nth-child(odd) {
height: 150px;
}
.item:nth-child(even) {
height: 250px;
}
.item:nth-child(3n) {
height: 100px;
}
</style>
</head>
<body>
<div class="parent">
<div class="item">Item 1</div>
<div class="item">Item 2</div>
<div class="item">Item 3</div>
<div class="item">Item 4</div>
<div class="item">Item 5</div>
<div class="item">Item 6</div>
<div class="item">Item 7</div>
<div class="item">Item 8</div>
</div>
<div class="view-more">
<button id="load-more">加载更多</button>
</div>
<div class="item hidden-item">Item 9</div>
<div class="item hidden-item">Item 10</div>
<div class="item hidden-item">Item 11</div>
<div class="item hidden-item">Item 12</div>
<div class="item hidden-item">Item 13</div>
<div class="item hidden-item">Item 14</div>
<div class="item hidden-item">Item 15</div>
<div class="item hidden-item">Item 16</div>
<div class="item hidden-item">Item 17</div>
<script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const parent = document.querySelector('.parent');
const loadMoreButton = document.getElementById('load-more');
const hiddenItems = document.querySelectorAll('.item.hidden-item');
let currentIndex = 0;
const loadCount = 4;
const msnry = new Masonry(parent, {
itemSelector: '.item',
percentPosition: true
});
msnry.layout();
loadMoreButton.addEventListener('click', function () {
const newItems = [];
for (let i = currentIndex; i < currentIndex + loadCount; i++) {
if (i >= hiddenItems.length) {
this.style.display = 'none';
break;
}
const item = hiddenItems[i];
item.classList.contains('hidden-item') ? item.classList.remove('hidden-item') : false
item.style.display = 'block';
parent.appendChild(item);
newItems.push(item);
}
currentIndex += loadCount;
msnry.appended(newItems);
msnry.layout();
});
});
</script>
</body>
</html>