useElementSize
hookas/use-element-sizeFreeHook
A hook to measure the size of an element
Install it
npx shadcn@latest add https://hookas.letstri.dev/r/use-element-size.jsonSource
1'use client'23import * as React from 'react'45export function useElementSize<T extends Element>(6 ref: React.RefObject<T | null>,7): { width: number | null, height: number | null }8export function useElementSize<T extends Element>(9 ref: React.RefObject<T | null>,10 initial: {11 width: number12 height: number13 },14): {15 width: number16 height: number17}18export function useElementSize<T extends Element = Element>(19 ref: React.RefObject<T | null>,20 initial?: {21 width: number22 height: number23 },24) {25 const [size, setSize] = React.useState({26 width: initial?.width ?? null,27 height: initial?.height ?? null,28 })2930 const previousObserver = React.useRef<ResizeObserver | null>(null)3132 React.useEffect(() => {33 const element = ref.current3435 if (previousObserver.current) {36 previousObserver.current.disconnect()37 previousObserver.current = null38 }3940 let observer: ResizeObserver | null = null4142 if (element?.nodeType === Node.ELEMENT_NODE) {43 observer = new ResizeObserver(([entry]) => {44 if (entry && entry.borderBoxSize) {45 const { inlineSize: width, blockSize: height }46 = entry.borderBoxSize[0]!4748 setSize(prev => width !== prev.width || height !== prev.height ? { width, height } : prev)49 }50 })5152 observer.observe(element, { box: 'border-box' })53 previousObserver.current = observer54 }5556 return () => {57 if (previousObserver.current) {58 previousObserver.current.disconnect()59 previousObserver.current = null60 }61 }62 }, [ref])6364 return size65}
Files it writes
More from hookas
All 30 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| useAsyncEffectuse-async-effect | hookas | Hooks | Free | no deps | |
| useClickOutsideuse-click-outside | hookas | Hooks | Free | no deps | |
| useDebounceCallbackuse-debounced-callback | hookas | Hooks | Free | no deps | |
| useDebounceMemouse-debounced-memo | hookas | Hooks | Free | no deps | |
| useDebounceStateuse-debounced-state | hookas | Hooks | Free | no deps | |
| useFullscreenuse-fullscreen | hookas | Hooks | Free | no deps | |
| useIntervaluse-interval | hookas | Hooks | Free | no deps | |
| useIsInViewportuse-is-in-viewport | hookas | Hooks | Free | no deps |
