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

如何让汉堡菜单与遮罩层始终处于页眉下方?

如何让汉堡菜单与遮罩层始终处于页眉下方?

嘿,我仔细扒了你的问题和代码,终于找到症结啦!核心问题出在堆叠上下文和元素层级结构上,给你一步步拆解解决方案:

问题根源

  1. 你的汉堡菜单(.off_screen_menu)是页眉容器(#header_box)的子元素,而#header_box设置了position: relative和z-index: 5000——这会创建一个独立的堆叠上下文。子元素的z-index是相对于父元素的堆叠上下文计算的,所以不管你给菜单设多大的z-index,它都会死死卡在页眉上方(因为它属于页眉的堆叠上下文内部)。
  2. 还有个小bug:你的HTML里<header>标签放在了<body>外面,这不符合规范,容易导致奇怪的渲染问题,得先把它移到<body>里。

具体修复步骤

1. 调整HTML结构

把汉堡菜单从页眉里挪出来,放到<body>中与遮罩层(.overlay)同级的位置,这样它就脱离页眉的堆叠上下文了:

<body>
  <header>
    <div id="header_box">
      <div id="header_1">
        <a href="index.html"><img id="nh_logo" src="assets/img/nh_logo.png" alt="Fancy logo"></a>
        <h1>Noah's Portfolio</h1>
      </div>

      <div id="header_2">
        <nav>
          <div class="ham_menu">
            <span></span>
            <span></span>
            <span></span>
          </div>
        </nav>
      </div>
    </div>
  </header>

  <!-- 把菜单移到这里,和遮罩层同级 -->
  <div class="off_screen_menu">
    <nav>
      <ul>
        <li><a href="index.html">Home</a></li>
        <li><a href="assets/pages/about.html">About Me</a></li>
        <li><a href="assets/pages/resume.html">Resume</a></li>
        <li><a href="assets/pages/contact.html">Contact</a></li>
      </ul>
    </nav>
  </div>

  <main>
    <div class="overlay"></div>
  </main>
</body>

(顺便帮你补全了漏写的<ul>标签,原代码里只有闭合标签哦)

2. 修正CSS的z-index设置

现在菜单和遮罩层都在页眉的外部堆叠上下文里,只要把它们的z-index设得比页眉的5000小就行:

#header_box {
  display: flex;
  width: 100%;
  justify-content: space-around;
  position: relative;
  top: 0;
  z-index: 5000; /* 保持最高层级 */
  border-bottom: 2px solid black;
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
}

.off_screen_menu {
  background-color: white;
  height: 100vh;
  width: 100%;
  max-width: 200px;
  position: fixed;
  top: 0;
  right: -450px;
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: center;
  text-align: center;
  font-size: 3rem;
  transition: right 0.4s ease;
  padding-top: 1.5em;
  z-index: 4999; /* 比页眉小1,确保在下方 */
}

.off_screen_menu.active {
  right: 0;
  /* 这里不需要重复设z-index,继承上面的就行 */
}

.overlay {
  position: fixed;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
  z-index: 4998; /* 比菜单再小一点,在菜单下方 */
  display: none;
  pointer-events: auto;
}

3. 检查JavaScript逻辑

你的JS代码完全不用改!只是调整了菜单的位置,选择器还是.off_screen_menu,事件监听依然有效。

这样调整后,页眉会稳稳待在最上层,汉堡菜单和遮罩层都会乖乖待在它下面啦!赶紧测试一下,应该能解决你头疼好几天的问题😉

备注:内容来源于stack exchange,提问作者Noah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 03:20:32