intersect #

The intersect helper in intersect.svelte.ts creates an attachment that observes when an element enters or leaves the viewport using the Intersection Observer API.

Uses the lazy function pattern to optimize reactivity: callbacks can update without recreating the observer, preserving state.

import {intersect} from '@ryanatkn/fuz/intersect.svelte.js'; <div {@attach intersect(() => ({intersecting}) => { console.log(intersecting ? 'entered' : 'left'); })}> scroll me into view </div>

The callback receives intersecting (boolean), intersections (number count), el, observer, and disconnect.

threshold: 0 (default)
#

Triggers when the element enters the viewport by at least a pixel. Scroll to see items change state.

<div {@attach intersect(() => ({ onintersect: ({intersecting, el}) => { el.classList.toggle('intersecting', intersecting); } }))}> content </div>
  • item 0
  • item 1
  • item 2
  • item 3
  • item 4
  • item 5
  • item 6
  • item 7
  • item 8
  • item 9
  • item 10
  • item 11
  • item 12
  • item 13
  • item 14

threshold: 0.5
#

Triggers when 50% of the element is visible.

<div {@attach intersect(() => ({ onintersect: ({intersecting, el}) => { el.classList.toggle('intersecting', intersecting); }, options: {threshold: 0.5} }))}> content </div>
  • item 0
  • item 1
  • item 2
  • item 3
  • item 4
  • item 5
  • item 6
  • item 7
  • item 8
  • item 9
  • item 10
  • item 11
  • item 12
  • item 13
  • item 14

threshold: 1
#

Triggers only when the element is fully visible.

<div {@attach intersect(() => ({ onintersect: ({intersecting, el}) => { el.classList.toggle('intersecting', intersecting); }, options: {threshold: 1} }))}> content </div>
  • item 0
  • item 1
  • item 2
  • item 3
  • item 4
  • item 5
  • item 6
  • item 7
  • item 8
  • item 9
  • item 10
  • item 11
  • item 12
  • item 13
  • item 14

count: 1
#

Disconnects after the first intersection cycle (enter and leave). A count of 0 disables observation. Negative or undefined never disconnects. (the default)

<div {@attach intersect(() => ({ onintersect: ({intersecting, el}) => { el.classList.toggle('intersecting', intersecting); }, count: 1 }))}> content </div>
  • item 0
  • item 1
  • item 2
  • item 3
  • item 4
  • item 5
  • item 6
  • item 7
  • item 8
  • item 9
  • item 10
  • item 11
  • item 12
  • item 13
  • item 14

count: 2
#

Disconnects after two intersection cycles.

<div {@attach intersect(() => ({ onintersect: ({intersecting, el}) => { el.classList.toggle('intersecting', intersecting); }, count: 2 }))}> content </div>
  • item 0
  • item 1
  • item 2
  • item 3
  • item 4
  • item 5
  • item 6
  • item 7
  • item 8
  • item 9
  • item 10
  • item 11
  • item 12
  • item 13
  • item 14

Configurable
#

Try different parameter combinations. Positive count values disconnect after N cycles. 0 disables observation. Negative or undefined never disconnects. (the default)

  • item 0
  • item 1
  • item 2
  • item 3
  • item 4
  • item 5
  • item 6
  • item 7
  • item 8
  • item 9
  • item 10
  • item 11
  • item 12
  • item 13
  • item 14

Full API docs at intersect.svelte.ts.