Team:NCTU Formosa/source/scrollit
/**
* 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));