返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript瀑布流的实现你学会了吗
  • 267
分享到

JavaScript瀑布流的实现你学会了吗

2024-04-02 19:04:59 267人浏览 八月长安
摘要

目录瀑布流的核心案例注意点(1)服务器加载网络图片的meta标签(2)瀑布流执行的判断依据(3)函数的节流(4)服务器配置更改 运行结果总结瀑布流的核心 1,  

瀑布流的核心

1,  根据 ajax请求的响应体结果 动态渲染生成页面

请求地址 请求方式 参数键名 都是 后端程序定义的

前端 只能根据需求 定义 携带的具体的参数数据

响应体数据是后端程序返回的数据结果

只能获取数据结果 不能修改数据结果

可以根据 响应体数据结果 动态渲染生成页面内容

可以使用 三元运算符 给标签定义属性等

2,  瀑布流 再次 发起请求的判断依据

上卷高度 + 视窗窗口高度 + 预留高度 > 最矮ul占位高度

3,  函数的节流

同时触发 多次执行 相同的函数程序

只需要触发执行 第一次 函数程序的调用

原理:

  • 定义一个 开关变量
  • 变量储存原始数据

执行判断

  • 如果 变量 存储原始数据  变量赋值其他数据
  • 如果 变量 存储其他数据  执行 return 终止之后程序的执行

当 函数的所有程序都触发执行结束

变量 赋值原始值 可以再次触发 新的函数

案例

这里用某糖网站作为案例,调用某糖网站的接口,仿一个简单的网页。

代码

<!DOCTYPE html>
<html lang="en">
 
<head>
    <!-- 服务器加载网络图片的meta标签 -->
    <meta name="referrer" content="never">
 
    <meta charset="UTF-8">
    <meta Http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
 
        .btn {
            width: 300px;
            margin: 50px auto;
        }
 
        ul,
        ol,
        li {
            list-style: none;
        }
 
        img {
            display: block;
            width: 100%;
            height: 100%;
        }
 
        a,
        a:hover,
        a:active {
            text-decoration: none;
        }
 
        .box {
            width: 1200px;
            margin: 0 auto;
        }
 
        .box::after {
            display: block;
            content: "";
            clear: both;
        }
 
        .box ul {
            width: 260px;
            float: left;
            margin: 0 20px;
        }
 
        .box ul li {
            width: 100%;
            display: flex;
            flex-direction: column;
            border: 2px solid #000;
            margin: 0 0 15px 0;
        }
 
        .box ul li .imgBox {
            width: 100%;
 
        }
 
        .box ul li .contentBox {
            width: 100%;
            padding: 15px;
            display: flex;
            flex-direction: column;
            justify-content: space-between;
        }
 
        .box ul li .contentBox p {
            display: flex;
            justify-content: flex-start;
            align-items: center;
        }
 
        .box ul li .contentBox p:nth-child(1) {
            margin: 10px 0;
        }
 
        .box ul li .contentBox p:nth-child(2) {
            margin: 10px 0;
        }
 
        .box ul li .contentBox p:nth-child(2) span {
            margin: 0 10px 0 0;
        }
 
        .box ul li .contentBox p:nth-child(2) span i {
            margin: 0 10px 0 0;
        }
 
 
        .box ul li .contentBox p:nth-child(3) span:nth-child(1) {
            display: block;
            width: 40px;
            height: 40px;
            border-radius: 50%;
            overflow: hidden;
            margin: 0 10px 0 0;
        }
    </style>
 
</head>
 
