Skip to content

Instantly share code, notes, and snippets.

@tsmd
Last active October 27, 2018 08:34
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 tsmd/dc4346615cdc92c603793589af9e8fde to your computer and use it in GitHub Desktop.
Save tsmd/dc4346615cdc92c603793589af9e8fde to your computer and use it in GitHub Desktop.
FLIP implementation of smooth scrolling https://aerotwist.com/blog/flip-your-animations/
.smooth-scroll {
transition: transform .5s ease-out;
}
var isModifiedEvent = function isModifiedEvent(event) {
return event.ctrlKey || event.shiftKey || event.altKey || event.metaKey
}
var handleClick = function (event) {
if (event.button !== 0 || isModifiedEvent(event)) {
return
}
var body = document.body
var pageXOffset = window.pageXOffset
var pageYOffset = window.pageYOffset
requestAnimationFrame(function () {
var scrollXOffset = window.pageXOffset - pageXOffset
var scrollYOffset = window.pageYOffset - pageYOffset
body.style.transform = 'translate(' + scrollXOffset + 'px, ' + scrollYOffset + 'px)'
requestAnimationFrame(function () {
body.classList.add('smooth-scroll')
body.style.transform = 'translate(0px, 0px)'
})
body.addEventListener('transitionend', function reset(e) {
if (e.target !== body) {
return
}
body.classList.remove('smooth-scroll')
body.style.transform = ''
body.removeEventListener('transitionend', reset)
}, false)
})
}
document.addEventListener('DOMContentLoaded', function () {
document.querySelectorAll('a[href^="#"]').forEach(function (element) {
element.addEventListener('click', handleClick)
})
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment