// 还有没有更多的数据
var hasMoreData = true;
// 是否正在获取数据
var isLoading = false;
//当前获取的是第几页的数据
var page = 0;
var div = document.getElementById("water");
/**
* 创建一个瀑布流插件
* @param {*} areaDom 容器
* @param {*} urls 图片的url数组
* @param {*} everyWidth 每张图片的宽度
*/
function createWaterFall(areaDom, urls, everyWidth) {
// 有多少列
var colNumber;
// 每列间隙
var gap;
/**
* 创建图片的dom对象
*/
function createImgDoms() {
for (var i = 0; i < urls.length; i++) {
var url = urls[i];
var img = document.createElement("img");
img.src = url;
img.style.width = everyWidth + "px";
img.style.position = "absolute";
// 图片加载完成后设置位置 显示
img.onload = function() {
setImgPosition();
};
areaDom.appendChild(img);
}
}
/**
* 计算
*/
function cal() {
// 有多少列?
// colNumber = 容器的宽度 / 图片的宽度
var containerWidth = parseInt(areaDom.clientWidth);
colNumber = parseInt(containerWidth / everyWidth);
// 剩余空间 列间距
var space = containerWidth - colNumber * everyWidth;
gap = space / (colNumber + 1);
}
/**
* 设置每张图片的坐标
*/
function setImgPosition() {
cal();
// 存放的是,每一列的下一个图片的Y坐标
var colY = new Array(colNumber);
// 将数组的每一项填充为0
colY.fill(0);
for (var i = 0; i < areaDom.children.length; i++) {
var img = areaDom.children[i];
// 找到colY中的最小值
var y = Math.min(...colY); //y坐标
// x坐标
// 第几列
var index = colY.indexOf(y);
var x = (index + 1) * gap + index * everyWidth;
img.style.left = x + "px";
img.style.top = y + "px";
// 更新数组
colY[index] += parseInt(img.height) + gap;
}
// 找到数组中最大的数字
var height = Math.max(...colY);
areaDom.style.height = height + "px";
}
/**
* 改变窗口大小
*/
var timer = null;
window.onresize = function() {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(function() {
setImgPosition();
}, 500);
};
setImgPosition();
createImgDoms();
}
function fetchDatas(callback) {
$.ajax({
url: "",
success: function(data) {
// 定义一个变量 表示要显示几页数据
page++;
if (page === 6) {
// 没有数据了
callback([]);
return;
}
callback(data);
}
});
}
function getImgUrls() {
// 刚开始请求时判断是否还有更多的数据
// 判断是否正在请求数据,如果正在请求,则不多次请求
// 该函数某个时间只能运行一次
if (!hasMoreData || isLoading) {
// 已经没数据了 或 正在获取数据
return;
}
isLoading = true;
// 显示刷新圈 利用CSS动画实现一个刷新圈元素
loading.style.display = "block";
// 从这里获取数据
fetchDatas(function(newUrls) {
// 这里创建数据
createWaterFall(areaDom, newUrls, evertWidth);
// 隐藏刷新圈
loading.style.display = "none";
// 如果没有拿到数据
if (urls.length === 0) {
// 标记没有数据
hasMoreData = false;
// 显示没有数据的 div 这个div内有一行文本 没有数据了...
noData.style.display = "block";
}
// 结束后将锁关闭
isLoading = false;
});
}
window.onscroll = function() {
// 距离底部的距离
var bottom =
document.documentElement.scrollHeight -
document.documentElement.scrollTop -
document.documentElement.clientHeight;
if (bottom <= 60) {
getImgUrls();
}
};
// 开局调用 获取图片
getImgUrls();