讲师中心 微信公众号
AI工具推荐 视频效率加速

实现可点击菜单项自动关闭的响应式导航栏

夜宇同学_1130

夜宇同学_1130

发布时间:2025-11-22 12:15:00

|

253人浏览过

|

来源于php中文网

原创

实现可点击菜单项自动关闭的响应式导航栏

本教程详细介绍了如何优化响应式导航栏的用户体验,使其在移动端展开后,用户点击任意菜单项时能够自动收起。通过调整javascript事件监听器并结合css样式控制,我们将展示如何实现这一功能,从而提升导航栏的直观性和易用性。

在现代Web开发中,响应式导航栏是不可或缺的组件。尤其是在移动设备上,当导航菜单展开后,用户通常期望在点击某个菜单项跳转页面或执行操作后,菜单能够自动收起,而不是停留在展开状态。这不仅能节省屏幕空间,还能提供更流畅的用户体验。本教程将指导您如何实现这一常见且重要的功能。

核心思路

要实现点击菜单项后自动关闭导航栏,关键在于将事件监听器从仅监听切换按钮(toggle button)扩展到监听整个菜单容器。当用户点击菜单容器内的任何元素(包括菜单项)时,我们都触发菜单的切换状态,从而实现关闭效果。

HTML 结构

首先,我们需要一个标准的导航栏HTML结构。其中包含一个主菜单容器(ul.menu)和用于在移动端切换菜单可见性的切换按钮(li.toggle)。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>响应式导航栏</title>
    <!-- 引入Font Awesome图标库 -->
    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css" rel="stylesheet"/>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <nav id="navbar">
        <ul class="menu">
            <li class="logo"><a href="#"><img src="img/LOGO JS BLANCO PNG.png" alt="Logo"></a></li>
            <li class="item"><a href="#home">首页</a></li>
            <li class="item"><a href="#about">关于</a></li>
            <li class="item"><a href="#portfolio">作品集</a></li>
            <li class="item"><a href="#knowledge">知识</a></li>
            <li class="item"><a href="#experience">经验</a></li>
            <li class="item"><a href="#contact">联系</a></li>
            <li class="toggle"><a href="#nowhere"><i class="fas fa-bars"></i></a></li>
        </ul>
    </nav>

    <!-- 页面内容,用于滚动定位 -->
    <section id="home" style="height: 800px; background-color: #f0f0f0; padding-top: 60px;"><h1>首页</h1></section>
    <section id="about" style="height: 800px; background-color: #e0e0e0; padding-top: 60px;"><h1>关于</h1></section>
    <section id="portfolio" style="height: 800px; background-color: #d0d0d0; padding-top: 60px;"><h1>作品集</h1></section>
    <section id="knowledge" style="height: 800px; background-color: #c0c0c0; padding-top: 60px;"><h1>知识</h1></section>
    <section id="experience" style="height: 800px; background-color: #b0b0b0; padding-top: 60px;"><h1>经验</h1></section>
    <section id="contact" style="height: 800px; background-color: #a0a0a0; padding-top: 60px;"><h1>联系</h1></section>

    <script src="script.js"></script>
</body>
</html>

CSS 样式

CSS负责控制导航菜单的初始状态和激活状态下的显示效果。在默认情况下,菜单项(.item)是隐藏的,只有当菜单容器(.menu)被添加了active类时,菜单项才显示出来。

/* style.css */
body {
    margin: 0;
    font-family: sans-serif;
}

#navbar {
    background-color: #333;
    padding: 10px 20px;
    position: fixed;
    width: 100%;
    top: 0;
    left: 0;
    z-index: 1000;
    box-sizing: border-box; /* 确保内边距不增加宽度 */
}

#navbar .menu {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap; /* 允许项目换行 */
}

#navbar .logo img {
    height: 40px; /* 调整logo大小 */
    vertical-align: middle;
}

#navbar .item a,
#navbar .toggle a {
    display: block;
    padding: 15px;
    color: white;
    text-decoration: none;
    text-align: center;
}

#navbar .item a:hover,
#navbar .toggle a:hover {
    background-color: #575757;
}

/* 默认情况下,在移动端隐藏菜单项和显示切换按钮 */
#navbar .item {
    display: none; /* 移动端默认隐藏 */
    width: 100%; /* 菜单项独占一行 */
    text-align: center;
}

#navbar .toggle {
    order: 1; /* 切换按钮排在最后 */
    margin-left: auto; /* 将切换按钮推到最右边 */
}

/* 当菜单处于激活状态时,显示菜单项 */
#navbar .menu.active .item {
    display: block; /* 移动端激活时显示 */
}

/* 隐藏切换按钮图标,因为在JS中会动态切换 */
#navbar .toggle .fas {
    font-size: 24px;
}

