实现侧边导航栏的单开子菜单效果

实现侧边导航栏的单开子菜单效果

本文旨在提供一个清晰、简洁的教程,指导开发者如何实现侧边导航栏中子菜单的单开效果。通过修改JavaScript代码,确保在任何时刻只有一个子菜单处于展开状态,提升用户体验。我们将详细讲解代码实现,并提供完整的示例,帮助你快速掌握这一技巧。

实现原理

核心思路在于,每次点击子菜单的头部时,首先检查当前是否有已展开的子菜单。如果有,则将其关闭,然后再展开当前点击的子菜单。这样就保证了始终只有一个子菜单处于展开状态。

代码实现

以下是如何修改 JavaScript 代码以实现此功能的步骤:

获取所有子菜单头部元素: 使用 document.querySelectorAll 获取所有 .sub_menu_header 元素。

为每个子菜单头部添加点击事件监听器: 遍历所有子菜单头部元素,并为每个元素添加点击事件监听器。

在点击事件处理函数中,首先关闭已打开的子菜单: 在点击事件处理函数中,首先使用 document.querySelector(“.sub_menu_body.active”) 查找当前是否有 .sub_menu_body 元素具有 active 类。 如果找到,则使用 classList.remove(“active”) 移除该类的名称。

然后,切换当前点击的子菜单的显示状态: 获取当前点击的子菜单对应的 sub_menu_body 元素,并切换其 active 类的状态。

以下是修改后的 JavaScript 代码:

