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 解决办法。。。。还不知道  留个疑惑吧 

posted @ 2019-05-05 13:18  跑着的小强  阅读(224)  评论(1编辑  收藏  举报