123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- /**
- * ScrollIt
- * ScrollIt.js(scroll•it•dot•js) makes it easy to make long, vertically scrolling pages.
- *
- * Latest version: https://github.com/cmpolis/scrollIt.js
- *
- * License <https://github.com/cmpolis/scrollIt.js/blob/master/LICENSE.txt>
- */
- (function($) {
- 'use strict';
- var pluginName = 'ScrollIt',
- pluginVersion = '1.0.3';
- /*
- * OPTIONS
- */
- var defaults = {
- upKey: 38,
- downKey: 40,
- easing: 'linear',
- scrollTime: 600,
- activeClass: 'active',
- onPageChange: null,
- topOffset : 0
- };
- $.scrollIt = function(options) {
- /*
- * DECLARATIONS
- */
- var settings = $.extend(defaults, options),
- active = 0,
- lastIndex = $('[data-scroll-index]:last').attr('data-scroll-index');
- /*
- * METHODS
- */
- /**
- * navigate
- *
- * sets up navigation animation
- */
- var navigate = function(ndx) {
- if(ndx < 0 || ndx > lastIndex) return;
- var targetTop = $('[data-scroll-index=' + ndx + ']').offset().top + settings.topOffset + 1;
- $('html,body').animate({
- scrollTop: targetTop,
- easing: settings.easing
- }, settings.scrollTime);
- };
- /**
- * doScroll
- *
- * runs navigation() when criteria are met
- */
- var doScroll = function (e) {
- var target = $(e.target).closest("[data-scroll-nav]").attr('data-scroll-nav') ||
- $(e.target).closest("[data-scroll-goto]").attr('data-scroll-goto');
- navigate(parseInt(target));
- };
- /**
- * keyNavigation
- *
- * sets up keyboard navigation behavior
- */
- var keyNavigation = function (e) {
- var key = e.which;
- if($('html,body').is(':animated') && (key == settings.upKey || key == settings.downKey)) {
- return false;
- }
- if(key == settings.upKey && active > 0) {
- navigate(parseInt(active) - 1);
- return false;
- } else if(key == settings.downKey && active < lastIndex) {
- navigate(parseInt(active) + 1);
- return false;
- }
- return true;
- };
- /**
- * updateActive
- *
- * sets the currently active item
- */
- var updateActive = function(ndx) {
- if(settings.onPageChange && ndx && (active != ndx)) settings.onPageChange(ndx);
- active = ndx;
- $('[data-scroll-nav]').removeClass(settings.activeClass);
- $('[data-scroll-nav=' + ndx + ']').addClass(settings.activeClass);
- };
- /**
- * watchActive
- *
- * watches currently active item and updates accordingly
- */
- var watchActive = function() {
- var winTop = $(window).scrollTop();
- var visible = $('[data-scroll-index]').filter(function(ndx, div) {
- return winTop >= $(div).offset().top + settings.topOffset &&
- winTop < $(div).offset().top + (settings.topOffset) + $(div).outerHeight()
- });
- var newActive = visible.first().attr('data-scroll-index');
- updateActive(newActive);
- };
- /*
- * runs methods
- */
- $(window).on('scroll',watchActive).scroll();
- $(window).on('keydown', keyNavigation);
- $('body').on('click','[data-scroll-nav], [data-scroll-goto]', function(e){
- e.preventDefault();
- doScroll(e);
- });
- };
- }(jQuery));
|