如何实现对节点尺寸动态变化的有效监测与检测

2024-04-01 00:12

本文主要是介绍如何实现对节点尺寸动态变化的有效监测与检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

近来有需求要做分页,听起来可能有点Low。 所以我要把Low的事情做得有点逼格。
分页本身没啥,但是数据量起来了,比如十万。 要是不做点处理, 那你的页面估计爽得很,机器也爽得很。 放心,我不会让你这么爽。

大量数据展现方案

比较流行的当然是虚拟滚动(无限滚动)。

  1. 始终展示的是有限的固定节点。
  2. 外层创建滚动层。

一句话,就是反复利用固定节点展现数据。

其中还有两个点

何时需要加载新的分页数据

  1. scrollTop , clientHeight, scrollHeight
  2. IntersectionObserver (chrome 55+)

如何知道容器宽高变化
本文就围绕着这个展开

因为使用的是react框架,使用了 react-window, react-window就是用来展现海量数据的react列表组件。
因为项目需要,还要不通尺寸一行展现不同数量的数据。 肯定有人就说,监听window.resize。


没错,监听resize一定程度,但是window.resize, 并不能让我知道容器本身的尺寸,当 然可以通过getComputedStyle获取。 要是window没有resize的情况呢。
我就想实时的知道尺寸的变化。

尺寸变化监测方案

监测元素resize这里有几种方案的测试和源码。

Cross-Browser, Event-based, Element Resize Detection

思路:

如果IE,直接注册onresize(这个点赞啊)

否则: 创建 type为text/html的object

设置position为absolute, 高度100%, 宽度100% (这样可以获得父容器的宽高)

设置pointer-events:none,利用点击穿透(让object窗体变成幽灵)

object元素的高度变化后,通知订阅者

resize事件节流

问题:

  1. 创建object
  2. 事件处理函数挂载了元素本身上

javascript-detect-element-resize

创建三个子元素,利用scroll事件来监测变化。

原理:

https://zhuanlan.zhihu.com/p/24887312
The scroll event is fired when the document view or an element has been scrolled.
当文档视图或者元素滚动的时候会触发 scroll 事件。
也就是说元素滚动的时候会触发这个事件,那么什么时候元素会滚动?当元素大于其父级元素,且父级元素允许其滚动的时候,该元素可以进行滚动。
换句话说,元素可以滚动意味着父子元素大小不一致,这是这个方法的核心。
那么我们需要让元素大小发生改变时,使得 scrollLeft 或者 scrollTop 发生改变,从而触发 scroll 事件,进一步得知其大小发生了改变。

visibility: hidden; opacity: 0; position: absolute;让自己变得虚无

addEventListener(“scroll”, scrollListener, true) 在捕捉阶段拦截事件,使用false无效

div.expand-trigger 变大

div.expand-trigger 变小

animationstart来监听显示,比如style.display = 'none’然后style.display = ‘block’

问题:

  1. 额外创建四个元素节点以及一个style节点
  2. 事件都挂载了元素本身身上,

ResizeObserver

原生自带的方案, 兼容性并不高, resize-observer-polyfill 基于resize和MutationOberver的polyfill实现了ResizeObserver。

 const resizeObserver = new ResizeObserver(entries => {for (let entry of entries) {console.log(entry.target.id, `height:${entry.contentRect.height}  width:${entry.contentRect.width}`);}});resizeObserver.observe(document.querySelector('#my_element'));resizeObserver.observe(document.querySelector('#my_element2'));

此外

当然,我觉得还

  1. 定时器 + getComputedStyle 也是很低成本的实现。
  2. resize + MutationOberver 也是很简单的方案。

写在最后

不忘初衷,有所得,而不为所累,如果你觉得不错,你的一赞一评就是我前行的最大动力。

这篇关于如何实现对节点尺寸动态变化的有效监测与检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、