blob: 01dcab7340201b073bf0e175b2b26c57c080eedb [file] [log] [blame]
/*--------------------------------------------------------------------------
* Smooth Scroller Script, version 1.0.1
* (c) 2007 Dezinerfolio Inc. <midart@gmail.com>
*
* For details, please check the website : http://dezinerfolio.com/
*
*--------------------------------------------------------------------------*/
/*jshint boss: true */
/*jslint plusplus: true */
var Scroller = (function () {
"use strict";
var onclickHandler = function () {
Scroller.end(this);
var l = this.hash.substr(1),
a = document.getElementsByTagName('a'),
i;
for (i = 0; i < a.length; i++) {
if (a[i].id === l) {
clearInterval(Scroller.interval);
Scroller.interval = setInterval(
'Scroller.scroll(' + Scroller.gy(a[i]) + ')',
10
);
}
}
};
return {
// control the speed of the scroller.
// don't change it here directly, please use Scroller.speed=50;
speed: 10,
// returns the Y position of the div
gy: function (d) {
var gy = d.offsetTop;
while (d = d.offsetParent) {
gy += d.offsetTop;
}
return gy;
},
// returns the current scroll position
scrollTop: function () {
var body = document.body,
d = document.documentElement;
if (body && body.scrollTop) {
return body.scrollTop;
}
if (d && d.scrollTop) {
return d.scrollTop;
}
if (window.pageYOffset) {
return window.pageYOffset;
}
return 0;
},
// attach an event for an element
// (element, type, function)
add: function (event, body, d) {
if (event.addEventListener) {
return event.addEventListener(body, d, false);
}
if (event.attachEvent) {
return event.attachEvent('on' + body, d);
}
return null;
},
// kill an event of an element
end: function (e) {
if (e.preventDefault && e.stopPropagation) {
e.preventDefault();
e.stopPropagation();
} else if (window.event) {
window.event.cancelBubble = true;
window.event.returnValue = false;
}
},
// move the scroll bar to the particular div.
scroll: function (d) {
var a = Scroller.scrollTop();
if (d > a) { // going down
a += Math.ceil((d - a) / Scroller.speed);
} else { // going up
a = a + (d - a) / Scroller.speed;
}
window.scrollTo(0, a);
if (a === d || Scroller.offsetTop === a) {
clearInterval(Scroller.interval);
}
Scroller.offsetTop = a;
},
// initializer that adds the renderer to the onload function of
// the window
init: function () {
Scroller.add(window, 'load', Scroller.render);
},
// this method extracts all the anchors and validates then as #
// and attaches the events.
render: function () {
Scroller.end(this);
var a = document.getElementsByTagName('a');
for (var i = 0; i < a.length; i++) {
var l = a[i],
has_hash = l.href && l.href.indexOf('#') !== -1,
is_cur_loc = l.pathname === location.pathname;
is_cur_loc |= '/' + l.pathname === location.pathname;
if (has_hash && is_cur_loc) {
Scroller.add(l, 'click', Scroller.end);
l.onclick = onclickHandler;
}
}
}
};
}());
// invoke the initializer of the scroller
Scroller.init();
/*------------------------------------------------------------
* END OF CODE
*-----------------------------------------------------------*/