<body>
    <div class="btn">
        <button>美食菜谱</button>
        <button>美妆造型</button>
        <button>家居生活</button>
        <button>人物明星</button>
    </div>
 
    <!-- div中的内容是 动态生成的 -->
    <div class="box"></div>
 
 
    <script src="../../ajax.js"></script>
    <script>
        // 定义全局变量 存储相关的数据信息
        let start;
        let time;
        let keyWord;
 
        // 获取父级div标签
        const oBox = document.querySelector('.box');
 
        // 定义全局变量 存储 要使用的数据
        let oUls;
        let flag = true;
 
 
        // 获取 所有的button按钮
        const oBtns = document.querySelectorAll('button');
        // 循环遍历 给 所有的button标签 添加 点击事件
        oBtns.forEach(item => {
            item.addEventListener('click', function () {
                // 默认第一次显示的是从索引下标是0开始的第一条数据
                start = 0;
 
                // 获取关键词
                keyword = this.innerHTML;
 
                // 向 div标签中写入 4个ul空标签
                oBox.innerHTML = "<ul></ul><ul></ul><ul></ul><ul></ul>";
 
                // 获取 所有的ul标签对象 
                oUls = oBox.querySelectorAll('ul');
 
                // 调用执行 async await 和 promise执行的 ajax请求
                setPage();
            })
        })
 
        // 定义 页面滚动监听事件
        window.addEventListener('scroll', function () {
            // 获取 占位数据数值
 
            // 页面上卷高度
            let scrollTop = document.documentElement.scrollTop;
 
            // 视窗窗口占位高度
            let winHeight = document.documentElement.clientHeight;
 
            // 设定预留高度
            let height = 500;
 
            // 获取最矮ul标签对象
            // 循环结束 minUl 变量中 存储 最矮ul标签对象
            let minUl = oUls[0];
            for (let i = 0 + 1; i <= oUls.length - 1; i++) {
                // 如果 minUl 变量中 存储的 ul标签 高度 大于 oUls[i]循环遍历的ul标签的占位 
                // 变量minUl 中 存储 oUls[i] 循环遍历的ul标签 
                if (minUl.offsetHeight > oUls[i].offsetHeight) {
                    minUl = oUls[i];
                }
            }
 
            // 执行判断 
            if (scrollTop + winHeight + height > minUl.offsetHeight) {
                // 再次发起请求 动态渲染生成新的页面内容
 
                
 
                // 判断变量储存的数据 防止多次调用函数
                if (flag) {
                    flag = false;
                } else {
                    return;
                }
 
                // 再次调用函数 发起新的请求 动态渲染生成新的页面
                setPage();
            }
        })
 
 
        // 使用 async 定义 异步请求函数程序
        async function setPage() {
            // 获取 时间对象 和 时间戳
            const t = new Date();
            time = t.getTime();
 
            // 发起请求时 根据需求 设定 ajax请求携带的参数数据
            // response中存储的是响应体数据 
            const response = JSON.parse(await myPromiseAjax('/dt', 'get', `include_fields=top_comments%2Cis_root%2Csource_link%2Citem%2Cbuyable%2Croot_id%2Cstatus%2Clike_count%2Csender%2Calbum%2Creply_count&filter_id=${keyword}&start=${start}&_=${time}`));
 
 
 
            console.log(response);
 
            // 给下一次 请求 赋值起始数据的索引下标
            start = response.data.next_start;
 
            // 获取 24条数据的数组
            const arr = response.data.object_list;
 
            // 循环遍历 数组中的24个单元 
            arr.forEach(item => {
                // 根据数组单元的数据 生成 li标签
                let str = `
                    <li>
                    
                    <div class="imgBox" style="height:${260 * item.photo.height / item.photo.width}px">
                        <img src="${item.photo.path}" alt="">
                    </div>
                    <div class="contentBox">
                        <p>${item.msg}</p>
                        <p>
                            <span style="${item.like_count === 0 ? 'display:none' : ''}">
                                <i>点赞</i>${item.like_count}
                            </span>
                            <span style="${item.favorite_count === 0 ? 'display:none' : ''}">
                                <i>收藏</i>${item.favorite_count}
                            </span>
                        </p>
                        <p>
                            <span>
                                <img src="${item.sender.avatar}" alt="">
                            </span>
                            <span>
                                ${item.sender.username} <br> 
                                发布到 <a href="javascript:;">${item.album.name}</a>
                            </span>
                        </p>
                    </div>
                </li>`;
 
                // 每生成一个li 就要拼接写入最矮的ul标签中
 
                // 获取最矮的ul标签 
                let minUl = oUls[0];
                for (let i = 0 + 1; i <= oUls.length - 1; i++) {
                    // 如果 minUl 变量中 存储的 ul标签 高度 大于 oUls[i]循环遍历的ul标签的占位 
                    // 变量minUl 中 存储 oUls[i] 循环遍历的ul标签 
                    if (minUl.offsetHeight > oUls[i].offsetHeight) {
                        minUl = oUls[i];
                    }
                }
                // 循环结束minUl 中 存储的是 最矮的ul标签对象
                // 向 最矮的ul标签中 拼接写入 li标签
                minUl.innerHTML += str;
            })
 
            // 当请求执行结束 当新的页面内容生成完毕 
            // 可以再次发起新的请求 给 变量赋值原始数据
            flag = true;
        }
 
    </script>
