// 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; }; }