瀑布流(31)

本文详细介绍了如何使用JavaScript和jQuery实现瀑布流布局,通过获取数据并按列高度排序进行内容填充,确保列间高度差最小。同时,文章还展示了在页面滚动到底部时如何加载更多数据,实现无限滚动加载的效果,确保用户体验流畅。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 * 瀑布流

 *   效果:多列的不规则排列,每一列中有很多内容,每一项内容的高度不定,最后我们按照规则排列,三列之间不能相差太多高度

 *

 *   实现:首先获取需要展示的数据(假设有50条,共三列),把50条数据中的前三条依次插入到三列中(目前有的列高有的列低),接下来在拿出三条数据,但是本次插入不是依次插入,而是需要先把当前三列按照高矮进行排序,哪个最矮,先给哪个插入内容,以此类推,把50条数据都插入即可

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>珠峰培训-瀑布流</title>
    <link rel="stylesheet" href="css/reset.min.css">
    <link rel="stylesheet" href="css/index.css">
</head>
<body>
<ul class="flowBox clearfix">
    <li>
        <!--<a href="#">
            <div><img src="img/13.jpg" alt=""></div>
            <span>泰勒·斯威夫特(Taylor Swift),1989年12月13日出生于美国宾州,美国歌手、演员。2006年出道,同年发行专辑《泰勒·斯威夫特》,该专辑获得美国唱片业协会的白金唱片认证</span>
        </a>-->
    </li>
    <li>

    </li>
    <li>

    </li>
</ul>

<script src="js/jquery-1.11.3.min.js"></script>
<script src="js/index.js"></script>
</body>
</html>
html, body {
    background: #F4F4F4;
    overflow-x: hidden;
}

.flowBox {
    margin: 20px auto;
    width: 1000px;
}

.flowBox li {
    float: left;
    margin-right: 20px;
    width: 320px;
}

.flowBox li:nth-last-child(1) {
    margin-right: 0;
}

.flowBox li a {
    display: block;
    margin-bottom: 10px;
    padding: 10px;
    background: #FFF;
    box-shadow: 3px 3px 10px 0 #666; /*CSS3设置盒子阴影:(inset) X Y 阴影模糊度 阴影模糊半径 阴影的颜色*/
}

/*.flowBox li a div {*/
    /*background: url("../img/default.gif") no-repeat center center #EEE;*/
/*}*/

.flowBox li a div img {
    display: block;
    width: 100%;
}

.flowBox li a span {
    display: block;
    margin-top: 10px;
    font-size: 12px;
    color: #555;
    line-height: 20px;
}
$(function () {
    //=>当HTML结构加载完成才会执行这里的代码(闭包)

    //1.获取需要的数据
    //真实项目中,我们第一页加载完成,当用户下拉到底部,开始获取第二页的内容。服务器端会给我们提供一个API获取数据的地址,并要求客户端把获取的是第几页的内容传递给服务器,服务器依照这个原理把对应不同的数据返回“分页技术”
    let page = 0,
        imgData = null;
    let queryData = () => {
        page++;
        $.ajax({
            url: `json/data.json?page=${page}`,
            method: 'get',
            async: false,//=>同步请求(真实项目中使用的是异步)
            dataType: 'json',//=>把从服务器端获取的JSON字符串转化为对象(我们这样设置后,JQ内部会帮我们转换)
            success: result => {
                //=>result:就是我们从服务器端获取的结果
                imgData = result;
            }
        });
    };
    queryData();

    //2.数据绑定
    //=>传递一个对象进来,返回对应的结构字符串
    let queryHTML = ({id, pic, link, title} = {}) => {
        return `<a href="${link}">
            <div><img src="${pic}" alt=""></div>
            <span>${title}</span>
        </a>`;
    };

    let $boxList = $('.flowBox > li'),
        boxList = [].slice.call($boxList);
    // console.log($boxList.get());//=>把JQ类数组对象转换为数组(GET不能传参,传参数就是获取类数组中的某一项了)
    for (let i = 0; i < imgData.length; i += 3) {
        //=>分别获取每三个为一组,一组中的三个内容(存在的隐性风险:当前数据总长度不是3的倍数,那么最后一次循环的时候,三个中的某一个会不存在,获取的ITEM值是UNDEFINED)
        let item1 = imgData[i],
            item2 = imgData[i + 1],
            item3 = imgData[i + 2];
        //=>我们接下来要把获取的ITEM依次插入到每一个LI中,但是绝对不是按照顺序插入,我们需要先按照每一个LI的现有高度给LI进行排序(小->大),按照最新的顺序依次插入即可
        boxList.sort((a, b) => a.offsetHeight - b.offsetHeight);

        if (item1) {
            boxList[0].innerHTML += queryHTML(item1);
        }

        if (item2) {
            boxList[1].innerHTML += queryHTML(item2);
        }

        if (item3) {
            boxList[2].innerHTML += queryHTML(item3);
        }
    }


});
$(function () {
    //1.获取数据
    let page = 0,
        imgData = null,
        isRun = false;
    let queryData = () => {
        page++;
        $.ajax({
            url: `json/data.json?page=${page}`,
            method: 'get',
            async: false,
            dataType: 'json',
            success: result => {
                imgData = result;
            }
        });
    };
    queryData();

    //2.数据绑定
    let bindHTML = () => {
        let $boxList = $('.flowBox > li');
        for (let i = 0; i < imgData.length; i += 3) {
            $boxList.sort((a, b) => {
                return $(a).outerHeight() - $(b).outerHeight();
            }).each((index, curLi) => {
                let item = imgData[i + index];
                if (!item) return;
                let {id, pic, link, title} = item;
                $(`<a href="${link}">
                    <div><img src="${pic}" alt=""></div>
                    <span>${title}</span>
                </a>`).appendTo($(curLi));
            });
        }
        isRun = false;
    };
    bindHTML();
    
    //3.当滚动到页面底部的时候,加载下一页的更多数据
    $(window).on('scroll', () => {
        let winH = $(window).outerHeight(),
            pageH = document.documentElement.scrollHeight || document.body.scrollHeight,
            scrollT = $(window).scrollTop();
        if ((scrollT + 100) >= (pageH - winH)) {
            if (isRun) return;
            isRun = true;
            if (page > 5) {
                alert('没有更多数据了');
                return;
            }
            queryData();
            bindHTML();
        }
    });
});
$(window).on('scroll', () => {
        let winH = $(window).outerHeight(),
            pageH = document.documentElement.scrollHeight || document.body.scrollHeight,
            scrollT = $(window).scrollTop();
        //=>卷去的高度 大于 真实高度-一屏幕高度:距离底下还有100PX,我们让其开始加载更多的数据
        if ((scrollT + 100) >= (pageH - winH)) {
            //隐性问题:认为操作滚动,这个在同一个操作内会被触发N次,也就是同一个时间段,获取数据会被执行N次,此时我们需要做“重复操作限定”
            if (isRun) return;
            isRun = true;//=>开始进行新一轮处理了

            if (page > 5) {
                alert('没有更多数据了');
                return;
            }

            queryData();
            bindHTML();
        }
    });