const sub_menu = document.querySelectorAll('.sub_menu');sub_menu.forEach((item) => {    const subMenuHeader = item.querySelector('.sub_menu_header')    const subMenuBody = item.querySelector('.sub_menu_body')    subMenuHeader.addEventListener('click', () => {        // 关闭已打开的子菜单        if(document.querySelector(".sub_menu_body.active")) {            document.querySelector(".sub_menu_body.active").classList.remove("active");        }        // 切换当前子菜单的显示状态        subMenuBody.classList.toggle('active');    })})

这段代码首先检查是否存在已经激活的子菜单,如果存在,则移除其 active 类,从而关闭它。然后,它会切换当前点击的子菜单的 active 类,如果该子菜单是关闭的,则打开它;如果是打开的,则关闭它。

完整示例

以下是完整的 HTML、CSS 和 JavaScript 示例代码:

HTML (index.html):

CSS (style.css):

*{    margin: 0;    padding: 0;    box-sizing: border-box;    text-decoration: none;    list-style: none;}body{    font-family: 'Ebrima';    background-color: #444444;}nav#nav_menu_query_off{    position: fixed;    top: 0;    left: 0;    width: 200px;    height: 100vh;    background-color: #222222;    overflow: auto;    z-index: 2;    padding: 20px 0 20px 20px;}nav#nav_menu_query_off menu#main_menu li.main_list_item div.menu_header{    text-transform: uppercase;    padding-bottom: 10px;}nav#nav_menu_query_off menu li{    color: #f0f0f0;}nav#nav_menu_query_off menu#main_menu li.main_list_item:not(:last-child){    padding-bottom: 20px;}nav#nav_menu_query_off menu#main_menu li.main_list_item:not(:first-child){    padding-top: 20px;}nav#nav_menu_query_off menu#main_menu div.menu_body{    padding: 0px 0 0 20px;    border-left: 1px solid #efefef;}nav#nav_menu_query_off menu#main_menu div.menu_body menu.sub_menu{    padding: 10px 0px;    border-bottom: 1px solid #efefef;}nav#nav_menu_query_off menu#main_menu div.menu_body menu.sub_menu div.sub_menu_header{    text-transform: capitalize;    font-size: 14px;}nav#nav_menu_query_off menu#main_menu div.menu_body menu.sub_menu div.sub_menu_header:hover{    cursor: pointer;}nav#nav_menu_query_off menu#main_menu div.menu_body menu.sub_menu div.sub_menu_body{    padding: 5px 0 0 0px;    /* THIS HIDES ALL SUBMENUS */    display: none;}nav#nav_menu_query_off menu#main_menu div.menu_body menu.sub_menu div.sub_menu_body.active{    display: block;}nav#nav_menu_query_off menu#main_menu li.main_list_item div.menu_body menu.sub_menu div.sub_menu_body li.inner_list_item{    font-size: 14px;}nav#nav_menu_query_off menu li .menu_body menu li a{    color: #f0f0f0;    display: block;    padding: 5px 0 5px 20px;}nav#nav_menu_query_off menu li .menu_body menu li a:hover{    background-color: #999999;}nav::-webkit-scrollbar{    /* width: 4px; */    /* helps remove scrollbar which resizes or shifts list items */    display: none;}

JavaScript (script.js):

const sub_menu = document.querySelectorAll('.sub_menu');sub_menu.forEach((item) => {    const subMenuHeader = item.querySelector('.sub_menu_header')    const subMenuBody = item.querySelector('.sub_menu_body')    subMenuHeader.addEventListener('click', () => {        // 关闭已打开的子菜单        if(document.querySelector(".sub_menu_body.active")) {            document.querySelector(".sub_menu_body.active").classList.remove("active");        }        // 切换当前子菜单的显示状态        subMenuBody.classList.toggle('active');    })})

注意事项

确保 HTML 结构正确,.sub_menu_header 和 .sub_menu_body 元素之间的关系正确。CSS 样式中的 display: none; 初始隐藏子菜单内容,display: block; 用于显示子菜单内容。此代码假设只有一个导航菜单。如果有多个导航菜单,需要修改选择器以确保只影响目标导航菜单。

总结

通过以上步骤,你就可以轻松实现侧边导航栏的单开子菜单效果,提升用户体验。这种方法简单易懂,易于维护,适用于各种 Web 项目。 希望本教程能帮助你解决实际问题。

以上就是实现侧边导航栏的单开子菜单效果的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1572561.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月22日 14:42:53
下一篇 2025年12月22日 14:43:05

相关推荐

  • 表单中的novalidate属性有什么用?如何关闭表单验证?

    novalidate属性的作用是禁用浏览器默认的表单验证行为,允许开发者自行控制验证逻辑。当该属性存在时,即使表单字段包含required、type=”email”或pattern等HTML5验证规则,浏览器也不会在提交时自动阻止无效数据或显示默认错误提示,表单会直接提交。这…

    2025年12月22日
    000
  • 表单中的CAPTCHA怎么集成?如何防止机器人提交?

    集成CAPTCHA可有效区分人类与机器人,核心是验证人类认知能力,常用方案包括reCAPTCHA、hCaptcha、滑动验证码等,需结合前端引入JS库、后端调用API验证token,并可配合蜜罐、时间戳、IP限频等策略提升安全性,选择时应权衡安全、体验与成本,定期监控失败率与破解情况以优化防护效果。…

    2025年12月22日
    000
  • HTML表单如何实现负载测试?怎样模拟高并发提交?

    使用jmeter进行html表单的负载测试,首先下载安装jmeter,创建测试计划并添加线程组配置并发用户数、启动时间及循环次数,接着添加http请求设置post方法、目标url及表单数据,通过csv data set config实现参数化以模拟真实用户,添加response assertion进…

    2025年12月22日
    000
  • HTML表单如何实现离线功能?怎样在没有网络时提交表单?

    核心是利用本地存储和Service Worker实现离线表单。首先通过localStorage或IndexedDB缓存表单数据,结合navigator.onLine和网络请求检测离线状态;在离线时,Service Worker拦截POST请求,将数据存入IndexedDB队列,并返回提示响应;当网络…

    2025年12月22日
    000
  • 表单中的分析跟踪怎么实现?如何集成Google Analytics?

    要实现表单分析跟踪,核心是通过google analytics的事件跟踪功能记录用户行为,需在表单字段的聚焦、失焦、更改和提交等时机触发事件,通过javascript或google tag manager埋点,可跟踪字段交互、提交成功、用户停留时间及放弃位置,进而优化表单设计以提升转化率。 表单分析…

    2025年12月22日
    000
  • 使用 CSS 和 Blade 在 SVG 动画上显示内容和图像

    本文旨在解决在 CSS 中如何实现 SVG 动画背景上叠加内容和图像的问题。通过结合绝对定位和 Grid 布局两种方法,详细讲解了如何将元素堆叠在 SVG 动画之上,并提供了使 SVG 动画缩放以适应容器的解决方案,同时保持 SVG 内部元素比例不变。 元素堆叠的两种方法 在网页设计中,将一个元素放…

    2025年12月22日
    000
  • CSS 实现 SVG 动画背景与内容叠加的专业教程

    第一段引用上面的摘要: 本文旨在解决在 CSS 中实现 SVG 动画背景,并在其上方叠加内容(如图片、文本框)的问题。我们将探讨如何使 SVG 动画自适应屏幕宽度而不拉伸内部元素,以及如何利用 CSS 定位技巧将内容精准地放置在 SVG 图形之上,最终实现美观且响应式的页面布局。通过本文提供的两种方…

    2025年12月22日
    000
  • HTML如何设置对话框?dialog标签的用法是什么?

    使用标签可创建语义化对话框,通过showModal()显示模态框,close()关闭,结合method=”dialog”的表单实现交互,利用::backdrop自定义背景样式,并通过事件监听控制行为,实现无需第三方库的原生弹窗方案。 HTML中设置对话框,尤其是现代网页应用里…

    2025年12月22日
    000
  • HTML如何设置章节?section标签的用法是什么?

    设置HTML章节核心是使用标签,它是HTML5语义化的重要元素,用于定义文档中独立、有主题的内容区块,如“关于我们”“产品特性”等,每个section通常包含标题(h1-h6),以明确其语义。与无语义的不同,传达内容的逻辑结构,提升可访问性和SEO。适用于博客章节、新闻模块、产品详情页等场景,但不应…

    2025年12月22日
    000
  • HTML如何设置文本垂直对齐?vertical-align属性的用法是什么?

    HTML中通过CSS的vertical-align属性控制行内元素垂直对齐,其取值包括baseline、top、middle、bottom、sub、super、length和percentage,分别用于基线对齐、顶部对齐、居中对齐、底部对齐、下标、上标及具体数值或百分比偏移;该属性适用于inlin…

    2025年12月22日 好文分享
    000
  • HTML表单如何隐藏字段?hidden类型的input有什么用途?

    使用可隐藏表单字段,如商品ID,语法为,它随表单提交传递数据,简化界面并维持上下文,但不提供安全性,因用户可通过开发者工具修改其值,故关键数据须在服务器端验证。 在HTML表单中,如果你想传递一些数据到服务器,但又不希望用户看到或直接修改它们,最直接且常用的方式就是使用 字段。这种字段在页面上是不可…

    2025年12月22日
    000
  • HTML表单如何实现断网检测?怎样在离线时保存表单数据?

    答案:通过navigator.onLine和online/offline事件检测网络状态,结合localStorage或IndexedDB离线存储表单数据,网络恢复后触发同步机制,利用fetch发送数据并实现幂等性处理,确保数据安全可靠提交。 HTML表单在断网时进行检测并保存数据,核心在于利用浏览…

    2025年12月22日
    000
  • HTML段落标签怎么用?p标签的作用是什么?

    标签用于定义HTML文档中的段落,自动在前后添加空白以区分段落,通过CSS可自定义字体、颜色、间距等样式,如使用class类设置特殊样式;与标签不同,表示独立段落并自带间距,仅用于行内换行,适用于地址或诗歌等场景;HTML5强调语义化,虽未新增标签特性,但建议根据内容选择更合适的语义标签,并保持标签…

    2025年12月22日
    000
  • HTML如何设置缓冲样式?buffering伪类的用法是什么?

    答案:HTML中无:buffering伪类,需通过JavaScript监听媒体事件并动态添加CSS类来实现缓冲样式。具体做法是结合video元素的waiting、playing等事件,控制加载覆盖层的显示与隐藏,配合CSS动画提供视觉反馈,并考虑可访问性与性能优化,适用于视频、图片懒加载、AJAX请…

    2025年12月22日
    000
  • HTML表单如何实现故障转移?怎样处理服务器宕机?

    客户端可通过localstorage实时缓存表单数据并在页面加载时恢复,提交成功后清除缓存,以防止用户输入丢失,对于敏感数据应避免使用此方式或结合加密处理,此方法能有效提升用户体验并保障数据完整性。 HTML表单本身并没有内置的“故障转移”机制,它更像是一个数据提交的入口。当谈到表单的故障转移和服务…

    2025年12月22日
    000
  • HTML如何设置禁用样式?disabled伪类的作用是什么?

    禁用HTML元素需添加disabled属性,结合:disabled伪类设置样式,并通过aria-disabled提升可访问性,还可使用JavaScript控制样式以实现更灵活的交互效果。 HTML中禁用样式主要通过 disabled 属性来实现,它能让表单元素呈现不可用状态,同时影响其视觉样式。 d…

    2025年12月22日
    000
  • 使用 Bootstrap Flexbox 实现列内文字垂直居中对齐图片中心

    本文将指导你如何使用 Bootstrap 的 Flexbox 功能,实现列中的文字垂直居中对齐到图片中心点。如摘要所述,核心在于利用 Bootstrap 提供的 align-items-center 类,该类能够方便地在行(row)内实现垂直居中对齐。 实现步骤 HTML 结构 首先,我们需要一个基…

    2025年12月22日 好文分享
    000
  • Bootstrap 列中文字垂直居中对齐图片的解决方案

    本文将介绍如何利用 Bootstrap 的 Flexbox 功能,特别是 align-items-center 类,来实现文字在列中垂直居中对齐图片的效果。正如摘要所述,通过简单的类添加,即可实现灵活且响应式的布局。 使用 Bootstrap Flexbox 实现垂直居中 Bootstrap 基于 …

    2025年12月22日
    000
  • Bootstrap 列文本垂直居中对齐图片中心点的实现方法

    本文旨在解决 Bootstrap 栅格系统中,如何将文本垂直居中对齐到相邻图片中心点的问题。通过利用 Bootstrap 的 Flexbox 工具类 align-items-center,我们可以轻松实现文本和图片的垂直居中对齐,从而提升页面布局的美观性和响应式体验。本文将提供详细的代码示例和步骤说…

    2025年12月22日
    000
  • 使用 CSS 和 SVG 实现动画背景上的内容显示与屏幕适配

    本文将深入探讨如何利用 CSS 和 SVG动画技术,在网页背景中创建引人入胜的动画效果,并在动画之上精准地叠加内容,包括图片和文本框。同时,我们将解决 SVG动画在不同屏幕尺寸下的自适应问题,确保动画背景在保持内容比例的同时,能够完美地填充整个屏幕宽度,从而实现视觉效果和用户体验的完美结合。 实现元…

    2025年12月22日
    000

发表回复

登录后才能评论
关注微信