响应式hamburger按钮窗口缩小时不显示,报TypeError错误求助
问题分析与修复
你遇到的汉堡按钮不显示、控制台报错Uncaught TypeError: Cannot read properties of null (reading 'addEventListener')的问题,核心是类名拼写错误和选择器使用错误,具体如下:
错误点1:JS中的类名拼写错误
JS代码里写的是:
const hamburger = document.querySelector(".hambuger");
这里类名少了一个r,正确类名应为.hamburger(和HTML里的class="hamburger"对应)。因为获取不到DOM元素,调用addEventListener时就会抛出空值错误。
错误点2:CSS媒体查询中的类名拼写错误
媒体查询里的这段代码:
@media (max-width: 768px) { .hanburger { display: block; } /* ... */ }
这里的.hanburger少了一个m,应该是.hamburger,导致窗口缩小后按钮依然保持display: none,无法显示。
错误点3:JS中的选择器缺少类前缀
这段代码里的选择器没有加.:
document.querySelectorAll("nav-link").forEach((n) => { // ... })
正确写法是.nav-link,否则无法选中页面上的导航链接元素。
错误点4:CSS中的目标元素错误
媒体查询最后一行:
.nav-item.active { left: 0; }
你要控制的是导航菜单的显示,应该是.nav-menu.active,而不是.nav-item.active,否则菜单不会从左侧滑入。
修正后的完整代码
JavaScript
const hamburger = document.querySelector(".hamburger"); const navMenu = document.querySelector(".nav-menu"); hamburger.addEventListener("click", () => { hamburger.classList.toggle("active"); navMenu.classList.toggle("active"); }); document.querySelectorAll(".nav-link").forEach((n) => n.addEventListener("click", () => { hamburger.classList.remove("active"); navMenu.classList.remove("active"); }) );
CSS
* { padding: 0; margin: 0; box-sizing: border-box; } header { background-color: #262626; } li { list-style: none; } a { color: white; text-decoration: none; } .navbar { min-height: 70px; display: flex; justify-content: space-between; align-items: center; padding: 0 24px; } .nav-menu { display: flex; justify-content: space-between; align-items: center; gap: 60px; } .nav-branding { font-size: 2rem; } .nav-link { transition: 0.7s ease; } .nav-link:hover { color: dodgerblue; } .hamburger { display: none; cursor: pointer; } .bar { display: block; width: 25px; height: 3px; margin: 5px auto; -webkit-transition: all 0.3s ease-in-out; transition: all 0.3s ease-in-out; background-color: white; } @media (max-width: 768px) { .hamburger { display: block; } .hamburger.active .bar:nth-child(2) { opacity: 0; } .hamburger.active .bar:nth-child(1) { transform: translateY(8px) rotate(45deg); } .hamburger.active .bar:nth-child(3) { transform: translateY(-8px) rotate(-45deg); } .nav-menu { position: fixed; left: -100%; top: 70px; gap: 0; flex-direction: column; background-color: #262626; width: 100%; text-align: center; transition: 0.3s; } .nav-item { margin: 16px 0; } .nav-menu.active { left: 0; } }
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" /> <link rel="stylesheet" href="style.css" /> <title>document</title> </head> <body> <header> <nav class="navbar"> <a href="#" class="nav-branding">DEV.</a> <ul class="nav-menu"> <li class="nav-item"> <a href="#" class="nav-link">Home</a> </li> <li class="nav-item"> <a href="#" class="nav-link">About</a> </li> <li class="nav-item"> <a href="#" class="nav-link">Contact</a> </li> </ul> <div class="hamburger"> <span class="bar"></span> <span class="bar"></span> <span class="bar"></span> </div> </nav> </header> <script src="script.js"></script> </body> </html>
内容的提问来源于stack exchange,提问作者Hamouda Elyes
相关产品推荐
相关产品推荐

