移动端Navbar点击无响应求助:无法正常展开/收起
问题说明
开发HTML网站时,移动端视图下Navbar点击后无响应,无法正常展开或收起,需要实现点击Navbar可展开、再次点击可收起的功能。
用户提供代码
HTML代码
<!-- ======= Header ======= --> <header id="header" class="d-flex align-items-center"> <div class="container d-flex align-items-center justify-content-between"> <img src="assets/img/logo.jpg" class="" alt=""> <h1 class="logo"><a href="index.html">...</a></h1> <!-- Uncomment below if you prefer to use an image logo --> <!-- <a href="index.html" class="logo"><img src="assets/img/logo.png" alt=""></a>--> <nav id="navbar" class="navbar"> <ul> <li><a class="nav-link scrollto active" href="index.html">Home</a></li> <li><a class="nav-link scrollto" href="#about">About</a></li> <li><a class="nav-link scrollto" href="service.html">Services</a></li> <li><a class="nav-link scrollto " href="portfolio.html">Portfolio</a></li> <li><a class="nav-link scrollto" href="team.html">Team</a></li> <li><a class="nav-link scrollto" href="contact.html">Contact</a></li> </ul> <i class="bi bi-list mobile-nav-toggle"></i> </nav><!-- .navbar --> </div> </header><!-- End Header -->
CSS代码
/*-------------------------------------------------------------- # Navigation Menu --------------------------------------------------------------*/ /** * Desktop Navigation */ .navbar { padding: 0; } .navbar ul { margin: 0; padding: 0; display: flex; list-style: none; align-items: center; } .navbar li { position: relative; } .navbar>ul>li { white-space: nowrap; padding: 10px 0 10px 28px; } .navbar a, .navbar a:focus { display: flex; align-items: center; justify-content: space-between; padding: 0 3px; font-size: 15px; font-weight: 600; color: #222222; white-space: nowrap; transition: 0.3s; position: relative; } .navbar a i, .navbar a:focus i { font-size: 12px; line-height: 0; margin-left: 5px; } .navbar>ul>li>a:before { content: ""; position: absolute; width: 100%; height: 2px; bottom: -6px; left: 0; background-color: #106eea; visibility: hidden; width: 0px; transition: all 0.3s ease-in-out 0s; } .navbar a:hover:before, .navbar li:hover>a:before, .navbar .active:before { visibility: visible; width: 100%; } .navbar a:hover, .navbar .active, .navbar .active:focus, .navbar li:hover>a { color: #106eea; } .navbar .dropdown ul { display: block; position: absolute; left: 28px; top: calc(100% + 30px); margin: 0; padding: 10px 0; z-index: 99; opacity: 0; visibility: hidden; background: #fff; box-shadow: 0px 0px 30px rgba(127, 137, 161, 0.25); transition: 0.3s; } .navbar .dropdown ul li { min-width: 200px; } .navbar .dropdown ul a { padding: 10px 20px; font-weight: 400; } .navbar .dropdown ul a i { font-size: 12px; } .navbar .dropdown ul a:hover, .navbar .dropdown ul .active:hover, .navbar .dropdown ul li:hover>a { color: #106eea; } .navbar .dropdown:hover>ul { opacity: 1; top: 100%; visibility: visible; } .navbar .dropdown .dropdown ul { top: 0; left: calc(100% - 30px); visibility: hidden; } .navbar .dropdown .dropdown:hover>ul { opacity: 1; top: 0; left: 100%; visibility: visible; } @media (max-width: 1366px) { .navbar .dropdown .dropdown ul { left: -90%; } .navbar .dropdown .dropdown:hover>ul { left: -100%; } } /** * Mobile Navigation */ .mobile-nav-toggle { color: #222222; font-size: 28px; cursor: pointer; display: none; line-height: 0; transition: 0.5s; } .mobile-nav-toggle.bi-x { color: #fff; } @media (max-width: 991px) { .mobile-nav-toggle { display: block; } .navbar ul { display: none; } } .navbar-mobile { position: fixed; overflow: hidden; top: 0; right: 0; left: 0; bottom: 0; background: rgba(9, 9, 9, 0.9); transition: 0.3s; z-index: 999; } .navbar-mobile .mobile-nav-toggle { position: absolute; top: 15px; right: 15px; } .navbar-mobile ul { display: block; position: absolute; top: 55px; right: 15px; bottom: 15px; left: 15px; padding: 10px 0; background-color: #fff; overflow-y: auto; transition: 0.3s; } .navbar-mobile a, .navbar-mobile a:focus { padding: 10px 20px; font-size: 15px; color: #222222; } .navbar-mobile>ul>li { padding: 0; } .navbar-mobile a:hover:before, .navbar-mobile li:hover>a:before, .navbar-mobile .active:before { visibility: hidden; } .navbar-mobile a:hover, .navbar-mobile .active, .navbar-mobile li:hover>a { color: #106eea; } .navbar-mobile .getstarted, .navbar-mobile .getstarted:focus { margin: 15px; } .navbar-mobile .dropdown ul { position: static; display: none; margin: 10px 20px; padding: 10px 0; z-index: 99; opacity: 1; visibility: visible; background: #fff; box-shadow: 0px 0px 30px rgba(127, 137, 161, 0.25); } .navbar-mobile .dropdown ul li { min-width: 200px; } .navbar-mobile .dropdown ul a { padding: 10px 20px; } .navbar-mobile .dropdown ul a i { font-size: 12px; } .navbar-mobile .dropdown ul a:hover, .navbar-mobile .dropdown ul .active:hover, .navbar-mobile .dropdown ul li:hover>a { color: #106eea; } .navbar-mobile .dropdown>.dropdown-active { display: block; } .navbar-mobile a:hover:before, .navbar-mobile li:hover>a:before, .navbar-mobile .active:before { visibility: hidden; } .navbar-mobile a:hover, .navbar-mobile .active, .navbar-mobile li:hover>a { color: #106eea; } .navbar-mobile .getstarted, .navbar-mobile .getstarted:focus { margin: 15px; } .navbar-mobile .dropdown ul { position: static; display: none; margin: 10px 20px; padding: 10px 0; z-index: 99; opacity: 1; visibility: visible; background: #fff; box-shadow: 0px 0px 30px rgba(127, 137, 161, 0.25); } .navbar-mobile .dropdown ul li { min-width: 200px; } .navbar-mobile .dropdown ul a { padding: 10px 20px; } .navbar-mobile .dropdown ul a i { font-size: 12px; } .navbar-mobile .dropdown ul a:hover, .navbar-mobile .dropdown ul .active:hover, .navbar-mobile .dropdown ul li:hover>a { color: #106eea; } .navbar-mobile .dropdown>.dropdown-active { display: block; }
修复方案
1. 添加JavaScript交互逻辑
问题核心是缺少触发样式切换的JS代码,CSS已定义移动端导航的显示样式,但没有代码控制.navbar-mobile类的添加/移除。在页面底部</body>标签前插入以下代码:
document.addEventListener('DOMContentLoaded', function() { const mobileNavToggle = document.querySelector('.mobile-nav-toggle'); const navbar = document.getElementById('navbar'); if (mobileNavToggle && navbar) { // 点击切换导航展开/收起 mobileNavToggle.addEventListener('click', function() { navbar.classList.toggle('navbar-mobile'); // 切换图标(列表/叉号) this.classList.toggle('bi-list'); this.classList.toggle('bi-x'); }); // 点击导航链接自动收起菜单 const navLinks = navbar.querySelectorAll('.nav-link'); navLinks.forEach(link => { link.addEventListener('click', function() { if (navbar.classList.contains('navbar-mobile')) { navbar.classList.remove('navbar-mobile'); mobileNavToggle.classList.add('bi-list'); mobileNavToggle.classList.remove('bi-x'); } }); }); } });
2. 清理重复CSS代码
提供的CSS中重复定义了.navbar-mobile相关样式,需删除重复部分,仅保留一份,避免样式冲突导致的异常。
3. 验证Bootstrap Icons引入
确保页面<head>中已引入Bootstrap Icons,否则bi-list和bi-x图标无法显示:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.0/font/bootstrap-icons.css">
内容的提问来源于stack exchange,提问作者richie
相关产品推荐
相关产品推荐

