@opuu/inview
Version:
Lightweight JavaScript library for viewport detection with debounced callbacks - intersection observer, lazy loading, scroll animations, infinite scroll, element visibility tracking with TypeScript support. Zero dependencies, ~1KB gzipped.
211 lines (210 loc) • 5.43 kB
TypeScript
/**
* The configuration object for the InView class
*
* @typedef {Object} InViewConfig
*
* @property {string} selector - CSS selector
* @property {number} delay - Debounce delay in ms (default: 0)
* @property {"low" | "medium" | "high"} precision - Precision of the observer (default: medium)
* @property {boolean} single - Only observe the first element (default: false)
*
* @example
* const config: InViewConfig = {
* selector: ".class",
* delay: 0,
* precision: "medium",
* single: true
* }
*/
interface InViewConfig {
selector: string;
delay?: number;
precision?: "low" | "medium" | "high";
single?: boolean;
}
/**
* The event object for the InView class
*
* @typedef {Object} InViewEvent
*
* @property {number} percentage - Percentage of the element in the viewport
* @property {DOMRectReadOnly} rootBounds - The bounds of the viewport
* @property {DOMRectReadOnly} boundingClientRect - The bounds of the element
* @property {DOMRectReadOnly} intersectionRect - The bounds of the intersection
* @property {Element} target - The observed element
* @property {number} time - The time of the event
* @property {"enter" | "exit"} event - The event type
*
* @example
* new InView(".selector").on("enter", (e: InViewEvent) => {
* console.log(e);
* });
*/
interface InViewEvent {
percentage: number;
rootBounds: DOMRectReadOnly | null;
boundingClientRect: DOMRectReadOnly;
intersectionRect: DOMRectReadOnly;
target: Element;
time: number;
event: "enter" | "exit";
}
/**
* InView
*
* Check if element is visible in viewport
*
* @example
* new InView(".selector").on("enter", (e) => {
* console.log(e.percentage);
* });
*
* @example
* new InView({
* selector: ".selector",
* delay: 1000,
* precision: "low",
* single: true
* }).on("enter", (e) => {
* console.log(e.percentage);
* }).on("exit", (e) => {
* console.log("exit");
* });
*/
declare class InView {
/**
* List of elements to observe or single element
*/
private items;
/**
* Is the observer is paused
*/
private paused;
/**
* Debounce delay for the callback
*/
private delay;
/**
* Threshold
*/
private threshold;
/**
* Single element observer
*/
private single;
/**
* Array to store all observers for cleanup
*/
private observers;
/**
* WeakMap to store debounce timers for each element
*/
private debounceTimers;
/**
* Constructor
*
* Create a new InView instance
*
* @param {InViewConfig | string} config - Configuration object or CSS selector
*
* @example
* new InView(".selector");
*
* @example
* new InView({
* selector: ".selector",
* delay: 1000,
* precision: "low",
* single: true
* });
*/
constructor(config: InViewConfig | string);
/**
* Debounce function to delay callback execution
*
* @param {Element} element - The element triggering the event
* @param {CallableFunction} callback - The callback to execute
* @param {InViewEvent} event - The event object to pass to callback
*/
private debounceCallback;
/**
* Pause the observer
*
* @returns {InView} - Returns the InView instance
*
* @example
* const inview = new InView(".selector");
* inview.on("enter", (e) => {});
* // pause on specific needs
* inview.pause();
*/
pause(): InView;
/**
* Resume the observer
*
* @returns {InView} - Returns the InView instance
*
* @example
* const inview = new InView(".selector");
* inview.on("enter", (e) => {});
* // pause the observer
* inview.pause();
* // resume the observer again
* inview.resume();
*/
resume(): InView;
/**
* Set the debounce delay
*
* @param {number} delay - Debounce delay in ms
*
* @returns {InView} - Returns the InView instance
*
* @example
* const inview = new InView(".selector");
* inview.on("enter", (e) => {});
* // set debounce delay to 1000ms
* inview.setDelay(1000);
*/
setDelay(delay: number): InView;
/**
* Destroy the observer and clean up all resources
*
* @returns {InView} - Returns the InView instance
*
* @example
* const inview = new InView(".selector");
* inview.on("enter", (e) => {});
* // Clean up when done
* inview.destroy();
*/
destroy(): InView;
/**
* Listen for enter or exit events
*
* @param {"enter" | "exit"} event - Event type
* @param {CallableFunction} callback - Callback function
*
* @returns {InView} - Returns the InView instance
*
* @example
* const inview = new InView({...});
* inview.on("enter", (e: InViewEvent) => {
* console.log(e.percentage);
* });
*
* inview.on("exit", (e: InViewEvent) => {
* console.log("exit");
* });
*
* @example
* new InView(".selector").on("enter", (e: InViewEvent) => {
* console.log(e.percentage);
* }).on("exit", (e: InViewEvent) => {
* console.log("exit");
* });
*/
on(event: "enter" | "exit", callback: CallableFunction): InView;
}
export default InView;
export type { InViewConfig, InViewEvent };