'Make tailwindcss navbar component close on scroll
I have been trying to make this tailwind navbar component for react (code obtained from site) close on scroll for mobile view but am not been able to make it work.=>>> codesandbox link
I tried implementing the following code obtained from another thread but its still not working. Someone please help.
import React, { useState, useEffect } from 'react';
const Navbar = () => {
const [show, setShow] = useState(true);
const [lastScrollY, setLastScrollY] = useState(0);
const controlNavbar = () => {
if (typeof window !== 'undefined') {
if (window.scrollY > lastScrollY) { // if scroll down hide the navbar
setShow(false);
} else { // if scroll up show the navbar
setShow(true);
}
// remember current page location to use in the next move
setLastScrollY(window.scrollY);
}
};
useEffect(() => {
if (typeof window !== 'undefined') {
window.addEventListener('scroll', controlNavbar);
// cleanup function
return () => {
window.removeEventListener('scroll', controlNavbar);
};
}
}, [lastScrollY]);
return (
<nav className={`active ${show && 'hidden'}`}>
....
</nav>
);
};
Solution 1:[1]
You don't need the setShow(true) in the controlNavbar function. Otherwise you just keep re-opening the navbar for no reason.
const controlNavbar = () => {
if (typeof window !== 'undefined') {
if (window.scrollY > lastScrollY) { // if scroll down hide the navbar
setShow(false);
} else {
setShow(true);
// ^^^^^^^^^^^^^^ Remove this line
}
// remember current page location to use in the next move
setLastScrollY(window.scrollY);
}
};
And it's better to follow the eslint exhaustive-deps rules. So the code will be refactored to:
const controlNavbar = useCallback(() => {
if (typeof window !== 'undefined') {
if (window.scrollY > lastScrollY) {
// if scroll down hide the navbar
setIsOpen(false);
}
// remember current page location to use in the next move
setLastScrollY(window.scrollY);
}
}, [lastScrollY]);
useEffect(() => {
if (typeof window !== 'undefined') {
window.addEventListener('scroll', controlNavbar);
// cleanup function
return () => {
window.removeEventListener('scroll', controlNavbar);
};
}
}, [controlNavbar]);
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | CodinCat |
