Skip to content

Instantly share code, notes, and snippets.

@otonii
Created August 7, 2020 13:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save otonii/ad60f2770eb7085824ef3c91f102cd83 to your computer and use it in GitHub Desktop.
Save otonii/ad60f2770eb7085824ef3c91f102cd83 to your computer and use it in GitHub Desktop.
Smooth Whell Scrolling Vanilla JS
// https://stackoverflow.com/a/47206289
function init() {
new SmoothScroll(document, 120, 12)
}
function SmoothScroll(target, speed, smooth) {
if (target === document)
target =
document.scrollingElement ||
document.documentElement ||
document.body.parentNode ||
document.body // cross browser support for document scrolling
var moving = false
var pos = target.scrollTop
var frame =
target === document.body && document.documentElement
? document.documentElement
: target // safari is the new IE
target.addEventListener('mousewheel', scrolled, { passive: false })
target.addEventListener('DOMMouseScroll', scrolled, { passive: false })
function scrolled(e) {
e.preventDefault() // disable default scrolling
var delta = normalizeWheelDelta(e)
pos += -delta * speed
pos = Math.max(0, Math.min(pos, target.scrollHeight - frame.clientHeight)) // limit scrolling
if (!moving) update()
}
function normalizeWheelDelta(e) {
if (e.detail) {
if (e.wheelDelta)
return (e.wheelDelta / e.detail / 40) * (e.detail > 0 ? 1 : -1)
// Opera
else return -e.detail / 3 // Firefox
} else return e.wheelDelta / 120 // IE,Safari,Chrome
}
function update() {
moving = true
var delta = (pos - target.scrollTop) / smooth
target.scrollTop += delta
if (Math.abs(delta) > 0.5) requestFrame(update)
else moving = false
}
var requestFrame = (function () {
// requestAnimationFrame cross browser
return (
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function (func) {
window.setTimeout(func, 1000 / 50)
}
)
})()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment