点击侧边导航栏外部无法关闭的技术问题求助
问题:点击侧边导航栏外部无法关闭导航栏
我尝试实现点击侧边导航栏外部时关闭它,但代码未生效,附上我的代码:
原代码
JavaScript
var sidenav = document.getElementById("mySidenav"); function openNav() { document.getElementById("mySidenav").style.width = "30%"; } function closeNav() { document.getElementById("mySidenav").style.width = "0"; } window.onclick = function(event) { if (event.target == sidenav) { document.getElementById("mySidenav").style.width = "0"; } } window.onclick = function(event) { if (event.target == sidenav) { document.getElementById("mySidenav").style.width = "0"; } }
CSS
*{ border: none; margin: 0; } body{ background-color: pink; padding: 0px 0px 0px 0px; } #container{ display: flex; padding: 0px 0px 0px 0px; } .sidenav { height: 72%; width: 0; position: fixed; z-index: 1; top: 0; right: 0; background-color: #6a6c6d; overflow-x: hidden; transition: 0.5s; padding-top:50px; } .sidenav a { padding: 8px 8px 10px 15px; text-decoration: none; font-size: 16px; color: black ; display: block; transition: 0.3s; } .sidenav a:hover { color: #f1f1f1; } .sidenav .closebtn { position: absolute; top: 0; right: 25px; font-size: 50px; } .sidenav .ptext { padding: 0px 0px 0px 15px; font-size: 16px; color: black; } @media screen and (max-height: 450px) { .sidenav {padding-top: 0px;} .sidenav a {font-size: 60px;} }
HTML
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <div id="mySidenav" class="sidenav"> <a href="javascript:void(0)" class="closebtn" onclick="closeNav()"> ×</a> <a href="#"> Mission</a> <a href="#">Services</a> </div> <div id="header"> <span style="font-size:30px;cursor:pointer" onclick="openNav()">☰Menu</span> </div> <div id="container"> <img class="owl1" src="bookkeepings.png" alt="" width="60" height="auto" alt="A "/> <p></p>Learning JavaScript</p> </div> </body> </html>
问题原因
- 重复绑定事件:两次给
window.onclick赋值,后面的函数会覆盖前面的,导致只有最后一个事件生效(且逻辑本身错误) - 逻辑判断错误:当前代码判断点击目标等于导航栏本身时才关闭,但实际需要点击导航栏外部时触发关闭,即点击元素不是导航栏及其子元素的时候
- HTML语法错误:
<p></p>Learning JavaScript</p>存在多余的闭合标签,导致DOM结构异常
修复后的代码
JavaScript
var sidenav = document.getElementById("mySidenav"); function openNav() { sidenav.style.width = "30%"; // 直接使用已获取的变量,减少重复DOM查询 } function closeNav() { sidenav.style.width = "0"; } window.onclick = function(event) { // 检查点击目标不在导航栏内,且导航栏处于打开状态 if (!sidenav.contains(event.target) && sidenav.style.width !== "0") { closeNav(); } }
HTML(修正语法错误)
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <div id="mySidenav" class="sidenav"> <a href="javascript:void(0)" class="closebtn" onclick="closeNav()"> ×</a> <a href="#"> Mission</a> <a href="#">Services</a> </div> <div id="header"> <span style="font-size:30px;cursor:pointer" onclick="openNav()">☰Menu</span> </div> <div id="container"> <img class="owl1" src="bookkeepings.png" alt="Bookkeeping" width="60" height="auto"/> <p>Learning JavaScript</p> </div> </body> </html>
CSS部分无需修改,保持原代码即可。
修复说明
- 移除重复的
window.onclick绑定,避免事件覆盖 - 使用
element.contains()方法判断点击目标是否属于导航栏子元素,若不属于且导航栏处于打开状态,则调用关闭函数 - 修正HTML中多余的闭合p标签,保证DOM结构正确
- 优化代码:直接使用已获取的
sidenav变量,减少重复DOM查询
内容的提问来源于stack exchange,提问作者Anuraa
相关产品推荐
相关产品推荐

