35 瀑布流分析

定位后确定浏览器显示区域内,一行能放多少列图片盒子

- 获取页面宽度

- 获取图片盒子的宽度

- 显示的列数 = 页面宽度 / 图片盒子宽度

column = pageWidth / itemWidth

------------------------

显示美观 一般都会加一个空隙

- 显示的列数 = 页面宽度 / (图片盒子宽度 + 间隙)

- column = pageWidth / (itemWidth + gap)

------------------------------

确定列数之后,排列第一行

- 下面还有很多图片盒子,我们要先排列第1行,所以在for循环里就要判断一下,当i(所有图片盒子的索引) < column时,说明在第一行

- 知道在第1行之后,动态设置每个盒子的left值就能排好第1行

- left=i*(itemWidth + gap)

-----------------------------------------

第一行排列好之后,获取第1行所有图片盒子的高度

- 需要定义一个数组arr,将获取到的高度存在数组中,因为第2行排列时需要考虑top值,此时只能根据第1行图片盒子的高度来设置

- 获取图片高度的时候要注意,程序必须写在入口函数onload里面,因为图片的加载特性是:等页面都加载完之后才去请求加载,所以不写在入口函数里可能会出现高度获取不到的情况

排列第2行

- 获取到刚刚数组中,高度最小的那一列,将第2行的第1个图片盒子放置在它的下方

- 此时的left值就是高度最小列的offsetLeft,top值就是:第1行高度最小列的高度(为了布局美观可以加上上下间隙gap)

- 记录下高度最小列的索引index,后面计算会用到

- 设置完成后,会发现后面所有的图片都叠在这个高度最小列的下面,这是因为此时的最小高度列没有改变,应该加上下面图片的高度,得出一个新高度

改变最小列当前高度

- 此时的这一列高度其实已经发生改变了,所以需要将新高度赋值给数组

- 当前高度最小列的高度 = 当前高度最小列的高度 + 间隙 +下面盒子的高度

瀑布流的实现

var box=document.getElementById("box")
var items=box.children
var gap=10
window.onload = function(){
    waterFall()
    function waterFall(){
        //视口的宽度
        var pageWidth = getClient().width
        var itemWidth = items[0].offsetwidth
        var columns = parseInt(pageWidth / (itemWidth + gap))
        
        var arr=[]
        for(var i=0;i<items.length;i++){
            if(i<columns){
                items[i].style.top=0
                items[i].style.left=i*(itemWidth+gap)+'px'
                arr.push(items[i].offsetHeight)
            }else{
                //其他行
                //找到第一行的最小高度和最小索引
                var minHeght=arr[0]
                var index=0
                for(var j=0;j<arr.length;j++){
                    if(minHeght>arr[j]){
                        minHeght=arr[j]
                        index=j
                    }    
                }
                items[i].style.left=items[index].offsetLeft+'px'
                items[i].style.top=minHeght+gap+'px'
                arr[index]+=items[i].offsetHeight + gap
            }
        }
    }
}

 滚动加载更多图片

window.onscroll=function(){
    //如果图片到了视野当中
    if(getClient().height + getScrollTop() >= items[items.length-1].offsetTop){
        //最后一张图片都没有了 肯定要加载其他的图片
        var datas=[
            "./img/1.jpg",
            "./img/2.jpg"
        ]
        for(var i=0;i<datas.length;i++){
            var div=document.createElement('div')
            div.className='item'
            div.innerHTML='<img src="'+datas[i]+'" alt="">'
            box.appendChild(div)
        }
        waterFall()
    }
}

//得到滚动条的滚动高度
function getScrollTop(){
    return window.pageYOffset || document.documentElement.scrollTop
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值