Utils (@pim.sk/utils)

inViewport

Detect when elements enter the browser viewport via scroll. inViewport provides raw detection with callbacks.
import inViewport from '@pim.sk/utils/inViewport.mjs'

inViewport

inViewport({ selector, onViewport })

Fires onViewport() when a matched element enters the browser viewport. Listens to window scroll via requestAnimationFrame.

options = {
    selector:   ".my-el",    // CSS selector
    onViewport: (el) => {},  // callback — receives DOM element
    once:       true,        // default — fire only the first time
    full:       false,       // default — partial visibility is enough
}
item-1item-2item-3
new inViewport({
    selector: ".ivp-basic-item",
    once: true,
    onViewport: el => {
        console.log(el.textContent.trim() + " is in viewport")
        setTimeout(() => {
            output.textContent += el.textContent.trim() + " is in viewport\n"
        }, 1000);
    }
})

option: once

once: true (default) — onViewport fires only the first time the element enters the viewport. once: false — fires every time it re-enters.

once = true   // default — fires once per element
once = false  // fires every time element enters viewport
Scroll away and back to test
let count = 0
new inViewport({
    selector: ".ivp-once-target",
    once: false,
    onViewport: el => {
        output.textContent = `entered viewport ${++count}×`
    }
})

option: full

full: false (default) — triggers as soon as the top-left corner of the element enters the viewport. full: true — requires the entire element to be visible.

full = false  // default — partial visibility triggers (top-left corner in view)
full = true   // entire element must be visible
Target element
const vp = new inViewport({ selector: ".target", full: true })

// manual check
const visible = vp.isView()

isView() — manual test

Returns true/false on demand. Check if a specific element is currently in the viewport without a scroll callback.

// isView( opt ) — opt can be:
//   undefined    → first element (index 0)
//   number       → element by index
//   string       → CSS selector
//   DOM element
Target element — scroll away to test
const vp = new inViewport({ selector: ".ivp-isview-el" })

btn.addEventListener("click", () => {
    const visible = vp.isView()
    output.textContent = "isView() → " + visible
})
v 1.1.2