1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| /* Tiny Scrolling - a smooth navigation between internal links and their destinations
by Marco Rosella - http://www.centralscrutinizer.it/en/design/js-php/tiny-scrolling
based on the works by Travis Beckham and Brian McAllister.
v0.3 - March 27, 2006
*/
window.onload = function() {
tinyScrolling.init();
}
var tinyScrolling = {
speed : 1, //set here the scroll speed: when this value increase, the speed decrease.
maxStep: 500, //set here the "uniform motion" step for long distances
brakeK: 1, //set here the coefficient of slowing down
hash:null,
currentBlock:null,
requestedY:0,
init: function() {
var lnks = document.getElementsByTagName('a');
for(var i = 0, lnk; lnk = lnks[i]; i++) {
if ((lnk.href && lnk.href.indexOf('#') != -1) && ( (lnk.pathname == location.pathname) ||
('/'+lnk.pathname == location.pathname) ) && (lnk.search == location.search)) {
lnk.onclick = tinyScrolling.initScroll;
}
}
},
getElementYpos: function(el){
var y = 0;
while(el.offsetParent){
y += el.offsetTop
el = el.offsetParent;
} return y;
},
getScrollTop: function(){
if(document.all) return (document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop;
else return window.pageYOffset;
},
getWindowHeight: function(){
if (window.innerHeight) return window.innerHeight;
if(document.documentElement && document.documentElement.clientHeight) return document.documentElement.clientHeight;
},
getDocumentHeight: function(){
if (document.height) return document.height;
if(document.body.offsetHeight) return document.body.offsetHeight;
},
initScroll: function(e){
var targ;
if (!e) var e = window.event;
if (e.target) targ = e.target;
else if (e.srcElement) targ = e.srcElement;
tinyScrolling.hash = targ.href.substr(targ.href.indexOf('#')+1,targ.href.length);
tinyScrolling.currentBlock = document.getElementById(tinyScrolling.hash);
if(!tinyScrolling.currentBlock) return;
tinyScrolling.requestedY = tinyScrolling.getElementYpos(tinyScrolling.currentBlock);
tinyScrolling.scroll();
return false;
},
scroll: function(){
var top = tinyScrolling.getScrollTop();
if(tinyScrolling.requestedY > top) {
var endDistance = Math.round((tinyScrolling.getDocumentHeight() - (top + tinyScrolling.getWindowHeight())) / tinyScrolling.brakeK);
endDistance = Math.min(Math.round((tinyScrolling.requestedY-top)/ tinyScrolling.brakeK), endDistance);
var offset = Math.max(2, Math.min(endDistance, tinyScrolling.maxStep));
} else { var offset = - Math.min(Math.abs(Math.round((tinyScrolling.requestedY-top)/ tinyScrolling.brakeK)), tinyScrolling.maxStep);
} window.scrollTo(0, top + offset);
if(Math.abs(top-tinyScrolling.requestedY) <= 1 || tinyScrolling.getScrollTop() == top) {
window.scrollTo(0, tinyScrolling.requestedY);
if(!document.all || window.opera) location.hash = tinyScrolling.hash;
tinyScrolling.hash = null;
} else setTimeout(tinyScrolling.scroll,tinyScrolling.speed);
}
} |
Partager