HTML和CSS是构建网页和网页样式的核心技术。下面是一些HTML和CSS的100个实际例子: 1. 创建一个简单的网页 2. 设置网页的标题 3. 插入图片 4. 创建一个链接 5. 设置文字的颜色 6. 调整文字的大小 7. 设置背景颜色 8. 创建一个列表 9. 设置列表的样式 10. 创建一个表格 11. 设置表格的边框 12. 调整表格的宽度和高度 13. 设置表格的背景颜色 14. 创建一个按钮 15. 设置按钮的样式 16. 创建一个导航栏 17. 设置导航栏的样式 18. 创建一个下拉菜单 19. 设置下拉菜单的样式 20. 创建一个表单 21. 设置表单元素的样式 22. 创建一个单行文本输入框 23. 创建一个多行文本输入框 24. 创建一个复选框 25. 创建一个单选按钮 26. 创建一个提交按钮 27. 创建一个重置按钮 28. 创建一个页面布局 29. 设置页面布局的样式 30. 创建一个响应式布局 31. 设置响应式布局的样式 32. 创建一个响应式导航栏 33. 设置响应式导航栏的样式 34. 创建一个响应式图片库 35. 设置响应式图片库的样式 36. 创建一个响应式表格 37. 设置响应式表格的样式 38. 创建一个响应式表单 39. 设置响应式表单的样式 40. 创建一个响应式按钮 41. 设置响应式按钮的样式 42. 创建一个响应式网页 43. 设置响应式网页的样式 44. 创建一个网页动画 45. 设置网页动画的样式 46. 创建一个瀑布布局 47. 设置瀑布布局的样式 48. 创建一个网页轮播图 49. 设置网页轮播图的样式 50. 创建一个网页图片画廊 51. 设置网页图片画廊的样式 52. 创建一个响应式图片画廊 53. 设置响应式图片画廊的样式 54. 创建一个网页背景视频 55. 设置网页背景视频的样式 56. 创建一个网页滚动效果 57. 设置网页滚动效果的样式 58. 创建一个网页登录界面 59. 设置网页登录界面的样式 60. 创建一个网页注册界面 61. 设置网页注册界面的样式 62. 创建一个网页404页面 63. 设置网页404页面的样式 64. 创建一个网页加载动画 65. 设置网页加载动画的样式 66. 创建一个网页弹出框 67. 设置网页弹出框的样式 68. 创建一个网页提示框 69. 设置网页提示框的样式 70. 创建一个网页警告框 71. 设置网页警告框的样式 72. 创建一个网页成功提示框 73. 设置网页成功提示框的样式 74. 创建一个网页错误提示框 75. 设置网页错误提示框的样式 76. 创建一个网页消息提示框 77. 设置网页消息提示框的样式 78. 创建一个网页确认提示框 79. 设置网页确认提示框的样式 80. 创建一个网页提醒框 81. 设置网页提醒框的样式 82. 创建一个响应式卡片布局 83. 设置响应式卡片布局的样式 84. 创建一个网页音频播放器 85. 设置网页音频播放器的样式 86. 创建一个网页视频播放器 87. 设置网页视频播放器的样式 88. 创建一个网页计数器 89. 设置网页计数器的样式 90. 创建一个网页进度条 91. 设置网页进度条的样式 92. 创建一个网页滑动条 93. 设置网页滑动条的样式 94. 创建一个网页评分器 95. 设置网页评分器的样式 96. 创建一个网页等比例图 97. 设置网页等比例图的样式 98. 创建一个网页图片标注 99. 设置网页图片标注的样式 100. 创建一个网页网格布局 101. 设置网页网格布局的样式 这些例子展示了HTML和CSS的实际应用,帮助开发人员更好地理解和掌握这两门技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值