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

点击侧边导航栏外部无法关闭的技术问题求助

问题:点击侧边导航栏外部无法关闭导航栏

我尝试实现点击侧边导航栏外部时关闭它,但代码未生效,附上我的代码:

原代码

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()"> &times;</a>
  <a href="#">  Mission</a>
  <a href="#">Services</a> 
</div>

<div id="header">
  <span style="font-size:30px;cursor:pointer" onclick="openNav()">&#9776;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> 

问题原因

  1. 重复绑定事件:两次给window.onclick赋值,后面的函数会覆盖前面的,导致只有最后一个事件生效(且逻辑本身错误)
  2. 逻辑判断错误:当前代码判断点击目标等于导航栏本身时才关闭,但实际需要点击导航栏外部时触发关闭,即点击元素不是导航栏及其子元素的时候
  3. 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()"> &times;</a>
  <a href="#">  Mission</a>
  <a href="#">Services</a> 
</div>

<div id="header">
  <span style="font-size:30px;cursor:pointer" onclick="openNav()">&#9776;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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:01:20