</body>
 
</html>

ajax代码

// 封装一个promise程序执行 ajax请求
// 参数1    请求的url地址
// 参数2    请求的方式 
// 参数3    携带的参数怇
function myPromiseAjax( url , type = 'get' , data = '' ){
    // 创建一个 promise 对象 
    const p = new Promise(function( fulfilled , rejected ){
        // 执行异步ajax请求
        const xhr = new XMLHttpRequest() ;
 
        if( type.toLowerCase() === 'get' ){
            // get请求方式
            xhr.open( 'get' , `${url}?${data}` );
            xhr.send();
 
        }else{
            // post请求方式
            xhr.open( 'post' , url );
            xhr.setRequestHeader('Content-Type' , 'application/x-www-fORM-urlencoded');
            xhr.send(data);
        }
 
        // 接收 请求结果
        xhr.onreadystatechange = function(){  
            // 当 ajax状态码是 4 时 判断 http状态码          
            if( xhr.readyState === 4 ) {
 
                // 如果 http状态码 是 200 - 299 
                if( /^2\d{2}$/.test( xhr.status ) ){
                    // 请求成功
                    fulfilled( xhr.response );  
 
                }else if( /^(4|5)\d{2}$/.test( xhr.status )  ){
                    // 请求失败
                    rejected( xhr.statusText );
 
                }
            }
        }
 
    });
 
    // return 返回这个promise对象
    return p;
}

注意点

(1)服务器加载网络图片的meta标签

(2)瀑布流执行的判断依据

(3)函数的节流

(4)服务器配置更改

 运行结果

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!    

--结束END--

本文标题: JavaScript瀑布流的实现你学会了吗

