useInView
▸ useInView(observerOptions?
, once?
, setInViewIfScrolledPast?
): InViewReturn
Detects whether a DOM element is in the viewport, using the IntersectionObserver
API.
useInView([observerOptions], [once], [setInViewIfScrolledPast])
Usage
Toggling a className on and off, based on whether a <section>
is in view:
import { useInView } from "@wethegit/react-hooks"
const IN_VIEW_CLASSNAME = "in-view"
const MyComponent = () => {
const [setSectionRef, sectionInView, sectionElement] = useInView()
return (
<>
<section ref={setSectionRef} className={sectionInView ? "in-view" : ""}>
<p>Sit quis ut id sit anim. Enim qui est ut tempor sunt.</p>
</section>
</>
)
}
You can use a custom observerOptions "threshold" to tell the IntersectionObserver callback to fire when the element is 30% visible, in either direction:
const [setSectionRef, sectionInView, sectionElement] = useInView(0.3)
You can also pass a custom observerOptions
object. In this example, we're telling the callback to fire when the element is 50% visible ("on enter"), but also to wait until the element is scrolled out of the top of the viewport by at least 30% of the viewport's height before firing it "on exit":
const [setSectionRef, sectionInView, sectionElement] = useInView({
threshold: 0.5,
rootMargin: "30% 0px 0px 0px"
})
Parameters
Arguments | Type | Description |
---|---|---|
observerOptions | Number, IntersectionObserverInit | Default: 0 . Number between 0 and 1, or an IntersectionObserver options object. |
once | Boolean | Default: false . Whether to detach the observer from the DOM element after the first intersection callback is invoked. |
setInViewIfScrolledPast | Boolean | Default: false . Whether to consider the element already "in-view", if it is already scrolled beyond the bounds of the viewport when the target element is mounted. |
Return
useInView
returns an Array containing the following values:
Return value | Type | Description |
---|---|---|
setTargetRef | Function | Pass this function to the ref prop of the DOM element you want to track visibility of. |
isIntersecting | Boolean | Whether the target DOM element is in view, based on the provided observerOptions argument. |
targetRef | React Ref | The DOM node itself, once set by the setTargetRef function. |