script/smooth.js (91 lines of code) (raw):

/*-------------------------------------------------------------------------- * 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 *-----------------------------------------------------------*/