如何让汉堡菜单与遮罩层始终处于页眉下方?
如何让汉堡菜单与遮罩层始终处于页眉下方?
嘿,我仔细扒了你的问题和代码,终于找到症结啦!核心问题出在堆叠上下文和元素层级结构上,给你一步步拆解解决方案:
问题根源
- 你的汉堡菜单(
.off_screen_menu)是页眉容器(#header_box)的子元素,而#header_box设置了position: relative和z-index: 5000——这会创建一个独立的堆叠上下文。子元素的z-index是相对于父元素的堆叠上下文计算的,所以不管你给菜单设多大的z-index,它都会死死卡在页眉上方(因为它属于页眉的堆叠上下文内部)。 - 还有个小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
相关产品推荐
相关产品推荐

