useVisibility
Tracks whether an element is visible in the viewport.
Usage
import { useVisibility } from "@siberiacancode/reactuse";
const visibility = useVisibility<HTMLDivElement>();
// or
const visibility = useVisibility<HTMLDivElement>(ref, { threshold: 0.5 });Example
import { useVisibility } from "@siberiacancode/reactuse";
export const VisibilityBadge = () => {
const visibility = useVisibility<HTMLDivElement>();
return (
<div ref={visibility.ref}>
{visibility.inView ? "In view" : "Out of view"}
</div>
);
};enabled:
const visibility = useVisibility<HTMLDivElement>({ enabled: false });onChange:
const visibility = useVisibility<HTMLDivElement>({
onChange: (entry) => console.log(entry),
});root:
const visibility = useVisibility<HTMLDivElement>({ root: containerRef });rootMargin:
const visibility = useVisibility<HTMLDivElement>({ rootMargin: "10px" });threshold:
const visibility = useVisibility<HTMLDivElement>({ threshold: 0.5 });Notes
- Hook uses the IntersectionObserver API.
Type Declarations
import type { HookTarget } from "@siberiacancode/reactuse";
import type { StateRef } from "@siberiacancode/reactuse";
export type UseVisibilityCallback = (
entry: IntersectionObserverEntry,
observer: IntersectionObserver
) => void;
export interface UseVisibilityOptions
extends Omit<IntersectionObserverInit, "root"> {
enabled?: boolean;
onChange?: UseVisibilityCallback;
root?: HookTarget;
}
export interface UseVisibilityReturn {
entry?: IntersectionObserverEntry;
inView: boolean;
observer?: IntersectionObserver;
}
export interface UseVisibility {
<Target extends Element>(
options?: UseVisibilityOptions,
target?: never
): UseVisibilityReturn & { ref: StateRef<Target> };
(target: HookTarget, options?: UseVisibilityOptions): UseVisibilityReturn;
<Target extends Element>(
callback: UseVisibilityCallback,
target?: never
): UseVisibilityReturn & { ref: StateRef<Target> };
(target: HookTarget, callback: UseVisibilityCallback): UseVisibilityReturn;
}
export declare const useVisibility: UseVisibility;