A simple rule-based approach to tracking element viewability.
npm install @svelte-plugins/viewable


A simple rule-based approach to tracking element viewability.
This provides the ability to define multiple viewability rules with callbacks for a single element. This comes in handy for instrumentation (specifically dwell time), ad tracking and beaconing, lazy-loading content or images, or doing fancy things at various trigger points.
If you're simply looking for a Svelte flavor of IntersectionObserver visit svelte-intersection-observer.
Try it in the Svelte REPL.
``bashnpm
> npm install @svelte-plugins/viewable
Usage
`svelte
Hello World
`Try the basic example in Svelte REPL.
API
$3
| Prop name | Description | Value |
| :----------- | :---------------------------------------------------------------- | :---------------------------------------------------------------------------------------------- |
| element | Element to observe | HTMLElement |
| rules | Viewability rules | object (default: null) |
| intervalRate | Rate to check measurement while intersecting (ms) | number (default: 200) |
| gridSize | Size of the obstruction grid | number (default: 20) |
| detectObstructions | If true, obstructions impacting the observed elements view will be a factor during measurement | boolean (default: false) |
| root | Containing element | null or HTMLElement (default: null) |
| rootMargin | Margin offset of the containing element | string (default: "0px") |
| intersecting | true if the observed element is intersecting | boolean (default: false) |
| observer | IntersectionObserver instance | IntersectionObserver |
| entry | IntersectionObserver Entry | IntersectionObserverEntry |
| debug | If true, debug ouput will be logged to console | boolean (default: false) |#### rules
| Prop name | Description | Value |
| :----------- | :------------------------------------------------------------------ | :---------------------------------- |
| duration | Consecutive time (seconds) that the element must be in view |
number (default: 0) |
| percentage | Percentage of the element that must be viewable | number (default: 0) |
| repeat | If true, the rule will be applied indefinitely v once | function (default: null) |
| fn | Callback function to execute when rule has been met | function (default: null) |
`js
const rules = {
dwell: {
duration: 1,
percentage: 50,
fn: () => {
console.log('50% of the element was visible for at least 1 consecutive second.');
}
}
}
`$3
The properties below can be used to assist with debugging any issues you might have (ex:
bind:duration, bind:percent, etc.)| Prop name | Description | Value |
| :----------- | :---------------------------------------------------------------- | :---------------------- |
| duration | Viewable duration of the tracked element |
number (default: 0) |
| percent | Percentage of total viewable area (X+Y) | number (default: 0) |
| percentX | Percentage of horizontal viewable area | number (default: 0) |
| percentY | Percentage of vertical viewable area | number (default: 0) |
| entry | IntersectionObserver Entry | object (default: null) |
| observer | IntersectionObserver | object (default: null) |$3
- on:observe: Fired when an intersection change occurs (type
IntersectionObserverEntry)
- on:intersect: Fired when an intersection change occurs and the element is intersecting (type IntersectionObserverEntry`)Read the Contributions for instructions on how to setup your development environment.
Contributions are always welcome and appreciated. Before contributing, please read the Code of Conduct.