ResizeObserver
尺寸监听工具组件,封装原生 ResizeObserver(经 @chenzy-design/core 归一化),渲染一个无视觉样式的包裹元素作为观测容器,slot 暴露 width/height/entry,onResize 分发归一化尺寸事件;内置 throttle/debounce 节流去抖与 multiple 多目标观测;SSR/老浏览器静默降级,fallbackToWindow 可降级为 window.resize 近似监听;onResizeStart/onResizeEnd 暴露连续变化的首帧与静默结束边界事件;另导出 resize action 供轻量 use:resize 用法、getGlobalResizeObserver 单例池供大列表共享。盒模型支持 content-box/border-box/device-pixel-content-box,包裹元素标签可经 tag 自定义。
如何引入
import { ResizeObserver } from '@chenzy-design/svelte';基础尺寸观察
通过 slot 实时获取容器宽高,拖拽可调整
拖拽右下角调整容器大小,实时显示尺寸
0 × 0 px
调整中 / 调整完成
onResizeStart / onResizeEnd 边界事件:拖拽时显示“调整中”,静默后提交结果
拖拽调整时显示“调整中”,松手静默后提交“调整完成”
空闲
0 × 0 px
响应式切换布局
按容器宽度断点在纵向堆叠与横向并排之间切换
容器宽度 < 360px 时纵向堆叠,否则横向并排 0 px
紧凑(纵向)
侧栏
主内容区
多目标观测
multiple 模式同时监听多个子元素,onResize 按 target 路由各自尺寸
multiple 模式:分别监听三个可独立调整大小的子卡片
A: — pxB: — pxC: — px
卡片 A
卡片 B
卡片 C
API 参考
ResizeObserver
Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
box | 观测盒模型:content-box 仅内容区,border-box 含 padding+border,device-pixel-content-box 物理像素内容盒(含 DPR;不支持时回退 content-box) | 'content-box'|'border-box'|'device-pixel-content-box' | 'content-box' |
disabled | 暂停尺寸分发,observer 仍监听但不向 slot/回调通知 | boolean | false |
throttle | 节流间隔(ms),leading+trailing,0 即原生即时。与 debounce 互斥(同时 >0 时 debounce 优先) | number | 0 |
debounce | 防抖等待(ms),trailing-only,0 关闭。与 throttle 互斥(优先于 throttle) | number | 0 |
multiple | 多目标:观测包裹元素的所有直接子元素,onResize 逐个抛出,用 entry.target 区分 | boolean | false |
observeOnMount | 挂载后立即测量一次(ResizeObserver 原生在 observe 时即触发首次回调,天然满足) | boolean | true |
tag | 包裹元素标签,经 svelte:element 渲染;须为可生成盒子的元素(勿用 display:contents 类标签) | string | 'div' |
fallbackToWindow | 原生 ResizeObserver 不可用(SSR/老环境)或显式开启时,降级监听 window.resize 并用 getBoundingClientRect 近似重测(精度较低) | boolean | false |
observeParent | 观测包裹元素的父节点(parentElement)而非自身(对标 Semi observeParent)。与 multiple 互斥,同时为 true 时 multiple 优先;父节点缺失时静默不观测 | boolean | false |
Events
| 事件 | 载荷 | 说明 |
|---|---|---|
onResize | — | 尺寸变化时分发归一化 entry(受控,不回写) |
onFirstMeasure | — | 首次测量完成时分发归一化 entry |
onResizeStart | — | 一段连续尺寸变化的首帧触发("调整中"态) |
onResizeEnd | — | 连续变化静默结束后触发,payload 为最后一帧("调整完成") |
Slots
| 名称 | 说明 |
|---|---|
children | 作用域参数 { width, height, entry },entry 首次测量前为 null |
Accessibility
- 包裹元素不设 role/aria,透明容器不进 a11y 树、不可聚焦、不移动焦点。