99 lines
3.2 KiB
JavaScript
99 lines
3.2 KiB
JavaScript
|
/*!
|
||
|
* jQuery Scrollspy Plugin
|
||
|
* Author: @sxalexander
|
||
|
* Licensed under the MIT license
|
||
|
*/
|
||
|
|
||
|
|
||
|
;(function ( $, window, document, undefined ) {
|
||
|
|
||
|
$.fn.extend({
|
||
|
scrollspy: function ( options ) {
|
||
|
|
||
|
var defaults = {
|
||
|
min: 0,
|
||
|
max: 0,
|
||
|
mode: 'vertical',
|
||
|
buffer: 0,
|
||
|
container: window,
|
||
|
onEnter: options.onEnter ? options.onEnter : [],
|
||
|
onLeave: options.onLeave ? options.onLeave : [],
|
||
|
onTick: options.onTick ? options.onTick : []
|
||
|
}
|
||
|
|
||
|
var options = $.extend( {}, defaults, options );
|
||
|
|
||
|
return this.each(function (i) {
|
||
|
|
||
|
var element = this;
|
||
|
var o = options;
|
||
|
var $container = $(o.container);
|
||
|
var mode = o.mode;
|
||
|
var buffer = o.buffer;
|
||
|
var enters = leaves = 0;
|
||
|
var inside = false;
|
||
|
|
||
|
/* add listener to container */
|
||
|
$container.bind('scroll', function(e){
|
||
|
var position = {top: $(this).scrollTop(), left: $(this).scrollLeft()};
|
||
|
var xy = (mode == 'vertical') ? position.top + buffer : position.left + buffer;
|
||
|
var max = o.max;
|
||
|
var min = o.min;
|
||
|
|
||
|
/* fix max */
|
||
|
if($.isFunction(o.max)){
|
||
|
max = o.max();
|
||
|
}
|
||
|
|
||
|
/* fix max */
|
||
|
if($.isFunction(o.min)){
|
||
|
min = o.min();
|
||
|
}
|
||
|
|
||
|
if(max == 0){
|
||
|
max = (mode == 'vertical') ? $container.height() : $container.outerWidth() + $(element).outerWidth();
|
||
|
}
|
||
|
|
||
|
/* if we have reached the minimum bound but are below the max ... */
|
||
|
if(xy >= o.min && xy <= max){
|
||
|
/* trigger enter event */
|
||
|
if(!inside){
|
||
|
inside = true;
|
||
|
enters++;
|
||
|
|
||
|
/* fire enter event */
|
||
|
$(element).trigger('scrollEnter', {position: position})
|
||
|
if($.isFunction(o.onEnter)){
|
||
|
o.onEnter(element, position);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/* triger tick event */
|
||
|
$(element).trigger('scrollTick', {position: position, inside: inside, enters: enters, leaves: leaves})
|
||
|
if($.isFunction(o.onTick)){
|
||
|
o.onTick(element, position, inside, enters, leaves);
|
||
|
}
|
||
|
}else{
|
||
|
|
||
|
if(inside){
|
||
|
inside = false;
|
||
|
leaves++;
|
||
|
/* trigger leave event */
|
||
|
$(element).trigger('scrollLeave', {position: position, leaves:leaves})
|
||
|
|
||
|
if($.isFunction(o.onLeave)){
|
||
|
o.onLeave(element, position);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
});
|
||
|
}
|
||
|
|
||
|
})
|
||
|
|
||
|
|
||
|
})( jQuery, window );
|