JavaScript—瀑布流
现在网页中需要翻页的列表,好多都已经改为瀑布流了。所以这个思路还是特别重要的
HTML

Css

页面

因为每个图片的高度不一样所以她的 top 和left 我们待会通过JS计算 动态生成
js部分 思路注释
<script>
// 1.获取父容器的宽度 获取子容器的宽度 算出一列放多少个,边距
// 2.通过计算盒子的高度,布局方法
// 3.瀑布流启动
//获取父容器
let itemBox=document.getElementById('itembox')
//父容器宽度
let iBoxW=itemBox.offsetWidth;
// 子容器和宽度
let item=document.getElementsByClassName('item')
let itemW=item[0].offsetWidth
//列数
const rowNum=Math.floor(iBoxW/itemW)
//间距
const distents=Math.floor((iBoxW-itemW*rowNum)/rowNum)
// console.log(distents,rowNum)
// 每个图片的left=列数*(图片大小+间距)
//每个图片的top值为当前高度最低的top
//保存每列的高度、索引就是我们放的列数,值就是top
let arr=[]
// 实现布局
for (let i=0;i<item.length;i++){
// 第一排top为0
if (i<rowNum){
item[i].style.left=i*(itemW+distents)+'px';
item[i].style.top='0px'
arr[i]=item[i].offsetHeight;
}
// 第二 三 四。。。。排
else {
let Minarr=MinArr(arr)
item[i].style.left=Minarr.index*(itemW+distents)+'px';
item[i].style.top=Minarr.min+'px'
console.log(item[i].offsetHeight,arr)
//更新数组高度
arr[Minarr.index]+=item[i].offsetHeight
}
}
let json=['bl1.jpg','bl5.jpg','bl6.jpg','bl7.jpg','bl8.jpg','bl4.jpg','bl3.jpg','bl2.jpg','CJD2.jpg','CJD4.jpg','CJD1.jpg','CJD3.jpg']
console.log(MinArr(arr),arr)
//启动瀑布流
//滚动事件
window.onscroll=function () {
//浏览器可视高度
let toH=window.innerHeight
//浏览器滚动超出的高度
let doH=window.pageYOffset
let Minarr=MinArr(arr)
//当这2个值+起来>最小列宽度时加载数据
if (toH+doH>Minarr.min){
for (let i=0;i<json.length;i++){
//创建元素
let div=document.createElement('div')
div.className='item'
let img=document.createElement('img')
img.src='images/'+json[i]
//设置TOP left
// 每个图片的left=列数*(图片大小+间距)
//每个图片的top值为当前高度最低的top
div.style.top=Minarr.min+'px'
div.style.left = Minarr.index*(itemW+distents)+'px';
//添加
div.appendChild(img)
itemBox.appendChild(div)
//保存每列的高度、索引就是我们放的列数,值就是top
arr[Minarr.index]+=div.offsetHeight
// 重新排序
Minarr=MinArr(arr)
}
//后期用AJAX 改变JSOn的值
}
}
//最小高度和索引
function MinArr(arr) {
let mArr={}
mArr.min=arr[0]
mArr.index=0;
for (let i=1;i<arr.length;i++){
if (mArr.min>arr[i]){
mArr.min=arr[i]
mArr.index=i;
}
}
return mArr
}
</script>
疑问
document.body.clientWidth ==> BODY对象宽度
document.body.clientHeight ==> BODY对象高度
document.documentElement.clientWidth ==> 可见区域宽度
document.documentElement.clientHeight ==> 可见区域高度
我开始用获取body的高度时候始终都是0 原因是因为绝对定位不能将父容器撑开 产生了BFC 解决办法。。。。还不知道 留个疑惑吧

浙公网安备 33010602011771号