You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用React.js实现上滚显示Navbar、下滚隐藏导航栏效果

实现方案

核心思路是新增变量记录上一次的滚动位置,每次滚动时对比当前滚动位置和上次位置,判断滚动方向,再结合滚动距离阈值控制Header显隐。我们用useRef存储上一次滚动位置,避免频繁更新状态导致不必要的组件重渲染。

修改后的Navbar完整代码

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

const Navbar = () => {
  const [show, setShow] = useState(false);
  // 用useRef存储上一次滚动位置,不会触发组件重渲染
  const lastScrollY = useRef(0);

  const controlNavbar = () => {
    const currentScrollY = window.scrollY;
    
    // 滚动距离小于250px时始终显示Header,和原有逻辑保持一致
    if (currentScrollY <= 250) {
      setShow(false);
      lastScrollY.current = currentScrollY;
      return;
    }

    // 向下滚动:当前位置大于上次位置,隐藏Header
    if (currentScrollY > lastScrollY.current) {
      setShow(true);
    } 
    // 向上滚动:当前位置小于上次位置,显示Header
    else {
      setShow(false);
    }

    // 更新上次滚动位置记录
    lastScrollY.current = currentScrollY;
  };

  useEffect(() => {
    window.addEventListener('scroll', controlNavbar);
    return () => {
      window.removeEventListener('scroll', controlNavbar);
    };
  }, []);

  // 原有Header渲染逻辑无需修改
  return (
    <header className={`active ${show && 'hidden'}`}></header>
  );
};

额外说明

你原来的Header部分代码和CSS样式不需要做任何调整,可直接复用。
如果想避免页面微小滚动就触发Header显隐的抖动问题,可以给滚动差值加个阈值判断,比如只有滚动超过10px才切换状态,修改滚动方向判断逻辑即可:

// 向下滚动且差值超过10px才隐藏
if (currentScrollY - lastScrollY.current > 10) {
  setShow(true);
} 
// 向上滚动且差值超过10px才显示
else if (lastScrollY.current - currentScrollY > 10) {
  setShow(false);
}

内容的提问来源于stack exchange,提问作者Saeed Ghezel Arsalan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:45:03