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实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

spring-boot-starter-thymeleaf加载外部html文件方式

《spring-boot-starter-thymeleaf加载外部html文件方式》本文介绍了在SpringMVC中使用Thymeleaf模板引擎加载外部HTML文件的方法,以及在SpringBoo... 目录1.Thymeleaf介绍2.springboot使用thymeleaf2.1.引入spring

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明