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

移动端菜单点击链接后,如何还原hamburger-react汉堡图标至初始状态?

移动端汉堡菜单点击链接后无法还原图标问题解决

问题描述

已实现点击移动端菜单链接后关闭展开的菜单,但使用hamburger-react包的汉堡图标无法还原为初始条形样式。以下是相关代码:

import React, { useState } from "react";
import "./Navbar.css";
import { Fade as Hamburger } from "hamburger-react";

const Navbar = () => {
  window.addEventListener("scroll", function () {
    const header = document.querySelector(".header");
    header.classList.toggle("active", window.scrollY > 0);
  });
  window.addEventListener("scroll", function () {
    const hamburger = document.querySelector(".hamburger");
    hamburger.classList.toggle("active", window.scrollY > 0);
  });

  const [click, setClick] = useState(false);
  const handleClick = () => setClick(!click);

  const closeMenu = () => setClick(false);

  return (
    <div className="parent">
      <div className="header d__flex justify__content__flex__end pxy__30">
        <ul className={click ? "nav-menu active" : "nav-menu"}>
          <li className="nav__items mx__15">
            <a href="/" onClick={closeMenu}>
              Home
            </a>
          </li>
          <li className="nav__items mx__15">
            <a href="#about" onClick={closeMenu}>
              About
            </a>
          </li>
          <li className="nav__items mx__15">
            <a href="#projects" onClick={closeMenu}>
              Projects
            </a>
          </li>
          <li className="nav__items mx__15">
            <a href="#contact" onClick={closeMenu}>
              Contact
            </a>
          </li>
        </ul>
        <Hamburger
          className="hamburger-react"
          color="white"
          direction="right"
          rounded
          onToggle={handleClick}
        />
      </div>
    </div>
  );
};

export default Navbar;

CSS样式代码

.parent {
  height: 124px;
}

img {
  padding-top: 5px;
}

.nav__items {
  font-size: 18px;
}

.nav-menu {
  display: flex;
  text-transform: uppercase;
  letter-spacing: 1px;
}

.nav-link {
  color: #fff;
}

ul a {
  display: inline-block;
  position: relative;
  padding: 1.5em 0;
}

ul a:hover {
  color: #f9004d;
}

ul a::after {
  content: "";
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 0.2em;
  background-color: #f9004d;
  opacity: 0;
  transition: opacity 300ms, transform 300ms;
}

ul a:hover::after,
ul a:focus::after {
  opacity: 1;
  transform: translate3d(0, 0.2em, 0);
}

/* Scale from center */
ul a::after {
  opacity: 1;
  transform: scale(0);
  transform-origin: center;
}

ul a:hover::after,
ul a:focus::after {
  transform: scale(1);
}

.hamburger-react {
  display: none;
  position: fixed;
  /* top: 3.2rem; */
  top: 1rem;
  right: 2rem;
  transition: 0.4s all ease;
  cursor: pointer;
}

.hamburger-react.active {
  position: fixed;
  /* z-index: 1000; */
  top: 1.5rem;
  right: 2rem;
}

.header {
  transition: 0.4s all ease;
}

.header.active {
  position: fixed;
  z-index: 1;
  width: 100%;
  padding: 0px 30px;
  background-color: #010101;
}

@media only screen and (max-width: 960px) {
  .hamburger-react {
    display: block;
    z-index: 2;
  }

  .nav-menu {
    position: fixed;
    right: -100%;
    flex-direction: column;
    justify-content: center;
    background-color: #010101;
    width: 100%;
    height: 100%;
    text-align: center;
    transition: 0.4s;
    top: 0%;
  }

  .nav-menu.active {
    right: 0;
    z-index: 1;
  }

  .nav__items {
    font-size: 1.5rem;
  }
}

解决方案

问题核心是hamburger-react组件没有和状态变量click绑定,导致closeMenu将click设为false时,组件无法感知状态变化,图标保持打开状态。

只需给<Hamburger>组件添加toggle={click}属性,让组件的开合状态完全由click变量控制:

<Hamburger
  className="hamburger-react"
  color="white"
  direction="right"
  rounded
  toggle={click} // 新增该行代码
  onToggle={handleClick}
/>

修改后,点击菜单链接触发closeMenu设置click=false时,汉堡组件会自动同步状态,将图标还原为初始条形样式。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:50:21