wot-design-uni 的 wd-resize 组件:监听元素尺寸变化与事件机制详解
前端UI组件移动开发小程序【免费下载链接】wot-design-uni一个基于Vue3TS开发的uni-app组件库提供70高质量组件支持暗黑模式、国际化和自定义主题。项目地址https://gitcode.com/gh_mirrors/wo/wot-design-uni点击查看免费下载wd-resize是 wot-design-uni 组件库中专门用于监听元素尺寸变化的容器组件当组件包裹的文档流尺寸发生变化时它会触发resize事件并携带元素最新的宽高与位置信息。本文以官方文档 resize.md 为核心结合仓库内组件源码、样式文件与单元测试系统讲解wd-resize的用法、参数、事件、底层实现原理及其在wd-sticky、wd-sticky-box中的真实应用场景。组件定位与适用场景在 uni-app 小程序与 H5 环境中DOM 的尺寸变化并不总能被可靠的resize事件感知。当页面内容因为异步数据返回、图片加载、插值渲染等原因更新后元素的宽高和位置往往随之改变此时如果需要重新计算布局例如重算吸顶位置、重新定位浮层、重排表格列宽就必须主动重新获取元素的尺寸与位置。wd-resize正是为了解决这一痛点而设计它作为包裹容器持续监听被包裹内容default插槽的文档流尺寸变化一旦发生变化便触发resize事件并将width、height、top、right、bottom、left六个维度的最新值一次性回传给业务代码方便开发者重新执行内容展示相关的计算操作。从源码结构看该组件实现非常轻量完整代码位于 wd-resize.vue类型声明在 types.ts样式在 index.scss并在 global.d.ts 中注册为全局组件WdResize。基本用法使用wd-resize非常简单将需要监听尺寸变化的内容放入默认插槽并监听resize事件即可。注意不要给此组件增加任何外部样式以免破坏其内部的文档流测量机制具体原因见下文底层实现原理一节。以下示例演示了当插槽内视图的宽高从默认状态变为100px × 100px时组件自动感知并触发回调的完整流程wd-resize resizehandleResize view :stylebackground: #4d80f0; width: ${width};height: ${height}/view /wd-resizeconst width refstring() const height refstring() onReady(() { setTimeout(() { width.value 100px height.value 100px }, 1500) }) function handleResize(detail: Recordstring, string | number) { const { height, width, top, right, bottom, left } detail console.log(height, width, top, right, bottom, left) }示例的运行逻辑为页面onReady后 1.5 秒将width与height置为100px插槽内容尺寸发生改变wd-resize检测到变化并触发handleResize此时可在控制台看到元素最新的宽高与四边位置信息。这一用例在仓库中也有完整的可运行演示页面位于 src/subPages/resize/Index.vue页面实时展示上一次与当前两次回调中的width、height、top、right、bottom、left对比值可直接运行 uni-app 项目查看效果。更完整的实战模板将事件回调的参数保存到响应式变量中即可驱动后续布局计算script langts setup import { ref } from vue import { onReady } from dcloudio/uni-app const contentWidth refstring() const contentHeight refstring() const size ref({ width: 0, height: 0, top: 0, right: 0, bottom: 0, left: 0 }) onReady(() { // 模拟异步内容加载导致尺寸变化 setTimeout(() { contentWidth.value 200px contentHeight.value 120px }, 500) }) function handleResize(detail: Recordstring, string | number) { size.value { width: Number(detail.width), height: Number(detail.height), top: Number(detail.top), right: Number(detail.right), bottom: Number(detail.bottom), left: Number(detail.left) } // 在这里重新执行位置/布局计算 } /scriptAttributes 参数说明wd-resize的参数非常精简官方文档定义了三个属性参数说明类型可选值默认值最低版本custom-style自定义根节点样式string---custom-class自定义根节点样式类string---custom-container-class自定义容器样式类string---对照源码 types.ts 可以发现其具体定义方式import { baseProps, makeStringProp } from ../common/props export const resizeProps { ...baseProps, customContainerClass: makeStringProp() }三个属性的来源与含义如下custom-style / custom-class由公共的 baseProps 提供通过makeStringProp()声明为默认值为空字符串的String类型 prop。分别用于向组件根节点.wd-resize追加内联样式与样式类。在 wd-resize.vue 中根节点被渲染为view :classwd-resize ${customClass} :stylerootStyle其中rootStyle由计算属性拼接组件内部的宽高值再合并customStyle得到const rootStyle computed(() { const style: Recordstring, string | number { width: addUnit(width.value), height: addUnit(height.value) } return ${objToStyle(style)}${props.customStyle} })也就是说组件会自动将测量到的宽高写入根节点保证父容器不会因插槽尺寸变化而坍塌custom-style在此基础上继续追加业务自定义样式。custom-container-class为内部测量容器.wd-resize__container追加样式类由makeStringProp()声明。该容器在模板中渲染为view :idresizeId :classwd-resize__container ${customContainerClass}它是真正承载插槽内容与两个监听scroll-view的结构。Events 事件说明事件名称说明参数最低版本resize尺寸发生变化时触发{width: number, height: number, top: number, right: number, bottom: number, left: number}-resize事件在两种情况下触发首次检测到尺寸变化时组件挂载后的第一次滚动事件回调之后每次宽高真正发生变化时通过新旧值对比确认。从源码 wd-resize.vue 可以看到事件载荷通过uni.createSelectorQuery().in(proxy).select(...).boundingClientRect()获取字段按固定顺序提取;[bottom, top, left, right, height, width].forEach((propName) { result[propName] res[propName] }) emit(resize, result)因此回调中拿到的width、height为元素实际渲染尺寸单位 pxtop、right、bottom、left为元素相对视口viewport的四边位置坐标可用于计算元素占位区域或判断是否进入可视范围。一个值得注意的实现细节是当宽高同时变化时只触发一次resize事件。源码中通过emitStack数组对newHeight ! lastHeight与newWidth ! lastWidth分别判断只要任一维度发生变化即合并为一次事件发出避免业务回调被重复触发const emitStack: number[] [] if (newHeight ! lastHeight) { lastHeight newHeight emitStack.push(1) } if (newWidth ! lastWidth) { lastWidth newWidth emitStack.push(1) } if (emitStack.length ! 0) { // 组装结果并 emit(resize, result) }Slots 插槽插槽名称说明最低版本default需要监听尺寸变化的内容-default插槽是组件唯一提供的插槽用于放置需要被监听尺寸变化的内容。组件模板将其直接放入测量容器中wd-resize.vueview :idresizeId :classwd-resize__container ${customContainerClass} !--被监听的插槽-- slot / !--监听插槽变大-- scroll-view ... / !--监听插槽变小-- scroll-view ... / /view插槽内容与两个监听用scroll-view同处于容器内便于统一测量尺寸。底层实现原理基于双 scroll-view 的尺寸监听在小程序环境中并没有 Web 端的ResizeObserverAPIwd-resize采用了经典的滚动条触发方案来跨端实现尺寸监听。其核心思路在源码注释与模板结构中有清晰体现wd-resize.vue第一步让插槽脱离父容器文档流。内部容器.wd-resize__container在 index.scss 中被设置为position: absolute目的如源码注释所述插槽需要脱离父容器文档流防止父容器固宽固高进而导致插槽大小被父容器限制。这样插槽的尺寸由其自身内容决定变化时才能被准确感知。第二步埋入两个隐藏的 scroll-view 作为探针。监听插槽变大第一个scroll-view内放置一个height: 100000px; width: 100000px的占位元素并将其scroll-top/scroll-left设置到接近底部的超大值。当插槽变大、容器随之变高变宽时滚动条的可滚动距离变大滚动位置被迫回弹从而触发scroll事件。监听插槽变小第二个scroll-view内放置一个height: 250%; width: 250%的占位元素。当插槽缩小时可滚动距离变小同样会触发滚动事件。两个探针统一绑定scrollonScrollHandler通过滚动事件间接感知容器尺寸的任何变化。同时index.scss 将.wd-resize__wrapper设置为position: absolute; top/bottom/left/right: 0; z-index: -9999; overflow: hidden; visibility: hidden让探针完全不可见、不干扰页面布局。第三步滚动回调中重新测量并防抖。onScrollHandler内重新执行boundingClientRect查询并通过scrollEventCount计数器做了两层过滤wd-resize.vueonScrollHandler () { const query uni.createSelectorQuery().in(proxy).select(#${resizeId.value}).boundingClientRect() query.exec(([res]) { // 前两次滚动事件被触发说明 created 的修改已渲染通知用户代码当前容器大小 if (scrollEventCount.value 0) { const result: Recordstring, string | number {} ;[bottom, top, left, right, height, width].forEach((propName) { result[propName] res[propName] }) emit(resize, result) } // 滚动条拉到底部会触发两次多余的事件屏蔽掉。 if (scrollEventCount.value 3) return // ... }) }首次滚动事件用于在渲染完成后立即上报一次初始尺寸随后两次由滚动条拉到底部产生的冗余事件被屏蔽从第三次起才进行真正的尺寸对比与事件分发。每次回调结束后通过scrollToBottom将滚动位置重新拉回底部为下一次变化做准备function scrollToBottom({ lastWidth, lastHeight }: { lastWidth: number; lastHeight: number }) { expandScrollTop.value 100000 lastHeight shrinkScrollTop.value 3 * height.value lastHeight expandScrollLeft.value 100000 lastWidth shrinkScrollLeft.value 3 * width.value lastWidth }第四步父容器防坍塌。测量到新尺寸后组件立即将width/height写入根节点的内联样式即rootStyle计算属性保证外层父容器始终跟随内容尺寸避免因插槽尺寸变化导致布局跳动或父容器高度塌陷。此外组件的容器id通过uuid()动态生成resize${uuid()}uuid实现见 util.ts确保同一页面内多个wd-resize实例互不冲突选择器查询使用.in(proxy)限定在当前组件实例作用域内避免跨组件误选。组件内部复用wd-sticky 与 wd-sticky-boxwd-resize并非孤立组件它被 wot-design-uni 内部多个需要实时感知尺寸的组件复用这从侧面印证了其设计价值wd-sticky.vue 中吸顶容器通过wd-resize resizehandleResize custom-styledisplay: inline-block;包裹插槽利用 resize 回调中返回的top、height等值实时计算吸顶偏移量wd-sticky-box.vue 同样用wd-resize包裹默认插槽在handleResize中记录内容尺寸以撑开占位区域。由此可见凡是内容尺寸不确定、又需要据此做布局计算的场景吸顶、吸底、定位浮层、动态列表撑位等都可以借鉴这种外层包一个wd-resize的用法。单元测试验证仓库为wd-resize提供了完整的单元测试 tests/components/wd-resize.test.ts覆盖以下行为基本渲染挂载后根节点包含wd-resize类名自定义类名传入custom-class后根节点追加对应类名自定义样式传入custom-style后根节点内联样式包含传入内容自定义容器类名传入custom-container-class后.wd-resize__container容器追加对应类名默认插槽插槽内容被正确渲染resize 事件模拟调用onScrollHandler后组件成功emit(resize)。这些测试用例与 types.ts、wd-resize.vue 的实现一一对应可作为理解组件行为契约的补充资料。最佳实践小结不要给wd-resize增加外部样式组件依赖绝对定位的内部容器与隐藏滚动探针完成测量外部样式可能破坏其文档流模型导致监听失效尺寸变化驱动计算将resize回调返回的六元组数据宽高 四边位置保存为响应式状态再驱动吸顶、定位、撑位等布局计算避免在业务层轮询测量宽高同时变化只触发一次回调天然具备合并去重能力无需在业务层做额外的防抖合并可安全复用组件支持同页面多实例动态id 实例作用域查询且被wd-sticky、wd-sticky-box等官方组件内部使用可直接用于自定义布局组件开发。赞分享前端UI组件移动开发小程序【免费下载链接】wot-design-uni一个基于Vue3TS开发的uni-app组件库提供70高质量组件支持暗黑模式、国际化和自定义主题。项目地址https://gitcode.com/gh_mirrors/wo/wot-design-uni点击查看免费下载相关推荐如何利用Super Productivity的Resize Observer实现响应式任务管理界面如何利用Super Productivity的Resize Observer实现响应式任务管理界面 Super Productivity是一款集成了时间盒管理和前端桌面应用移动开发You-Dont-Need-jQuery中的Resize Observer元素尺寸变化监听You Dont Need jQuery中的Resize Observer元素尺寸变化监听 你是否还在为网页元素尺寸变化监听而烦恼是否觉得使用jQuery实教程前端高性能元素尺寸监听器 —— element-resize-detector高性能元素尺寸监听器 —— element resize detector 当涉及到网页元素的实时尺寸变化监测时 element resize detecto上一篇Feathers 与 Koa 集成指南从 feathersjs/koa 的演进看 KoaJS 传输适配器的设计下一篇如何使用ProGuard压缩、优化和混淆Java应用从入门到精通创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

