Quaff

QScrollObserver

A utility to observe scroll events on a target element. It provides derived properties for various scroll metrics.

Scroll me
Lorem ipsum dolor sit amet consectetur adipisicing elit. Odit ipsam, odio corrupti illum possimus, suscipit doloremque asperiores quidem iure nostrum dolor enim deleniti eum! Incidunt quisquam eligendi illum dolores nobis! Modi optio commodi veritatis molestias esse maiores cupiditate a consectetur facere, deleniti veniam quo ullam quod inventore eaque minima laborum nisi adipisci eligendi laboriosam ducimus amet? Deserunt sapiente blanditiis ab! Perferendis iure, magnam, quod eius assumenda beatae expedita explicabo quo sed magni laboriosam? Quidem velit culpa, reprehenderit, reiciendis rerum praesentium eum quos nemo assumenda necessitatibus quibusdam rem autem eaque possimus. Dolor assumenda nam doloremque esse veniam asperiores aspernatur exercitationem, quaerat quos sed perspiciatis atque porro voluptatum temporibus hic est minima ad. Earum rerum cumque voluptates minus, labore adipisci expedita voluptatibus. Eos vero eaque minima possimus optio accusamus necessitatibus ipsam molestiae facere dolore, quod odit, ad, adipisci voluptatum aspernatur aliquam! Delectus porro quibusdam qui. Voluptate dolore consequatur qui suscipit. Deleniti, autem? Rem in impedit consequuntur nihil, error illo autem fugit molestiae provident nam quasi illum inventore iste doloremque numquam obcaecati? Dolorum, totam molestias sunt fuga mollitia minus iure doloremque culpa beatae. Voluptatibus odit ad architecto ipsum illum aliquam distinctio adipisci. Fugiat eius quis ea delectus voluptates culpa ut iusto impedit iste, omnis temporibus aspernatur dolor facere, expedita molestias laborum tempora rerum? Voluptatibus inventore quos nobis fugit incidunt impedit repudiandae, autem sit fuga laborum? Itaque, officiis placeat officia quis adipisci perspiciatis recusandae ex error reprehenderit, nemo provident sunt fugit commodi doloribus quae. Perferendis cumque corrupti a alias eius quo nemo aspernatur doloribus molestias voluptas in cum sint qui repellendus cupiditate molestiae voluptates aliquam quia, enim officia ipsum fuga harum hic. Culpa, excepturi. Voluptate cum autem quaerat, ex nesciunt at alias amet dolorem modi! Nihil quia exercitationem veniam asperiores laboriosam dolore nobis? Dolorum impedit debitis aliquid id fugit asperiores nulla, aperiam dolor quidem?
Scroll position: 0
Scroll direction: down
Changed direction: false
Delta: 0
Inflection point: 0

Usage

Observing an element

There are two ways to start observing an element. The first is to pass the element reference to the constructor, either using bind:this or using a document.querySelector call. The second is to pass the element's selector to the constructor. This will use document.querySelector to find the element.

Example:
const scroll = new QScrollObserver('#my-element-id')

Then, you will be able to watch the reactive properties of the observer using Svelte's $derived or $effect runes or inside the markup directly.

You don't have to worry about cleaning up the observer, as it will be automatically cleaned up when the element is destroyed. However, if you want to stop observing the element manually, you can call the destroy method on the observer.

For more control, you can pass options to the constructor: debounce: number, to specify at what interval is milliseconds the observer should be triggered, and horizontal: boolean to specify if the observer should track horizontal scroll events rather than vertical. By default, the observer will track vertical scroll events only with no debounce.

For now, the observer only supports observing one direction at a time. If you want to observe both directions, you will need to create two observers, one for each direction. This is subject to change in the future.

Properties and methods

The observer has the following properties:

  • position: The current scroll position of the target element.
  • direction: The direction of the last scroll event.
  • changedDirection: A boolean indicating if the scroll direction has changed since the last event.
  • delta: The change in scroll position since the last event, i.e the amound scrolled during the event.
  • inflectionPoint: The point at which the scroll direction last changed.

The observer also has a destroy method that can be used to stop observing the target element and clean up the observer.

Live example
Scroll me
Lorem ipsum dolor sit amet consectetur adipisicing elit. Odit ipsam, odio corrupti illum possimus, suscipit doloremque asperiores quidem iure nostrum dolor enim deleniti eum! Incidunt quisquam eligendi illum dolores nobis! Modi optio commodi veritatis molestias esse maiores cupiditate a consectetur facere, deleniti veniam quo ullam quod inventore eaque minima laborum nisi adipisci eligendi laboriosam ducimus amet? Deserunt sapiente blanditiis ab! Perferendis iure, magnam, quod eius assumenda beatae expedita explicabo quo sed magni laboriosam? Quidem velit culpa, reprehenderit, reiciendis rerum praesentium eum quos nemo assumenda necessitatibus quibusdam rem autem eaque possimus. Dolor assumenda nam doloremque esse veniam asperiores aspernatur exercitationem, quaerat quos sed perspiciatis atque porro voluptatum temporibus hic est minima ad. Earum rerum cumque voluptates minus, labore adipisci expedita voluptatibus. Eos vero eaque minima possimus optio accusamus necessitatibus ipsam molestiae facere dolore, quod odit, ad, adipisci voluptatum aspernatur aliquam! Delectus porro quibusdam qui. Voluptate dolore consequatur qui suscipit. Deleniti, autem? Rem in impedit consequuntur nihil, error illo autem fugit molestiae provident nam quasi illum inventore iste doloremque numquam obcaecati? Dolorum, totam molestias sunt fuga mollitia minus iure doloremque culpa beatae. Voluptatibus odit ad architecto ipsum illum aliquam distinctio adipisci. Fugiat eius quis ea delectus voluptates culpa ut iusto impedit iste, omnis temporibus aspernatur dolor facere, expedita molestias laborum tempora rerum? Voluptatibus inventore quos nobis fugit incidunt impedit repudiandae, autem sit fuga laborum? Itaque, officiis placeat officia quis adipisci perspiciatis recusandae ex error reprehenderit, nemo provident sunt fugit commodi doloribus quae. Perferendis cumque corrupti a alias eius quo nemo aspernatur doloribus molestias voluptas in cum sint qui repellendus cupiditate molestiae voluptates aliquam quia, enim officia ipsum fuga harum hic. Culpa, excepturi. Voluptate cum autem quaerat, ex nesciunt at alias amet dolorem modi! Nihil quia exercitationem veniam asperiores laboriosam dolore nobis? Dolorum impedit debitis aliquid id fugit asperiores nulla, aperiam dolor quidem?
{
  "position": 0,
  "direction": "down",
  "changedDirection": false,
  "delta": 0,
  "inflectionPoint": 0
}