useElementBounding
追踪 HTML 元素边界框的 React Hook
useElementBounding 使用 getBoundingClientRect() 响应式地跟踪 DOM 元素的边界矩形。它返回一个包含 x、y、top、bottom、left、right、width、height 和手动重新测量的 update() 函数的对象。默认情况下,它在窗口滚动和调整大小时自动重新计算。
使用场景
- 相对于目标元素定位工具提示、弹出框或浮动元素
- 实现 UI 元素之间的碰撞检测或重叠检查
- 跟踪元素位置用于滚动关联动画或视差效果
注意事项
- 响应式:默认在窗口
resize和scroll事件上自动更新。两种行为都可以通过windowResize和windowScroll选项禁用。 - SSR 安全:在服务端渲染期间返回零值。设置
immediate: false延迟首次测量直到你显式调用update()。 - 参见
useElementSize和useMeasure了解通过 ResizeObserver 仅跟踪宽高,以及useWindowSize了解视口尺寸。
Usage
Live Editor
function Demo() { const ref = useRef<HTMLTextAreaElement>(null); const rect = useElementBounding(ref); return ( <div> <p>调整框的大小以查看变化</p> <textarea ref={ref} readOnly value={JSON.stringify(rect, null, 2)} /> </div> ); };
Result
API
useElementBounding
Returns
UseElementBoundingReturn
Arguments
| 参数名 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| target | 目标元素 | BasicTarget<Element> (必填) | - |
| options | 可选参数 | UseElementBoundingOptions | undefined | - |
UseElementBoundingOptions
| 参数名 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| reset | 将数值重置为0 | boolean | true |
| windowResize | 是否监听 resize 事件 | boolean | true |
| windowScroll | 是否监听 scroll 事件 | boolean | true |
| immediate | 立即更新 | boolean | - |
UseElementBoundingReturn
| 参数名 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| height | 元素的高度 | number (必填) | - |
| bottom | 元素的底部位置 | number (必填) | - |
| left | 元素的左侧位置 | number (必填) | - |
| right | 元素的右侧位置 | number (必填) | - |
| top | 元素的顶部位置 | number (必填) | - |
| width | 元素的宽度 | number (必填) | - |
| x | 元素的 X 位置 | number (必填) | - |
| y | 元素的 Y 位置 | number (必填) | - |
| update | 手动更新 | () => void (必填) | - |
BasicTarget
export type BasicTarget<T extends TargetType = Element> = (() => TargetValue<T>) | TargetValue<T> | MutableRefObject<TargetValue<T>>;
TargetValue
type TargetValue<T> = T | undefined | null;
TargetType
type TargetType = HTMLElement | Element | Window | Document | EventTarget;