TorchAir inductor-npu-ext 静态 Shape 融合算子 TopN 调优与 PGO 选优完整指南

TorchAir inductor-npu-ext 静态 Shape 融合算子 TopN 调优与 PGO 选优完整指南

人工智能模型编译Ascend 【免费下载链接】torchair TorchAir 支持用户基于PyTorch框架和torch_npu插件在昇腾NPU上使用图模式进行推理。 项目地址: https://gitcode.com/Ascend/torchair 点击查看 免费下载 导读 本文介绍 TorchAir 仓库中 experimental/_inductor…

2026/10/14 2:16:21 阅读更多 →
OpenCV+Python车牌识别实操:HSV定位+双CNN字符识别

OpenCV+Python车牌识别实操:HSV定位+双CNN字符识别

简介:本资源是一份面向计算机专业本科生及深度学习初学者的车牌识别系统课程设计详解PPT,聚焦智能交通场景下的实际工程实现。内容完整覆盖基于Python与OpenCV开发的双阶段CNN车牌识别系统:第一阶段通过图像预处理、HSV色彩分割、Sobel边缘检…

2026/10/14 2:16:21 阅读更多 →
ModelEngine agent RAG 插件机制全解析:plugins.json 配置、MCP 插件开发与预置插件覆写指南

ModelEngine agent RAG 插件机制全解析:plugins.json 配置、MCP 插件开发与预置插件覆写指南

