use-in-viewport
shadcn-hooks/use-in-viewportFreeHook
A hook to check if an element is in the viewport
Install it
npx shadcn@latest add https://shadcn-hooks.com/r/use-in-viewport.jsonSource
1import { useState } from 'react'2import { useEffectWithTarget } from '@/registry/hooks/use-effect-with-target'3import { getTargetElement } from '@/registry/lib/create-effect-with-target'4import type { BasicTarget } from '@/registry/lib/create-effect-with-target'56type CallbackType = (entry: IntersectionObserverEntry) => void78export interface UseInViewportOptions {9 rootMargin?: string10 threshold?: number | number[]11 root?: BasicTarget<Element>12 callback?: CallbackType13}1415export function useInViewport(16 target: BasicTarget | BasicTarget[],17 options?: UseInViewportOptions,18) {19 const { callback, ...option } = options || {}2021 const [state, setState] = useState<boolean>()22 const [ratio, setRatio] = useState<number>()2324 useEffectWithTarget(25 () => {26 const targets = Array.isArray(target) ? target : [target]27 const els = targets28 .map((element) => getTargetElement(element))29 .filter(Boolean)3031 if (!els.length) {32 return33 }3435 const observer = new IntersectionObserver(36 (entries) => {37 for (const entry of entries) {38 setRatio(entry.intersectionRatio)39 setState(entry.isIntersecting)40 callback?.(entry)41 }42 },43 {44 ...option,45 root: getTargetElement(options?.root),46 },47 )4849 els.forEach((el) => observer.observe(el!))5051 return () => {52 observer.disconnect()53 }54 },55 [options?.rootMargin, options?.threshold, callback],56 target,57 )5859 return [state, ratio] as const60}
What it pulls in
Other registry items
Files it writes
More from shadcn-hooks
All 58 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| use-active-elementuse-active-element | shadcn-hooks | Hooks | Free | no deps | |
| use-batteryuse-battery | shadcn-hooks | Hooks | Free | no deps | |
| use-booleanuse-boolean | shadcn-hooks | Hooks | Free | no deps | |
| use-click-any-whereuse-click-any-where | shadcn-hooks | Hooks | Free | no deps | |
| use-click-awayuse-click-away | shadcn-hooks | Hooks | Free | no deps | |
| use-clipboarduse-clipboard | shadcn-hooks | Hooks | Free | no deps | |
| use-controllable-valueuse-controllable-value | shadcn-hooks | Hooks | Free | 1 dep | |
| use-counteruse-counter | shadcn-hooks | Hooks | Free | no deps |