本文链接: https://lsjlt.com/news/139582.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaScript瀑布流的实现你学会了吗
    目录瀑布流的核心案例注意点(1)服务器加载网络图片的meta标签(2)瀑布流执行的判断依据(3)函数的节流(4)服务器配置更改 运行结果总结瀑布流的核心 1,  ...
    99+
    2024-04-02
  • JavaScript瀑布流怎么实现
    这篇文章主要介绍“JavaScript瀑布流怎么实现”,在日常操作中,相信很多人在JavaScript瀑布流怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript瀑布流怎么实现”的疑惑有所...
    99+
    2023-06-29
  • JavaScript如何实现瀑布流布局
    这篇文章将为大家详细讲解有关JavaScript如何实现瀑布流布局,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。就是一堆等宽不等高的数据块组成的页面,如图: 现在好多网站...
    99+
    2024-04-02
  • JavaScript实现瀑布流布局详解
    目录需求思路代码实现实现效果问题和修正修正后效果总结需求 所谓瀑布流布局,就是含有若干个等宽的列,每一列分别放置图片、视频等,放置的元素都是等宽的,因此可能是不等高的。新的元素到来时...
    99+
    2024-04-02
  • JavaScript实现瀑布流布局的代码分享
    目录前言如何实现html部分css部分js部分瀑布流布局的优点前言 不知道大家在线上购物的时候有没有发现到,自己逛起来根本就停不下来,越往下翻越是觉得就会出现需要的东西。这就是很多电...
    99+
    2023-05-15
    JavaScript实现瀑布流布局 JavaScript瀑布流布局 JavaScript瀑布流
  • JavaScript如何实现瀑布流布局效果
    这篇文章主要讲解了“JavaScript如何实现瀑布流布局效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript如何实现瀑布流布局效果”吧!如何实现思路:将内容宽度一致,高度...
    99+
    2023-07-06
  • 手把手教你用js实现瀑布流布局
    它可以有效的降低页面的复杂度,节省很多的空间;并且,瀑布流的参差不齐的排列方式,可以通过界面展示给用户多条数据,并且让用户可以有向下浏览的冲动,提供了很好的用户体验!例如淘宝的页面就采用了这种布局方式,给大家看看淘宝的瀑布流布局的效果图(手...
    99+
    2023-05-14
    JavaScript
  • 如何使用JavaScript和jQuery实现瀑布流
    这篇文章给大家分享的是有关如何使用JavaScript和jQuery实现瀑布流的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。用JavaScript实现基本结构:<div&n...
    99+
    2024-04-02
  • Django瀑布流的实现示例
    目录需求分析实现流程模型设计视图函数模板settings 配置urlconf 配置包管理模型使用对象封装全局变量需求分析 现在是 "图片为王"的时代,在浏览一些网...
    99+
    2023-03-23
    Django瀑布流
  • 实现瀑布流布局的三种方式
    前言 今天逛闲鱼的时候观察到每一行的高度不是相同的,经了解才知道原来这是一种瀑布流布局,感觉挺有意思,于是决定研究一下,在网上也找了一些方案,实现瀑布流大概有3种方式。 一、JS 实...
    99+
    2024-04-02
  • CSS属性实现瀑布流布局的技巧
    CSS属性实现瀑布流布局的技巧,需要具体代码示例瀑布流布局是一种常见的网页布局方式,特点是将网页内容像瀑布一样从上到下依次排列,且每个内容块的宽度固定,高度可以不同。这种布局方式可以使网页显示更加美观,给用户带来良好的视觉体验。在CSS中,...
    99+
    2023-11-18
    瀑布流布局 技巧 CSS属性
  • JavaScript的事件流你了解吗
    目录1. 什么是事件流?2. 事件流模型2.1)事件冒泡2.2)事件捕获3. DOM事件流总结1. 什么是事件流 ? 在学习事件流之前我们先看...
    99+
    2024-04-02
  • js实现瀑布流的方式有哪些
    使用原生JavaScript实现:通过计算每一列的高度,将新的元素添加到高度最小的列中,从而实现瀑布流布局。 使用jQuer...
    99+
    2024-03-08
    JS
  • CSS布局教程:实现瀑布流布局的最佳方法
    瀑布流布局(Waterfall Layout)是一种常见的网页布局方式,它可以使不同大小的元素以多列的形式依次排列,给人一种瀑布水流般的感觉。这种布局常用于照片墙、产品展示等需要展示多个项目的网页。本文将介绍如何使用CSS实现瀑布流布局,并...
    99+
    2023-10-21
    瀑布流布局 最佳方法 CSS布局
  • jQuery图片瀑布流的简单实现代码
    这篇文章主要为大家展示了“jQuery图片瀑布流的简单实现代码”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jQuery图片瀑布流的简单实现代码”这篇文章吧。具...
    99+
    2024-04-02
  • Vue实现炫酷的代码瀑布流背景
    本文实例为大家分享了Vue实现代码瀑布流背景的具体代码,供大家参考,具体内容如下 先看一下效果: 代码奉上: <template>     <canvas id=...
    99+
    2024-04-02
  • MySQL连接查询你真的学会了吗?
    1.内连接查询概要        内连接是应用程序中非常常见的连接操作,它一般都是默认的连接类型。内连接基于连...
    99+
    2024-04-02
  • javascript的防抖和节流你了解吗
    一:为什么需要防抖与节流  防抖和节流都是为了解决短时间内大量触发某函数或者事件而导致的性能问题,比如在 1.用户体验上,触发频率过高导致的响应速度跟不上触发频率,出现延迟...
    99+
    2024-04-02
  • JS、flex 、column实现瀑布流布局的方式是怎样的
    这篇文章将为大家详细讲解有关JS、flex 、column实现瀑布流布局的方式是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、JS 实现瀑布流思路分析瀑布流布局的特点是等宽不等高。...
    99+
    2023-06-22
  • uniapp小程序实现瀑布流布局的思路与代码
    一、前言 现在写瀑布流算不算是炒冷饭啊? 我不管, 我就要写,谁也别想拦我。 瀑布流应该算是很常见的一种布局方法了,大致的思路也很好理解, 但是在小程序里面确有另外需要考虑的几个问...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作