人工智能大模型RAGAI 应用医疗健康数据分析 【免费下载链接】agent 该项目已停止维护,请参考https://gitcode.com/ModelEngine/nexent项目。 致力于汇聚利用 ModelEngine 能力的创新应用,开发和推广高质量的应用程序,旨在创建一个强大的多智能…

2026/10/14 2:16:21 阅读更多 →

最新新闻

Python爬虫实战:手机APP数据抓取与解析全流程

Python爬虫实战:手机APP数据抓取与解析全流程

简介:这份PDF资料面向具备Python基础、对网络请求与爬虫开发感兴趣的技术爱好者与研发工程师,围绕手机APP数据传输的抓取与解析展开,重点讲解如何借助Fiddler抓包定位登录与话题接口,再通过urllib2构造HTTP请求、携带Header与表单…

2026/10/14 3:04:31 阅读更多 →
C++ 对接 S3 对象存储实战:SDK 选型、分片上传与避坑指南

C++ 对接 S3 对象存储实战:SDK 选型、分片上传与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 3:04:31 阅读更多 →
SQLite安装全指南:嵌入式数据库跨平台配置与常见坑

SQLite安装全指南:嵌入式数据库跨平台配置与常见坑

第一次折腾SQLite的时候,我找了一圈“Setup.exe”,愣是没找到。下载页面全是压缩包,网上一堆教程各写各的,有人说不用装,有人说得编译源码,看得人发懵。后来我才搞明白:SQLite的“安装”逻辑跟M…

