@solid-primitives/scroll

Reactive primitives to react to element/window scrolling.
Installation
npm install @solid-primitives/scroll
# or
yarn add @solid-primitives/scroll
createScrollPosition
Reactive primitive providing a store-like object with current scroll position of specified target.
How to use it
import { createScrollPosition } from "@solid-primitives/scroll";
const windowScroll = createScrollPosition();
createEffect(() => {
windowScroll.x;
windowScroll.y;
});
With element refs
let ref: HTMLDivElement | undefined;
const scroll = createScrollPosition(() => ref);
onMount(() => {
const scroll = createScrollPosition(ref!);
});
<div ref={e => (ref = e)} />;
Reactive Target
The element target can be a reactive signal.
const [target, setTarget] = createSignal<Element | undefined>(element);
const scroll = createScrollPosition(target);
scroll.x;
scroll.y;
setTarget(ref);
setTarget(undefined);
Destructuring
If you are interested in listening to only single axis, you'd still have to access scroll.y as a property. To use it as a separate signal, you can wrap it with a function, or use destructure helper.
const scroll = createScrollPosition();
const x = () => scroll.x;
x();
import { destructure } from "@solid-primitives/destructure";
const { x, y } = destructure(createScrollPosition());
x();
y();
Demo
https://codesandbox.io/s/solid-primitives-scroll-xy19c8?file=/index.tsx
useWindowScrollPosition
Returns a reactive object with current window scroll position.
useWindowScrollPosition is a singleton root primitive, hence the object instance, signals and event-listeners are shared between dependents, making it more optimized to use in multiple places at once.
const scroll = useWindowScrollPosition();
createEffect(() => {
console.log(
scroll.x,
scroll.y,
);
});
Additional helpers
getScrollPosition
Get an { x: number, y: number } object of element/window scroll position.
Primitive ideas:
PRs Welcome :)
createScrollTo - A primitive to support scroll to a target
createHashScroll - A primitive to support scrolling based on a hashtag change
Changelog
See CHANGELOG.md