Skip to content

Repository files navigation

InView

A lightweight JavaScript library for detecting when elements enter or exit the viewport.

npm versionLicense: MIT

Installation

npm install @opuu/inview

Quick Start

importInViewfrom"@opuu/inview";constobserver=newInView(".my-element");observer.on("enter",(event)=>{console.log("Element visible:",event.percentage+"%");});observer.on("exit",(event)=>{console.log("Element hidden");});

Common Examples

Lazy Loading Images

importInViewfrom"@opuu/inview";constobserver=newInView(".lazy-image");observer.on("enter",(event)=>{constimg=event.target;img.src=img.dataset.src;img.classList.add("loaded");});

Scroll Animations

importInViewfrom"@opuu/inview";constobserver=newInView(".animate-on-scroll");observer.on("enter",(event)=>{event.target.classList.add("animate");});observer.on("exit",(event)=>{event.target.classList.remove("animate");});

Infinite Scrolling

importInViewfrom"@opuu/inview";constobserver=newInView(".load-more-trigger");observer.on("enter",(event)=>{loadMoreContent();});

API Reference

Configuration

You can pass options when creating an InView instance:

constobserver=newInView({selector: ".my-element",delay: 100,// Debounce delay in msprecision: "high",// "low", "medium", or "high"single: true,// Only observe first element});
OptionDefaultDescription
selectorrequiredCSS selector for elements to observe
delay0Debounce delay in milliseconds
precision"medium"Observation precision level
singlefalseOnly observe the first matching element

Methods

observer.on("enter",callback);// Element enters viewportobserver.on("exit",callback);// Element exits viewportobserver.pause();// Pause observationobserver.resume();// Resume observationobserver.setDelay(100);// Update debounce delayobserver.destroy();// Clean up

Event Object

Callbacks receive an event object with:

{percentage: 75,// Visibility percentage (0-100)target: Element,// The observed elementtime: 1234567890,// Timestampevent: "enter"|"exit"// Event type// ... other properties}

CDN Usage

<scripttype="module">importInViewfrom"https://cdn.jsdelivr.net/npm/@opuu/inview/dist/inview.js";</script>

License

MIT

Common Use Cases

Lazy Loading Images

importInViewfrom"@opuu/inview";constimageObserver=newInView(".lazy-image");imageObserver.on("enter",(event)=>{constimg=event.target;if(img.dataset.src){img.src=img.dataset.src;img.removeAttribute("data-src");img.classList.add("loaded");}});

Scroll-Triggered Animations

importInViewfrom"@opuu/inview";constanimationObserver=newInView({selector: ".animate-on-scroll",precision: "medium",});animationObserver.on("enter",(event)=>{if(event.percentage>50){// Trigger when 50% visibleevent.target.classList.add("animate-in");}});animationObserver.on("exit",(event)=>{event.target.classList.remove("animate-in");});

Infinite Scrolling

importInViewfrom"@opuu/inview";constinfiniteObserver=newInView({selector: ".load-more-trigger",single: true,delay: 200,// Debounce to prevent multiple rapid loads});infiniteObserver.on("enter",async(event)=>{try{constnewContent=awaitloadMoreContent();document.getElementById("content").appendChild(newContent);}catch(error){console.error("Failed to load content:",error);}});

Performance Monitoring

importInViewfrom"@opuu/inview";constperformanceObserver=newInView({selector: ".track-visibility",delay: 300,// Debounce analytics calls});performanceObserver.on("enter",(event)=>{// Track when important content becomes visibleanalytics.track("element_viewed",{element_id: event.target.id,visibility_percentage: event.percentage,timestamp: event.time,});});

Framework Integration

React

import{useEffect,useRef}from"react";importInViewfrom"@opuu/inview";functionLazyImage({ src, alt }){constimgRef=useRef(null);useEffect(()=>{constobserver=newInView({selector: imgRef.current,single: true,});observer.on("enter",(event)=>{event.target.src=src;event.target.classList.add("loaded");});return()=>observer.destroy();},[src]);return<imgref={imgRef}alt={alt}className="lazy-image"/>;}

Vue.js

For Vue.js applications, use the dedicated @opuu/inview-vue package which provides v-inview and v-outview directives.

npm install @opuu/inview-vue

Angular

import{Component,ElementRef,OnInit,OnDestroy}from"@angular/core";importInViewfrom"@opuu/inview";
@Component({selector: "app-lazy-content",template: '<div class="lazy-content">Content</div>',})exportclassLazyContentComponentimplementsOnInit,OnDestroy{privateobserver: InView;constructor(privateelementRef: ElementRef){}ngOnInit(){this.observer=newInView({selector: this.elementRef.nativeElement,single: true,});this.observer.on("enter",(event)=>{event.target.classList.add("visible");});}ngOnDestroy(){this.observer?.destroy();}}

Best Practices

Performance Optimization

  1. Use appropriate precision levels: Start with "medium" and only use "high" when necessary
  2. Clean up observers: Always call destroy() when components unmount
  3. Debounce rapid changes: Use the delay option for expensive operations
  4. Single element optimization: Use single: true when observing only one element

Memory Management

// Good: Clean up when doneconstobserver=newInView(".my-element");// ... use observerobserver.destroy();// Important!// Good: Store reference for cleanupclassMyComponent{constructor(){this.observer=newInView(".element");}destroy(){this.observer.destroy();}}

Browser Support

InView is built on the Intersection Observer API and supports all modern browsers:

  • Chrome 51+
  • Firefox 55+
  • Safari 12.1+
  • Edge 15+

For older browser support, consider using an Intersection Observer polyfill.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

License

MIT License - feel free to use this project in your commercial and personal projects.

Author

Obaydur Rahman

Related Projects

About

Check if an element is visible in the viewport using JavaScript/TypeScript.

Topics

Resources

Code of conduct

Stars

10 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages