viewprt 
A tiny, dependency-free, high performance viewport position & intersection observation tool. You can watch when elements enter & exit a viewport, or when a viewport itself reaches its bounds. Use this as a building block for lazy loaders, infinite scrolling, etc.
Install
npm i viewprt -S
Usage & API
import {
ElementObserver,
PositionObserver
ObserverCollection
} from 'viewprt'
const elementObserver = ElementObserver(document.getElementById('element'), {
onEnter(element, viewport) {},
onExit(element, viewport) {},
offset: 0,
once: false,
observerCollection: new ObserverCollection()
})
const positionObserver = PositionObserver({
onBottom(container, viewport) {},
onTop(container, viewport) {},
onLeft(container, viewport) {},
onRight(container, viewport) {},
onMaximized(container, viewport) {},
container: document.body,
offset: 0,
once: false,
observerCollection: new ObserverCollection()
})
The viewport
argument in callbacks is an object containing the current state of the viewport e.g.:
{
width: 1024,
height: 768,
positionX: 0,
positionY: 2000
directionY: "down",
directionX: "none"
}
positionObserver.destroy()
elementObserver.destroy()
positionObserver.activate()
elementObserver.activate()
Advanced: Using a custom observer collection
If you need to control scroll and resize events (e.g. for custom throttling/debouncing), you can create a new instance of ObserverCollection
.
const debouncedObserverCollection = new ObserverCollection({ handleScrollResize: h => debounce(h, 300) })
const elementObserver = ElementObserver(document.getElementById('element1'), {
observerCollection: debouncedObserverCollection
})
const elementObserver = ElementObserver(document.getElementById('element2'), {
observerCollection: debouncedObserverCollection
})
Browser support
Chrome, Firefox, Edge, IE 11+, Safari 8+
(requestAnimationFrame, MutationObserver, Map)