A simple scroll spy
- Dependencies: node, (ruby) sass*, gulp
- To start run
npm install,git submodule initandgit submodule update. gulpwill build the sitegulp watchwill set-up watch, watchify, browser-syncgulp prodwill build the site with minified/uglified/optimized assets
*Sass is only there to build the demo page. You can remove it all if you like.
// require('./matchMedia'); // only necessary if using a media query in options & want deeper support
scrollSpy({
nav: '#pageNav',
stickyNav: true
});| Options | Type | Default | Description |
|---|---|---|---|
| nav | string or jQuery obj | null | Selector for your entire nav container, probably a <nav> or <ul> |
| navLinks | string | '[href^="#"]' | The links that will be controlling this thing |
| stickyClass | string | 'is-sticky' | Class that's applied to your nav when it's off the page. You probably want to set position: fixed; at this point. |
| scrollDuration | number | 500 | How long do you want the animated scrolls to take |
| activeClass | string | is-active | Class that's applied to the nav item that's the current position on the page. |
| stickyNav | boolean | false | Do you want me to toggle the stickyClass when the nav is on/off the page |
| title | string or jQuery obj | null | Do you need to update something to the title of the link when it's the current position? |
| disableScrollToAnchor | boolean or string | false | True will disable animated scrolls between anchors. A media query will disable it accordingly (Ex. (min-width: 768px)). Remember to use a matchMedia polyfill if you need that support. |
| disableScrollSpy | boolean or string | false | True will basically disable the whole point of this thing. The string is a media query, refer to above. |
| classOnTarget | boolean | false | Adds active class to current active target (not the anchor) |
| Name | Params | Description |
|---|---|---|
| onScrollCb | scrollPosition: num, navHeight: num | Fired on scroll. Not debounced or throttled. Will not be disabled by disableScrollSpy option. |
| onChangeCb | lastId: string, id: string, scroll: num, navHeight: num | Fired when current section changes. LastId is the previous one. id is the new one. |
| onClickCb | el: jquery obj of item clicked, disabled: whether or not disableScrollToAnchor is on | Fired when nav item is clicked |
Your last item needs to be tall enough to ensure that it triggers the scroll spy. It can probably be a touch more intelligent about how it works but consider adjusting your design to better suit this.