I am making a scrollTo
functionality in my website, and basing it on this answer. Because I don't want to just copy and paste the code, I'm trying to understand it. I was able to understand everything (took me 2 days!) besides for the math part in the scrollToX function
.
element.scrollTop = xFrom - (xFrom - xTo) * motion(t01);
t01 += speed * step;
I understand the actual math, but I don't understand why it works. Why does that math make the scroll animation?
document.getElementsByTagName('button')[0].onclick = function() {
scrollTo(0, 1000);
}
// Element to move, time in ms to animate
function scrollTo(element, duration) {
var e = document.documentElement;
if (e.scrollTop === 0) {
var t = e.scrollTop;
++e.scrollTop;
e = t + 1 === e.scrollTop-- ? e : document.body;
}
scrollToC(e, e.scrollTop, element, duration);
}
// Element to move, element or px from, element or px to, time in ms to animate
function scrollToC(element, from, to, duration) {
if (duration <= 0) return;
if (typeof from === "object") from = from.offsetTop;
if (typeof to === "object") to = to.offsetTop;
scrollToX(element, from, to, 0, 1 / duration, 20, easeOutCuaic);
}
function scrollToX(element, xFrom, xTo, t01, speed, step, motion) {
if (t01 < 0 || t01 > 1 || speed <= 0) {
element.scrollTop = xTo;
return;
}
element.scrollTop = xFrom - (xFrom - xTo) * motion(t01);
t01 += speed * step;
setTimeout(function() {
scrollToX(element, xFrom, xTo, t01, speed, step, motion);
}, step);
}
function linearTween(t) {
return t;
}
function easeInQuad(t) {
return t * t;
}
function easeOutQuad(t) {
return -t * (t - 2);
}
function easeInOutQuad(t) {
t /= 0.5;
if (t < 1) return t * t / 2;
t--;
return (t * (t - 2) - 1) / 2;
}
function easeInCuaic(t) {
return t * t * t;
}
function easeOutCuaic(t) {
t--;
return t * t * t + 1;
}
function easeInOutCuaic(t) {
t /= 0.5;
if (t < 1) return t * t * t / 2;
t -= 2;
return (t * t * t + 2) / 2;
}
function easeInQuart(t) {
return t * t * t * t;
}
function easeOutQuart(t) {
t--;
return -(t * t * t * t - 1);
}
function easeInOutQuart(t) {
t /= 0.5;
if (t < 1) return 0.5 * t * t * t * t;
t -= 2;
return -(t * t * t * t - 2) / 2;
}
function easeInQuint(t) {
return t * t * t * t * t;
}
function easeOutQuint(t) {
t--;
return t * t * t * t * t + 1;
}
function easeInOutQuint(t) {
t /= 0.5;
if (t < 1) return t * t * t * t * t / 2;
t -= 2;
return (t * t * t * t * t + 2) / 2;
}
function easeInSine(t) {
return -Mathf.Cos(t / (Mathf.PI / 2)) + 1;
}
function easeOutSine(t) {
return Mathf.Sin(t / (Mathf.PI / 2));
}
function easeInOutSine(t) {
return -(Mathf.Cos(Mathf.PI * t) - 1) / 2;
}
function easeInExpo(t) {
return Mathf.Pow(2, 10 * (t - 1));
}
function easeOutExpo(t) {
return -Mathf.Pow(2, -10 * t) + 1;
}
function easeInOutExpo(t) {
t /= 0.5;
if (t < 1) return Mathf.Pow(2, 10 * (t - 1)) / 2;
t--;
return (-Mathf.Pow(2, -10 * t) + 2) / 2;
}
function easeInCirc(t) {
return -Mathf.Sqrt(1 - t * t) - 1;
}
function easeOutCirc(t) {
t--;
return Mathf.Sqrt(1 - t * t);
}
function easeInOutCirc(t) {
t /= 0.5;
if (t < 1) return -(Mathf.Sqrt(1 - t * t) - 1) / 2;
t -= 2;
return (Mathf.Sqrt(1 - t * t) + 1) / 2;
}
Very long page.Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page.Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page. Very long page.
<button type="button">To the top</button>