Skip to content

Instantly share code, notes, and snippets.

@speeday
Forked from FranciscoG/scrollIt.js
Last active August 15, 2021 18:08
Show Gist options
  • Save speeday/8cbf90ae85e75fb6daa890a99555fa23 to your computer and use it in GitHub Desktop.
Save speeday/8cbf90ae85e75fb6daa890a99555fa23 to your computer and use it in GitHub Desktop.
Vanilla JS scroll window to an element
<a className="btn btn-secondary" href="javascript:void(0)" onClick={(e) => scrollToElement(document.getElementsByClassName("role-section")[0], e)}>
{props?.button_text}
</a>
/**
* @name : scrollToElement
* @param Element
* @description : Smooth Scrolling to Specific Element.
*/
export const scrollToElement = (destination, e) => {
const classList = e.target.parentElement.classList.contains("active");
if (!classList) {
const easings = {
easeOutQuart(t) {
return 1 - --t * t * t * t;
},
};
const duration = 3000;
const easing = "easeOutQuart";
const start = window.pageYOffset;
const startTime = "now" in window.performance ? performance.now() : new Date().getTime();
const documentHeight = Math.max(
document.body.scrollHeight,
document.body.offsetHeight,
document.documentElement.clientHeight,
document.documentElement.scrollHeight,
document.documentElement.offsetHeight
);
const windowHeight =
window.innerHeight ||
document.documentElement.clientHeight ||
document.getElementsByTagName("body")[0].clientHeight;
const destinationOffset = typeof destination === "number" ? destination : destination.offsetTop;
const destinationOffsetToScroll = Math.round(
documentHeight - destinationOffset < windowHeight ? documentHeight - windowHeight : destinationOffset
);
if ("requestAnimationFrame" in window === false) {
window.scroll(0, destinationOffsetToScroll);
return;
}
const scroll = () => {
const now = "now" in window.performance ? performance.now() : new Date().getTime();
const time = Math.min(1, (now - startTime) / duration);
const timeFunction = easings[easing](time);
window.scroll(0, Math.ceil(timeFunction * (destinationOffsetToScroll - start) + start));
if (Math.ceil(window.pageYOffset) === destinationOffsetToScroll) {
return;
}
requestAnimationFrame(scroll);
};
scroll();
}
};
/**
* Source: https://pawelgrzybek.com/page-scroll-in-vanilla-javascript/
*/
function scrollIt(destination, duration = 200, easing = 'linear', callback) {
const easings = {
linear(t) {
return t;
},
easeInQuad(t) {
return t * t;
},
easeOutQuad(t) {
return t * (2 - t);
},
easeInOutQuad(t) {
return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
},
easeInCubic(t) {
return t * t * t;
},
easeOutCubic(t) {
return (--t) * t * t + 1;
},
easeInOutCubic(t) {
return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;
},
easeInQuart(t) {
return t * t * t * t;
},
easeOutQuart(t) {
return 1 - (--t) * t * t * t;
},
easeInOutQuart(t) {
return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * (--t) * t * t * t;
},
easeInQuint(t) {
return t * t * t * t * t;
},
easeOutQuint(t) {
return 1 + (--t) * t * t * t * t;
},
easeInOutQuint(t) {
return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * (--t) * t * t * t * t;
}
};
const start = window.pageYOffset;
const startTime = 'now' in window.performance ? performance.now() : new Date().getTime();
const documentHeight = Math.max(document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight);
const windowHeight = window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight;
const destinationOffset = typeof destination === 'number' ? destination : destination.offsetTop;
const destinationOffsetToScroll = Math.round(documentHeight - destinationOffset < windowHeight ? documentHeight - windowHeight : destinationOffset);
if ('requestAnimationFrame' in window === false) {
window.scroll(0, destinationOffsetToScroll);
if (callback) {
callback();
}
return;
}
function scroll() {
const now = 'now' in window.performance ? performance.now() : new Date().getTime();
const time = Math.min(1, ((now - startTime) / duration));
const timeFunction = easings[easing](time);
window.scroll(0, Math.ceil((timeFunction * (destinationOffsetToScroll - start)) + start));
if (window.pageYOffset === destinationOffsetToScroll) {
if (callback) {
callback();
}
return;
}
requestAnimationFrame(scroll);
}
scroll();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment