layui源码详细分析系列之流加载模块

2024-02-19 22:40

本文主要是介绍layui源码详细分析系列之流加载模块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

所谓的流加载实际上是第一种优化手段,通常用于图片丰富的网站,目的是为了提供更好的用户体验。

具体的体现是在页面初始化时,先加载一小部分内容,当用户下拉页面到一定的距离,开始加载另一小部分的内容,直至将所有资源加载呈现,体现的是化整为零的思想,具有较好地用户体现效果。

自实现流加载以及图片懒加载功能

流加载功能和图片懒加载功能是分开实现的,使用原生的JavaScript开发(所有涉及交互效果的案例等都是使用JavaScript来实现,基础才是王道)现在先说说流加载功能,具体的实现效果图如下:
自动加载

上面的是自动带图标加载形式的,还有事按钮形式的加载形式,具体效果图如下:
图标加载形式

下面说说具体的实现思路,实际上就是监听指定元素的scroll事件,当滚动条滚动时需要做的事情:

  1. 判断是否滚动到底部,判断条件是(假设elem就是外部容器节点), elem.clientHeight+ elem.scrollTop === elem.scrollHeight(容器可是区域的高度 + 滚动条距离顶部的距离 === 容器的滚动高度)
  2. 当到达条件时就创建加载区域的节点并追加到容器中,当加载成功后,首先删除加载节点,将元素节点都追加到容器中
  3. 判断资源是否完全加载,完全加载就显示没有多余的资源

在上面实现思路需要考虑的问题:

  • 滚动条向上滚动带来的重复性问题

我的解决是维持一个状态数组,记录任何时刻前一次scroll触发时的scrollTop,与当前scrollTop比较,只有当前scrollTop大于保存的状态值,才进行相应的程序处理。

流加载中最主要的是判断滚动条是否滚动条底部,从而执行程序处理。

图片懒加载:
所谓的图片懒加载就是页面初始化时不加载所有图片,当用户滚动到可视区域(就是图片需要显示的区域时),加载当前可视区域内的图片,具体的实现效果如下:
图片懒加载

由于上传图片有大小限制,可能拉滚动条有点快,不过效果还是可以看到的。
实现的关键点:

  • 判断图片是否在当前可是区域内

实现思路:

  • 所有的img标签的src属性都是空或没有src属性,初始化时显示当前区域的图片,判断的条件(假设图片节点是image, 容器节点elem):image.offsetTop < elem.clientHeight
  • elem容器节点绑定scroll事件,同时也要处理向上滚动带来的问题
  • 设置需要显示图片的可视区域,判断当前图片是否在可视区域从而是否需要显示,代码如下:
	  // record = [0], data是图片src的数据源elem.addEventListener('scroll', function() {let scrollTop = this.scrollTop, scrollHeight = this.scrollHeight, clientHeight = elem.clientHeight;// 处理向上滚动的重复性问题if (scrollTop > record[0]) {record.shift();record.push(scrollTop);}// 只有向下滚动才执行相关程序if (scrollTop >= record[0]) {for (let index = 0; index < images.length; index++) {let image = images[index], offsetTop = image.offsetTop, start = scrollTop, end = start + clientHeight;// 核心代码,图片显示的可视区域: scrollTop ~ scollTop + clientHeightif (offsetTop >= start && offsetTop <= end) {if (!image.src) {setTimeout(function() {image.src = data[index];}, 300);}}}}});

代码主要组织结构图如下:
demo组织结构图
下面说说layui中流加载模块的实现,该内置模块使用JQuery来实现,对于流加载以及图片懒加载实现思想,我上面的实现思路跟它的相似,核心代码还是有所区别,下面主要说说区别点:

  • layui内置流加载模块,考虑到容器元素是全局的情况处理, 作者考虑的很全面
  • 内置模块对外提供api支持用于自实现具体的容器元素
  • layui该内置模块实现在操作的过程中更加流畅自然

该内置模块代码组织结构图如下:
flow.js模块组织结构

该模块组织非常简洁明了,load是用于处理流加载,lazyimg是处理图片懒加载的。

layui框架内置模块flow.js的详细代码注释以及我自己实现的demo的源代码会上传到我的Github上,与君共进步。

致远行的你我

这篇关于layui源码详细分析系列之流加载模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/726217

相关文章

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx

python urllib模块使用操作方法

《pythonurllib模块使用操作方法》Python提供了多个库用于处理URL,常用的有urllib、requests和urlparse(Python3中为urllib.parse),下面是这些... 目录URL 处理库urllib 模块requests 库urlparse 和 urljoin编码和解码

SpringBoot加载profile全面解析

《SpringBoot加载profile全面解析》SpringBoot的Profile机制通过多配置文件和注解实现环境隔离,支持开发、测试、生产等不同环境的灵活配置切换,无需修改代码,关键点包括配置文... 目录题目详细答案什么是 Profile配置 Profile使用application-{profil

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

idea Maven Springboot多模块项目打包时90%的问题及解决方案

《ideaMavenSpringboot多模块项目打包时90%的问题及解决方案》:本文主要介绍ideaMavenSpringboot多模块项目打包时90%的问题及解决方案,具有很好的参考价值,... 目录1. 前言2. 问题3. 解决办法4. jar 包冲突总结1. 前言之所以写这篇文章是因为在使用Mav

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二