JS 无线滚动的瀑布流

本文介绍了如何使用JavaScript实现无限滚动的瀑布流布局。主要内容包括HTML结构设置、CSS样式定义,以及JavaScript的关键步骤:获取页面元素、解析数据、填充数据、形成瀑布流效果,并通过判断滚动位置来实现动态加载更多内容。
摘要由CSDN通过智能技术生成

1、html代码部分

<div class="box"></div>

2、css样式部分

        * {
            margin: 0;
            padding: 0
        }
        .box {
            margin: 0 auto;
            position: relative;
        }
        img {
            margin: 20px;
            border: 1px solid skyblue;
            box-shadow: 5px 5px 20px skyblue;
            border-radius: 20px;
            padding: 20px;
        }
        .f {
            float: left;
        }

3、 js部分

  (1)获取页面元素

var box = document.querySelector('.box');

   (2) 解析数据

 var data = JSON.parse(dataStr);

   (3) 填充数据

   function addImg() {
        for (var i = 0; i < data.src.length; i++) {
            var div = document.createElement('div');
            div.className = 'f';
            var img = document.createElement('img');
            img.src = 'img/' + data.src[i];
            div.appendChild(img);
            box.appendChild(div);
        }
    }

   (4)形成瀑布流

   function createWall() {
        //1.获取视口的宽度
        var clientWidth = document.documentElement.clientWidth;
        //2.获取一个div的宽度
        var imgs = document.querySelectorAll('.f');
        var oneWidth = imgs[0].offsetWidth;
        //3.求出数量
        var count = Math.floor(clientWidth / oneWidth);
        //设置box的宽度  数量* 一个div的宽度
        box.style.width = count * oneWidth + 'px';
        //遍历所有的图片
        //定义数组 记录第一排图片的高度
        var heightArr = [];
        for (var i = 0; i < imgs.length; i++) {
            if (i < count) {
                heightArr.push(imgs[i].offsetHeight);
            } else {
                //0.子元素相对父元素定位
                imgs[i].style.position = 'absolute';
                //1.获取数组内最小的值
                var minValue = Math.min.apply(null, heightArr);
                //2.获取最小值的下标
                var index = heightArr.indexOf(minValue);
                //3.获取此元素 并 获取它的offsetLeft
                var left = imgs[index].offsetLeft;
                //5.为下一个元素赋值left top
                imgs[i].style.left = left + 'px';
                imgs[i].style.top = minValue + 'px';
                //6.将数组内的高度进行修改 =  当前最小值的高度 + 已经展示图片的高度
                heightArr[index] = minValue + imgs[i].offsetHeight;
            }
        }
    }
    window.onload = function () {
        createWall();
    };

  (5) 判断视口+滚动距离是否大于 最后一个元素 距父元素的高度

  function isLoadMore() {
        var clientHeight = document.documentElement.clientHeight;

        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;


        var imgs = document.querySelectorAll('.f');

        var offsetTop = imgs[imgs.length - 1].offsetTop;

        //满足加载更多的条件
        if(clientHeight+scrollTop>offsetTop){
            return true;
        }
    }

  (6)当文档发生滚动时,进行加载更多

   window.onscroll = function () {
       var flag =  isLoadMore();
        if(flag){
            //进入分支 可以加载更多
            addImg();
            createWall();
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值