#javascript #reactjs
#javascript #reactjs
Вопрос:
Я пытаюсь создать фиксированную верхнюю панель навигации, которая находится под заголовком, при прокрутке. Дело в том, что в моем проекте я не знаю, насколько высокой будет моя панель навигации, поэтому я не могу ее жестко запрограммировать. Я сделал это:
const [isFixed, setIsFixed] = useState(false);
const categoriesRef = useRef(null);
const categoriesFixed = () => {
if (window.pageYOffset > categoriesRef.current.offsetTop) setIsFixed(true);
else setIsFixed(false);
};
useEffect(() => {
window.addEventListener('scroll', categoriesFixed);
return () => {
window.removeEventListener('scroll', categoriesFixed);
};
}, []);
return (
<div className="categories py-4">
<div className="container-fluid">
<nav ref={categoriesRef} className={`categories-nav border ${isFixed amp;amp; 'fixed-categories'}`}>
<div className="categories-container">
</div>
</nav>
</div>
</div>
);
Это работает при прокрутке вниз, но при прокрутке вверх панель навигации исправлена, поэтому моя функция не получает значение offsetTop из categoriesRef.current.offsetTop и перестает исправляться только при прокрутке только до верха окна. Есть ли способ сделать это правильно?
Комментарии:
1. Если «IE» не обязательно должен поддерживаться, вы можете проверить css
position: sticky
, он намного проще в использовании. В противном случае вы должны использовать не навигационную «offsettop», а вычисленную высоту панели навигации (с getBoundingRect из заголовка). Если вы все еще хотите использовать offsetTop, вы все равно можете сохранить его в состоянии и использовать вместо него сохраненное значение.2. Вы могли бы добавить некоторое дополнительное верхнее смещение к
navbar
верхнему смещению:if (window.pageYOffset > categoriesRef.current.offsetTop 50) setIsFixed(true)
;