ScrollSpy
ScrollSpy is a MooTools plugin that listens to the page's scroll position and fires events based upon where the user is on the page.
Download Debut Article Example UsagePlugin Code (Version 1.0)
/* scroll spy plugin / class */
var ScrollSpy = new Class({
/* implements */
Implements: [Options,Events],
/* options */
options: {
min: 0,
mode: 'vertical',
max: 0,
container: window,
onEnter: $empty,
onLeave: $empty,
onTick: $empty
},
/* initialization */
initialize: function(options) {
/* set options */
this.setOptions(options);
this.container = $(this.options.container);
this.enters = this.leaves = 0;
this.max = this.options.max;
/* fix max */
if(this.max == 0)
{
var ss = this.container.getScrollSize();
this.max = this.options.mode == 'vertical' ? ss.y : ss.x;
}
/* make it happen */
this.addListener();
},
/* a method that does whatever you want */
addListener: function() {
/* state trackers */
this.inside = false;
this.container.addEvent('scroll',function() {
/* if it has reached the level */
var position = this.container.getScroll();
var xy = this.options.mode == 'vertical' ? position.y : position.x;
/* if we reach the minimum and are still below the max... */
if(xy >= this.options.min && xy <= this.max) {
/* trigger Enter event if necessary */
if(!this.inside) {
/* record as inside */
this.inside = true;
this.enters++;
/* fire enter event */
this.fireEvent('enter',[position,this.enters]);
}
/* trigger the "tick", always */
this.fireEvent('tick',[position,this.inside,this.enters,this.leaves]);
}
else {
/* trigger leave */
if(this.inside)
{
this.inside = false;
this.leaves++;
this.fireEvent('leave',[position,this.leaves]);
}
}
}.bind(this));
}
});
/* usage */
window.addEvent('domready',function() {
/* smooth */
new SmoothScroll({duration:500});
/* link management */
$('gototop').set('opacity','0').setStyle('display','block');
/* scrollspy instance */
var ss = new ScrollSpy({
min: 200,
onEnter: function(position,enters) {
if(console) { console.log('Entered [' + enters + '] at: ' + position.x + ' / ' + position.y); }
$('gototop').fade('in');
},
onLeave: function(position,leaves) {
if(console) { console.log('Left [' + leaves + '] at: ' + position.x + ' / ' + position.y); }
$('gototop').fade('out');
},
onTick: function(position,state,enters,leaves) {
if(console) { console.log('Tick [' + enters + ', ' + leaves + '] at: ' + position.x + ' / ' + position.y); }
},
container: window
});
});
Options & Events
- min: (defaults to 0) The minimum value of the X or Y coordinate, depending on mode.
- max: (defaults to 0) The maximum value of the X or Y coordinate, depending on mode.
- mode: (defaults to 'vertical') Defines whether to listen to X or Y scrolling.
- container: (defaults to window) The element whose scrolling to listen to.
Events for ScrollSpy include:
- Tick: Fires on each scroll event within the min and max parameters. Receives as parameters:
- position: an object with the current X and Y position.
- inside: a Boolean value for whether or not the user is within the min and max parameters
- enters: the number of times the min / max has been entered.
- leaves: the number of times the min / max has been left.
- Enter: Fires every time the user enters the min / max zone.
- position: an object with the current X and Y position.
- enters: the number of times the min / max has been entered.
- Leave: Fires every time the user leaves the min / max zone.
- position: an object with the current X and Y position.
- leaves: the number of times the min / max has been left.
Code Revisions & Bug Fixes
None.
