JavaScript实现汉堡菜单点击切换显隐失效无报错求助
问题背景
开发目标为使用JavaScript实现简易汉堡菜单交互功能,为前端初学者的第一个JavaScript项目。
最初版本代码点击汉堡图标可正常唤起菜单,在新增「再次点击隐藏菜单」的切换逻辑后功能完全失效,控制台无任何错误输出。
原始问题代码
JavaScript 部分
var menu = document.getElementById('navId'); var hamburgerIcon = document.getElementsByClassName('fa-bars')[0]; var showMenuIs = false; function showMenu() { if (showMenuIs == false) { hamburgerIcon.addEventListener('click', function() { menu.classList.add("showMenu"); let showMenu = true; }) } else { hamburgerIcon.addEventListener('click', function() { menu.classList.add("navId"); let showMenu = false; }) } }
CSS 部分
* { margin: 0; padding: 0; } .fa-bars { color: white; padding-left: 50%; display: absolute; font-size: 5.7vh; cursor: pointer; } #main-header { width: 100%; height: 5vh; background-color: black; } .navId { background-color: black; height: 7.2vh; display: none; justify-content: center; } nav i { color: white; font-size: 40px; padding: 15px; } .showMenu { color: white; background-color: black; height: 7.2vh; display: flex; justify-content: center; transition: 1s; } @media only screen and (min-width: 600px) { .fa-bars { display: none; } nav { float: right; } }
HTML 部分
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://kit.fontawesome.com/884fc3b032.js" crossorigin="anonymous"></script> <link rel="stylesheet" href="style.css"> <title>Document</title> </head> <body> <div id="main"> <div id="main-header"> <i class="fa-solid fa-bars"></i> </div> <div id="main-menu"> <nav class="navId"> <i class="fa-brands fa-facebook"><a href=""></a></i> <i class="fa-brands fa-twitter"><a href=""></a></i> <i class="fa-brands fa-youtube"><a href=""></a></i> <i class="fa-brands fa-instagram"><a href=""></a></i> </nav> </div> </div> <script src="js.js"></script> </body> </html>
错误原因
- DOM获取失效:HTML中导航栏标签仅设置了
class="navId",未设置对应id="navId",导致document.getElementById('navId')获取到的值为null,后续操作菜单类名的逻辑全部无效 - 函数未调用:代码中定义了
showMenu()函数但从未执行,绑定点击事件的逻辑根本没有运行 - 事件绑定逻辑错误:不需要在每次判断状态后重复绑定点击事件,仅需在页面加载完成后绑定一次点击事件,在点击回调内部判断/切换菜单状态即可
- 状态变量修改错误:点击回调中用
let声明了和外层状态变量同名的局部变量,点击时修改的是局部变量,外层用来记录菜单显示状态的showMenuIs永远停在初始值false - 类名操作逻辑错误:隐藏菜单时错误地给元素添加本身就存在的
navId类,没有移除控制显示的showMenu类,根本无法触发隐藏效果 - CSS笔误:
.fa-bars样式中写了display: absolute,absolute是position属性的合法值,display属性不存在该值,属于无效样式
修复方案
- 先给HTML里的导航栏标签补上
id="navId",保证能正常获取到DOM元素 - 修正CSS笔误,把
.fa-bars里的display: absolute改成position: absolute - 简化JS逻辑:仅绑定一次点击事件,每次点击时翻转菜单状态,通过
classList.toggle自动完成显示类的添加/移除,不需要写复杂的if判断
修复后的JS代码如下:
// 获取DOM元素 const menu = document.getElementById('navId'); const hamburgerIcon = document.querySelector('.fa-bars'); let isMenuShow = false; // 页面加载后直接绑定一次点击事件即可 hamburgerIcon.addEventListener('click', function() { // 每次点击翻转显示状态 isMenuShow = !isMenuShow; // 状态为true时添加showMenu类显示菜单,为false时移除该类隐藏菜单 menu.classList.toggle('showMenu', isMenuShow); })
内容的提问来源于stack exchange,提问作者Blocaj
相关产品推荐
相关产品推荐