2026/10/14 3:04:31 阅读更多 →
C++手写数据结构实战:动态数组、哈希表、AVL树与图算法

C++手写数据结构实战:动态数组、哈希表、AVL树与图算法

简介:《Implementing Useful Algorithms in C》由Dmytro Kedyk撰写,面向具备一定C基础、希望深入掌握算法设计与工程实现的开发者与计算机专业学生。全书从算法正确性证明、渐进记法与机器模型等基本原则切入,系统讲解数据类型选择、内存管理…

2026/10/14 3:04:31 阅读更多 →
本地27B模型配Function Calling:工具不触发的原因与实战

本地27B模型配Function Calling:工具不触发的原因与实战

给本地跑的27B模型配了三个专业工具之后,我做的第一件事就是拿它试聊天。你猜怎么着——工具列表明明挂在接口定义里,模型却像一个看见工具箱、却只肯用手拧瓶盖的人,简单问题全凭语言能力直接答,一个工具都不碰。我一度觉得这套配…

2026/10/14 3:04:31 阅读更多 →
容器内nvidia-smi报Unknown Error的排查与根治

容器内nvidia-smi报Unknown Error的排查与根治

凌晨两点半,工作群里弹出一条消息:某个长期跑的容器,前一秒还好好的,后一秒容器里的nvidia-smi直接报Failed to initialize NVML: Unknown Error。宿主机上执行nvidia-smi一切正常,新建一个临时容器也能正常看到卡&…

2026/10/14 3:03:31 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →