window.addEventListener('load', function(event) { var anchors = document.getElementsByTagName("a"); for (var i = 0, max = anchors.length; i < max; i++) { var anchor = anchors[i]; var href = anchor.getAttribute("href"); if (href === null || !href.startsWith("#")) { continue; } anchor.addEventListener("click", function(e) { e.preventDefault(); var href = this.getAttribute("href"); var name = href.substring(1); var target = document.getElementById(name); if (!target) { target = document.getElementsByTagName("body")[0]; } if (!target) { return; } var targetTop = target.getBoundingClientRect().top; var currentTop = document.documentElement.scrollTop; var diff = Math.abs(targetTop - currentTop); scrollToElem(target, 100 + diff /4); }); } }); // based on https://gist.github.com/andjosh/6764939 function scrollToElem(target, duration) { var start = window.pageYOffset; var to = target.getBoundingClientRect().top; var change = to - start; var currentTime = 0; var increment = 20; function animateScroll() { currentTime += increment; var val = easeInOutQuad(currentTime, start, change, duration); window.scrollTo(window.pageXOffset, val); if (currentTime < duration) { setTimeout(animateScroll, increment); } }; animateScroll(); //t = current time //b = start value //c = change in value //d = duration function easeInOutQuad(t, b, c, d) { t /= d/2; if (t < 1) return c/2*t*t + b; t--; return -c/2 * (t*(t-2) - 1) + b; }; }