Skip to content

scrollTo

Scroll to a given target without blocking user interaction. The target can be a selector, an element, a number or a scroll position object.

If the target is a selector or an element, the scroll-margin CSS values will be respected when calculating the final scroll position.

The scrollTo function uses the tween function under the hood, inheriting from its options.

Usage

js
import { scrollTo, easeOutExpo } from '@studiometa/js-toolkit/utils';

await scrollTo('#target');
await scrollTo(document.querySelector('#target'));
await scrollTo(800);
await scrollTo({ top: 300, left: 200 });

// Custom axis
await scrollTo(800, { axis: scrollTo.axis.y }); // default
await scrollTo(800, { axis: scrollTo.axis.x });
await scrollTo(800, { axis: scrollTo.axis.both });

// With offset
await scrollTo('#target', { offset: 100 }); // stop at 100px from the target

// With a different scrolling element
await scrollTo(800, { rootElement: document.body });

// With custom easing and duration
await scrollTo(800, { duration: 2, easing: easeOutExpo });
await scrollTo(800, { smooth: 0.5 }); // custom smooth factor

Parameters

  • target (string | HTMLElement | number | ScrollPosition): the target of the scroll
  • options (ScrollToOptions): options for the scroll (offset + tween options)

Return value

This function returns a Promise resolving to the scroll position, even when stopped by use interaction.

Types

ts
interface ScrollPosition {
  left: number;
  top: number;
}

type ScrollTarget = string | HTMLElement | number | Partial<ScrollPosition>;

interface ScrollToOptions extends TweenOptions {
  /**
   * Root element that will be scrolled.
   */
  rootElement?: HTMLElement | typeof window;
  /**
   * Scroll direction, available values are:
   * - scrollTo.axis.x (enabled if target is an object with a `left` key)
   * - scrollTo.axis.y (default)
   * - scrollTo.axis.both
   */
  axis?: (typeof scrollTo.axis)[keyof typeof scrollTo.axis];
  /**
   * Distance from the target.
   */
  offset?: number;
}

function scrollTo(target: ScrollTarget, options?: ScrollToOptions): Promise<ScrollPosition>;

MIT Licensed