/* 桌面端样式 */
@media (min-width: 768px) {
    #navbar .menu {
        flex-wrap: nowrap; /* 阻止项目换行 */
    }

    #navbar .item {
        display: block; /* 桌面端默认显示 */
        width: auto; /* 恢复自动宽度 */
    }

    #navbar .toggle {
        display: none; /* 桌面端隐藏切换按钮 */
    }

    #navbar .logo {
        margin-right: auto; /* 将logo推到最左边,其他项靠右 */
    }
}

JavaScript 实现

关键的JavaScript逻辑在于toggleMenu函数和事件监听器的绑定。

  1. toggleMenu 函数: 这个函数负责切换菜单的active类,并更新切换按钮的图标(从汉堡包图标切换到关闭图标,反之亦然)。使用classList.toggle方法可以简洁地实现添加/移除类名。
  2. 事件监听器: 最重要的改变是将事件监听器从原来的toggle元素(切换按钮)绑定到整个menu容器。这意味着无论是点击切换按钮、菜单项还是菜单内的其他空白区域,只要点击发生在menu容器内,都会触发toggleMenu函数。
// script.js
const toggle = document.querySelector(".toggle");
const menu = document.querySelector(".menu");

/* 切换移动端菜单状态 */
function toggleMenu() {
  // 切换菜单容器的'active'类
  menu.classList.toggle("active");

  // 获取切换按钮中的图标元素
  const icon = toggle.querySelector("a i.fas");

  // 切换图标的类:'fa-bars' (汉堡包) 和 'fa-times' (关闭)
  icon.classList.toggle('fa-bars');
  icon.classList.toggle('fa-times');
}

/* 事件监听器 */
// 将点击事件监听器绑定到整个菜单容器
// 这样,点击菜单内的任何元素(包括菜单项)都会触发toggleMenu
menu.addEventListener("click", toggleMenu, false);

// 注意:原代码中的keypress事件监听器和toggleItem函数未定义,
// 且与点击关闭菜单的需求不符,此处已移除。
// 如果需要更精细的控制(例如,只有点击特定菜单项才关闭),
// 可以检查event.target来判断点击的是哪个元素。

完整示例代码

将上述HTML、CSS和JavaScript代码分别保存为index.html、style.css和script.js文件,并确保图片路径正确,即可运行查看效果。

注意事项与优化

  1. 事件委托的优势: 将事件监听器绑定到父元素menu而不是每个单独的item,这是一种事件委托(Event Delegation)的实践。它的好处是:

    • 性能优化: 只需要一个监听器,而不是为每个菜单项创建多个监听器,减少了内存消耗。
    • 动态内容: 如果菜单项是动态添加的,无需重新绑定事件。
    • 简化逻辑: 避免了遍历所有菜单项并分别添加监听器的复杂性。
  2. 用户体验: 这种设计极大地提升了移动端用户的体验,使得导航操作更加直观和便捷。用户不再需要先点击菜单项,再手动点击切换按钮来关闭菜单。

  3. 点击范围: 当前的实现是点击ul.menu内的任何地方都会触发菜单切换。这意味着点击Logo、切换按钮本身,或者菜单项都会切换菜单状态。这通常是期望的行为,但如果需要更精细的控制(例如,只有点击a标签才关闭,点击Logo不关闭),则需要在toggleMenu函数中检查event.target来判断点击的具体元素。

    function toggleMenu(event) {
        // 阻止事件冒泡,防止在某些复杂场景下意外触发
        // event.stopPropagation(); 
    
        // 如果点击的是logo或切换按钮,则继续切换菜单
        // 如果点击的是菜单项(<a>标签),也切换菜单
        // 如果点击的是其他非交互区域,可以根据需求选择是否切换
        // 这里的解决方案是只要点击在menu内部就切换,因此不需要event.target判断
    
        menu.classList.toggle("active");
        const icon = toggle.querySelector("a i.fas");
        icon.classList.toggle('fa-bars');
        icon.classList.toggle('fa-times');
    }
  4. 无障碍性(Accessibility): 为了提供更好的无障碍体验,建议为切换按钮添加aria-expanded和aria-controls等ARIA属性,并在JavaScript中动态更新它们,以告知屏幕阅读器菜单的当前状态。

总结

通过简单的JavaScript事件监听器调整和配合CSS样式,我们成功地实现了一个在点击菜单项后能够自动关闭的响应式导航栏。这种方法不仅代码简洁高效,而且显著提升了移动端导航的用户体验,是构建现代Web应用的实用技巧。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

4436

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1355

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1758

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

9983

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

980

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2764

2023.09.04

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

1569

2023.09.14

js截取字符串的方法介绍
js截取字符串的方法介绍

JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

4729

2023.09.21

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 6万人学习

CSS教程
CSS教程

共754课时 | 98.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn