如何在滚动时显示或隐藏导航栏使用react.js?

Sae*_*lan 15 javascript scroll reactjs react-hooks use-state

我使用了带有useState和useEffect的react.js Hooks,当我向下滚动并且屏幕向下时,标题在250像素后隐藏。现在我想知道如何在向上滚动时使用 React Hooks 显示标题。

const Navbar = () => {
  const [show, setShow] = useState(false)
  const controlNavbar = () => {
      if (window.scrollY > 250 ) {
          setShow(true)
      }else{
        setShow(false)
      }
  }

  useEffect(() => {
      window.addEventListener('scroll', controlNavbar)
      return () => {
          window.removeEventListener('scroll', controlNavbar)
      }
  }, [])
Run Code Online (Sandbox Code Playgroud)

和标题:

 <header className={`active ${show && 'hidden'}`}></header>
Run Code Online (Sandbox Code Playgroud)

CSS:

.active{
    height: 4rem;
    width: 100%;
    position: fixed;
    top: 0px;
    transition: 0.3s linear;
    display: flex;
    justify-content:stretch;
    align-items: center;
    background-color: #FFFFFF;
    border-bottom: 1px solid rgba(0, 0, 0, .1);
    z-index: 40;
    box-shadow: 0 2px 5px -1px rgba(0, 0, 0, .08);
    /* padding: 0 7%; */
}
.hidden{
    height: 4rem;
    width: 100%;
    z-index: 40;
    border-bottom: 1px solid rgba(0, 0, 0, .1);
    box-shadow: 0 2px 5px -1px rgba(0, 0, 0, .08);
    position: fixed;
    top: -80px;
    transition: 0.3s linear;

}
Run Code Online (Sandbox Code Playgroud)

Had*_*umi 23

您需要对上一个滚动执行动态检查,而不是使用静态值 (250)。这是我的完整解决方案(使用 nextJS):

import React, { useState, useEffect } from 'react';

const Navbar = () => {
  const [show, setShow] = useState(true);
  const [lastScrollY, setLastScrollY] = useState(0);

  const controlNavbar = () => {
    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(() => {
    window.addEventListener('scroll', controlNavbar);

    // cleanup function
    return () => {
       window.removeEventListener('scroll', controlNavbar);
    };
  }, [lastScrollY]);

  return (
        <nav className={`active ${show && 'hidden'}`}>
        ....
        </nav>
  );
};

export default Navbar;
Run Code Online (Sandbox Code Playgroud)


小智 7

使用tailwindCSS最简单的答案

import React, {useState, useEffect} from 'react'

const Navbar = () => {

const [prevScrollPos, setPrevScrollPos] = useState(0);
const [visible, setVisible] = useState(true)

const handleScroll = () => {
    const currentScrollPos = window.scrollY

    if(currentScrollPos > prevScrollPos){
        setVisible(false)
    }else{
        setVisible(true)
    }

    setPrevScrollPos(currentScrollPos)
}

useEffect( () => {
    window.addEventListener('scroll', handleScroll);

    return () => window.removeEventListener('scroll', handleScroll)
})

return (
    <div className={`bg-slate-700 h-14 sticky ${visible ? 'top-0' : ''} `}>
        Some Company Name
    </div>
)
}

export default Navbar
Run Code Online (Sandbox Code Playgroud)


小智 0

从这里的几次搜索中,我偶然发现了原始js上的滚动函数,但你可以在你的情况下实现它并按照你想要的方式调整它,因为目前你的函数只会在scrollY < 250时使用 false ...

在您的 controlNav 函数上创建一个变量,该变量将跟踪上一个滚动的位置/点,然后将其与滚动的当前值进行比较。它看起来像这样:

     const controlNavbar = () => {
      if (window.scrollY >= this.lastScroll ) {
          setShow(true)
      }else{
        setShow(false)
      }
    this.lastScroll = window.scrollY;


  }
Run Code Online (Sandbox Code Playgroud)

注意这仅适用于向上滚动和向下滚动,没有最小值。

引用原始js