1.什么是瀑布流
它们的图片明明每一张的高度大小都不同,但是却能自动地适应,排成一行一行地展示,并且下拉到底的时候,加载的图片也会自动适应,这就是瀑布流。如下图:
2.事先准备
HTML结构
<body>
<div class="itemBox">
<div class="item">
<img src="./images/P_000.jpg" alt="">
</div>
<div class="item">
<img src="./images/P_001.jpg" alt="">
</div>
...
...
...
<div class="item">
<img src="./images/P_014.jpg" alt="">
</div>
<div class="item">
<img src="./images/P_015.jpg" alt="">
</div>
</div>
</body>
//准备大概15张图片
CSS样式
<style>
* {
margin: 0;
padding: 0;
}
.itemBox {
width: 1050px;
margin: 0 auto;
position: relative;
}
.item {
border: 1px solid #ccc;
padding: 4px;
position: absolute;
}
</style>
3.瀑布流核心
JavaScript行为:
<script>
window.onload = function () { //页面加载完毕后执行
var arr = []; //存储照片行高
// 1.获取相关元素
var itemBox = document.getElementsByClassName('itemBox')[0];
var items = document.getElementsByClassName('item');
// 2.1获取.itemBox 宽度
var itemBoxW = itemBox.offsetWidth;
// 2.2获取 .item 宽度
var itemW = items[0].offsetWidth;
// 3.求出列数
var column = parseInt(itemBoxW / itemW);
// 4.求图片间间距
var distence = (itemBoxW - itemW * column) / (column - 1);
// 5.调用实现瀑布流布局的方法
waterFull();
// 6.滚动页面时,加载数据
window.onscroll = function () {
// 滚动条顶部到网页顶部的距离+浏览器窗口高度 > 数组中最低高度
if (window.pageYOffset + window.innerHeight > getMin(arr).minV) {
var json = [
{ "src": "./images/P_000.jpg" },
{ "src": "./images/P_001.jpg" },
{ "src": "./images/P_002.jpg" },
{ "src": "./images/P_003.jpg" },
{ "src": "./images/P_004.jpg" },
{ "src": "./images/P_005.jpg" },
{ "src": "./images/P_006.jpg" },
{ "src": "./images/P_007.jpg" },
{ "src": "./images/P_008.jpg" },
{ "src": "./images/P_009.jpg" },
{ "src": "./images/P_010.jpg" }
];
for (var i = 0; i < json.length; i++) {
//创建div标签
var div = document.createElement("div");
//设置div标签的class值为"item"
div.className = "item";
//创建img标签
var img = document.createElement("img");
//设置标签的src属性为json对象里面src
img.src = json[i].src;
//将img添加到div标签里面
div.appendChild(img);
//将div添加到页面
itemBox.appendChild(div);
}
waterFull();
}
}
//实现瀑布流布局的方法
function waterFull() {
for (var i = 0; i < items.length; i++) {
if (i < column) { // 设置第一行left值
items[i].style.left = (itemW + distence) * i + 'px';
arr[i] = items[i].offsetHeight; //将一个行每个行高存储到数组中
} else {
var minV = getMin(arr).minV;
var minI = getMin(arr).minI;
items[i].style.left = (itemW + distence) * minI + 'px';
items[i].style.top = minV + distence + 'px';
arr[minI] = minV + distence + items[i].offsetHeight;//将新高度存入数组
}
}
}
//获取数组最小值以及索引
function getMin(arr) {
var obj = {};
obj.minV = arr[0]; //存储数组最小值
obj.minI = 0; //存储最小值下标
for (var i = 1; i < arr.length; i++) {
if (obj.minV > arr[i]) {
obj.minV = arr[i];
obj.minI = i;
}
}
return obj;
}
}
</script>