瀑布流和滚动加载

1,498 阅读1分钟

1:思路

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

●获取页面的宽度

●获取图片盒子的宽度

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

●显示美观一般都会加一个空隙,显示的列数=页面宽度/(图片盒子宽度+间隙)column = pageWidth 1 (itemWidth + gap);

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

●知道在第1行之后,动态设置每个图片盒子的left值就能排好第1行,left=i* ( itemWidth+ gap );

image.png

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

image.png

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

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

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

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

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

image.png

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

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

image.png

2:代码

ps:此代码,只有js部分,不全,仅作为提供思路

  window.onload = function () {
            waterFall()

            function waterFall() {
                //视口的宽度
                var pageMidth = getClient().width
                var itenMidth = items[e].offsetWidth
                //column = pageWidth / itemwidth
                var columns = parseInt(pageWidth / (itenWidth + gap))
                // 里面放的是高度的值
                var arr = []
                for (var i = 0; 1 < items.Length; 1++) {
                    if (1 < colunns) {
                        //确定第一行
                        itens[i].style.top = 0
                        itens[1].style.Left = (itenlidth + gap) * i + 'px'
                        arr.push(items[i].offsetHeight)
                    } else {
                        // 其他行,找到第一行高度,最小的索引
                        var minHeight = arr[e]
                        var index = 0
                        for (var j = 0; j < arr.length; j++) {
                            if (minHeight > arr[j]) {
                                minHeight = arrl[j]
                                index = j
                            }
                        }
                        //做什么
                        //设置下一行第一个盒子的位置第张图片的位置
                        items[i].style.top = arr[index] + gap + 'px '
                        //left
                        items[1].style.left = items[index].offsetleft + 'px'
                        arr[index] = arr[index] + items[i].offsetHeight + gap
                    }
                }
            }
            // 滚动加载图片
            window.onscroll = function () {
                // 时机如何把握
                if (getClient().height + getScollTop() >= items[items.length - 1].offsetTop) {
                    // 最后一张图片都没了,要加载其他图片现形
                    // 假设从后端获取的图片
                    var datas = [
                        "./img1.jpg",
                        "./img2.jpg",
                        "./img3.jpg",
                        "./img4.jpg",
                        "./img5.jpg",
                        "./img6.jpg",
                        "./img7.jpg",
                    ]
                    for (var i = 0; i < datas.length; i++) {
                        var div = document.createElement('div')
                        div.className = 'item'
                        div.innerHTML = '<img src=" ' + datas[i] + '">'
                        box,appendChild(div)
                    }
                    waterFall()
                }
            }
        }

        function getScollTop() {
            return window.pageYOffset || document.documentElement.scroll
        }