Skip to content
Snippets Groups Projects

@grifart/smoothscroll

Aim of this library is to provide more user-friendly and less epileptic scrolling effect on a long content as well as unification of all types of scrolling on a page.

Installation and usage

yarn add @grifart/smoothscroll
import SmoothScroll from '@grifart/smoothscroll';

// use defaults
SmoothScroll.enable();

// customize
SmoothScroll.enable({
	scrollOnLoad: true,
	scrollOnLinkClick: true,
});

Options

Option Value Default value Description
scrollOnLoad* true/false true Causes smooth scroll to anchored element when the page is loaded.
scrollOnLinkClick true/false true Causes smooth scroll on given element when user clicks on an a tag having href starting with # character.

*Note: when the page load lasts more than 500 ms, load smooth scroll effect is disabled as it would lead to user-unfriendly behaviour like jumping on the page up and down due to browser native behaviour.

Methods

Method Parameters
enable([options]) options (optional): see above
scrollToElement(element[, onScrollFinishedCallback]) element: element to scroll to onScrollFinishedCallback (optional): callback to trigger when scrolling is finished
scrollToOffset(topOffset[, onScrollFinishedCallback]) topOffset: scroll offset from top of document onScrollFinishedCallback (optional): callback to trigger when scrolling is finished
scrollToTarget(hashTarget[, onScrollFinishedCallback]) hashTarget: instance of HashTarget object* or string** onScrollFinishedCallback (optional): callback to trigger when scrolling is finished

* HashTarget is a value object representing a target to scroll to. You can easily initalize it with named constructor: HashTarget.fromString('#some-identifier', document)
** In case of passing string, HashTarget object will be instantiated automatically with current document context.

More about

Custom scrolling effect

Improved scrolling effect (internally called ease-in-skip-out) is registered by default and it works as basic ease-in-out with one modification that it skips content if it is too long. This results in nicer transition between two parts of a page.

Covered scenarios

  • scroll when clicking a link with an anchor (<a href="#anchor">whatever</a>)
  • scroll when page is entered with an anchor (https://example.com/whatever#anchor)
  • scroll when programatically needed to scroll to:
    • given position (top offset)
    • given element

Development

yarn install
yarn dev

Every piece of this library comes with its unit test sitting alongside the script. Whole library is covered by integration test sitting in src folder.
Note that you have to build assets first (yarn build) before running a test.