@three11/scrollspy
Version:
Automatically update your navigation components based on scroll position to indicate which link is currently active in the viewport
149 lines (107 loc) • 5.58 kB
Markdown
[](https://github.com/three11/scrollspy/releases/latest)
[](https://github.com/three11/scrollspy/issues)
[](https://github.com/three11/scrollspy/commits/master)
[](https://github.com/three11/scrollspy/)
[](https://travis-ci.org/three11/scrollspy)
[](https://www.npmjs.com/package/@three11/scrollspy)
[](https://www.npmjs.com/package/@three11/scrollspy)
[](https://github.com/three11/scrollspy/)
# ScrollSpy
> Automatically update your navigation components based on scroll position to indicate which link is currently active in the viewport.
## Install
```sh
npm i @three11/scrollspy
# or
yarn add @three11/scrollspy
```
or
Just download this repository and link the files located in dist folder:
```html
<script src="path-to-scrollspy/dist/index.js"></script>
```
or
Include it from Unpkg CDN
```html
<script src="//unpkg.com/@three11/scrollspy"></script>
```
## Usage
First, `import` the module:
```javascript
import ScrollSpy from '@three11/scrollspy';
```
Then initialize a new instance of the module:
```javascript
const scrollSpy = new ScrollSpy(scrollSpySettings, scrollSpyEasings);
```
## Settings
The default settings are:
| Name | Type | Description | Default |
| ------------------------ | ---------- | -------------------------------------------------------------------- | ------------------------ |
| `headerClass` | `string` | The class name of your Header element | `.c-header` |
| `headerOffset` | `boolean` | Flag which indicates if the Header height should be calculated | `true` |
| `animationSpeed` | `number` | Speed of the scroll animation (in milliseconds) | `2000` |
| `animationEasing` | `string` | Name of the easing function. For more details see below | `easeInOutQuint` |
| `sectionSelector` | `string` | CSS selector for your Section elements | `.js-scroll-spy-section` |
| `linkCurrentClass` | `string` | Class name to be applied to the currently active link | `current` |
| `linksContainerSelector` | `string` | CSS selector for your scroll spy navigation | `.js-scroll-spy-nav` |
| `onAfterScroll` | `function` | A function to run after the scroll after click on a link is complete | `() => {}` |
## Easings
The `ScrollSpy` instance accepts a second optional argument which specifies a list of easing functions.
The current list contains several predefined easing functions:
```javascript
{
linear: t => t,
easeInQuad: t => t * t,
easeOutQuad: t => t * (2 - t),
easeInCubic: t => t * t * t,
easeOutCubic: t => --t * t * t + 1,
easeInQuart: t => t * t * t * t,
easeOutQuart: t => 1 - --t * t * t * t,
easeInQuint: t => t * t * t * t * t,
easeOutQuint: t => 1 + --t * t * t * t * t,
easeInOutQuad: t => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),
easeInOutCubic: t => (t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1),
easeInOutQuart: t => (t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t),
easeInOutQuint: t => (t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t),
}
```
If you wish to add your own easing function, you can do so by adding it to the second argument of the `ScrollSpy` constructor.
Just remember that your custom easing function should accept a single `time` argument which is a `number` and should return a `number`.
In order to use your custom easing function, you need to specify its name in the `animationEasing` setting.
## API
There are two public methods of the `ScrollSpy` instance.
The `unbind` method unbinds (removes) all of the event listeners and the `bind` method binds (adds) all of the event listeners.
These methods are useful in various cases - for example if you load the content of your pages with AJAX and you want to remove all possible memory leaks after you remove the ScrollSpy markup/HTML.
Here is how you can use them:
```javascript
const scrollSpy = new ScrollSpy(scrollSpySettings, scrollSpyEasings);
// Later in your code
scrollSpy.unbind();
// Then, if you wish to re-enable the ScrollSpy functionality
scrollSpy.bind();
```
## Example
```javascript
new ScrollSpy(
{
linkCurrentClass: 'current',
linksContainerSelector: '.nav',
sectionSelector: '.section',
headerOffset: true,
headerClass: '.header',
animationSpeed: 3000,
animationEasing: 'customEasingFunction',
onAfterScroll: () => {
console.log('scroll ended');
}
},
{
customEasingFunction: t => t ** t
}
);
```
## Demo
A minimal demo is available [here](https://three11-scrollspy.netlify.app)
## License
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007