Skip to content

Instantly share code, notes, and snippets.

@marco-souza
Last active December 26, 2019 17:59
Show Gist options
  • Save marco-souza/3574211a79a1ce195a2965e0c3dcf36f to your computer and use it in GitHub Desktop.
Save marco-souza/3574211a79a1ce195a2965e0c3dcf36f to your computer and use it in GitHub Desktop.
handle window scroll
const Comp = (props) => {
const myRef = useRef()
const [activeState, setActiveState] = useState(false)
const callbackTrue = () => {
// define callback
setActiveState(true)
}
const callbackFalse = () => {
// define callback
setActiveState(false)
}
useScrollInRange(myRef.current, callbackTrue, callbackFalse)
return (
...
)
}
function scrollHandler(element, callback = () => console.log('mark'), callbackError = () => ()) {
return ev => {
const PAGE_SIZE = element.clientHeight
const windowPosition = window.scrollY
const elementPosition = element.offsetTop
(
elementPosition + PAGE_SIZE >= windowPosition &&
elementPosition <= windowPosition
)
? callback() // TODO: mark element
: callbackError()
}
}
const elementList = document.querySelector('navbar a')
Array.from(elementList)
.map(el => (
window.addEventListener('scroll', scrollHandler(el))
))
const useScrollInRange = (element, callbackTrue, callbackFalse) => {
useEffect(() => {
let eventListener
if (element) {
eventListener = window.addEventListener('scroll', scrollHandler(element, callbackTrue, callbackFalse))
}
return () => window.removeEventListener(eventListener)
}, [element])
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment