纯 JavaScript 实现响应式多级下拉菜单:悬停与点击切换

纯 javascript 实现响应式多级下拉菜单:悬停与点击切换

本文旨在指导开发者如何使用原生 JavaScript、HTML 和 CSS 构建一个响应式的多级下拉菜单。该菜单在桌面端通过鼠标悬停展开,而在移动端则通过点击展开,无需依赖任何外部库(如 jQuery)。文章将提供完整的代码示例,并详细解释实现思路和关键步骤,帮助读者理解并掌握这一常用的 Web 开发技巧。

HTML 结构

首先,我们需要一个清晰的 HTML 结构来构建菜单。以下是一个基本的示例:

在这个结构中,menu 类是整个菜单的容器。ul 元素用于创建列表,li 元素代表菜单项。嵌套的 ul 元素用于创建子菜单。 为了方便后续的样式控制和JavaScript操作,建议将顶层 li 标签内的文本用 span 标签包裹,并赋予 menu-item 类名。

CSS 样式

接下来,我们使用 CSS 来设置菜单的样式。以下是一个示例:

立即学习“Java免费学习笔记(深入)”;

.menu {  --menu-height: 40px;  box-sizing: border-box;  position: fixed;  top: 0;  left: 0;  width: 100vw;}.menu ul {  list-style: none;  padding: 16px;  margin: 0;}.menu ul li,.menu ul li a {  opacity: 0.8;  color: #ffffff;  cursor: pointer;  transition: 200ms;  text-decoration: none;  white-space: nowrap;  font-weight: 700;}.menu ul li a,.menu ul li a a {  display: flex;  align-items: center;  height: 100%;  width: 100%;}.menu ul li {  padding-right: 36px;}.menu ul li::before {  content: "";  width: 0;  height: 0;  border-left: 5px solid transparent;  border-right: 5px solid transparent;  border-top: 5px solid #ffa500;  position: absolute;  right: 8px;  top: 50%;  transform: translateY(-50%);}.menu ul .link::before {  padding-right: 0;  display: none;}.menu > ul {  display: flex;  height: var(--menu-height);  align-items: center;  background-color: #000000;}.menu > ul li {  position: relative;  margin: 0 8px;}.menu > ul li ul {  visibility: hidden;  opacity: 0;  padding: 0;  min-width: 160px;  background-color: #333;  position: absolute;  top: 45px;  left: 50%;  transform: translateX(-50%);  transition: 200ms;  transition-delay: 200ms;}.menu > ul li ul li {  margin: 0;  padding: 8px 16px;  display: flex;  align-items: center;  justify-content: flex-start;  height: 30px;  padding-right: 40px;}.menu > ul li ul li::before {  width: 0;  height: 0;  border-top: 5px solid transparent;  border-bottom: 5px solid transparent;  border-left: 5px solid #ffa500;}.menu > ul li ul li ul {  top: -2%;  left: 100%;  transform: translate(0);}.show {  visibility: visible;  opacity: 1;}.hide {  display: none;}@media screen and (min-width: 1200px) {  .menu ul li:hover,  .menu ul li a:hover {    opacity: 1;  }  .menu > ul li ul li:hover {    background: black;  }  .menu > ul li:hover > ul {    opacity: 1;    visibility: visible;    transition-delay: 0ms;  }}@media screen and (max-width: 1200px) {  .menu {    height: 100vh;    top: 0;    left: 0;    width: 20vw;  }  .menu ul {    flex-direction: column;    height: 100vh;  }  .menu ul li {    margin: 1rem 0;  }  .menu ul li ul {    padding: 0;    min-width: 160px;    background-color: #333;    position: absolute;    top: 0px;    left: 200%;    transform: translateX(-50%);    transition: 200ms;    transition-delay: 200ms;    height: fit-content;  }    .menu ul.show {        visibility: visible;        opacity: 1;    }}

这段 CSS 代码定义了菜单的基本样式,包括颜色、字体、间距等。关键点在于:

visibility: hidden; 和 opacity: 0; 用于初始隐藏子菜单。.menu > ul li:hover > ul 在桌面端(min-width: 1200px)实现悬停展开效果。.menu ul.show 在移动端(max-width: 1200px)控制点击展开效果,注意同时设置 visibility 和 opacity。

JavaScript 交互

最后,我们使用 JavaScript 来实现移动端的点击展开效果。

let menu = document.querySelector(".menu ul");menu = menu.children;for (let i = 0; i < menu.length; i++) {  menu[i].addEventListener("click", function(event) {    // 阻止事件冒泡,防止点击子菜单时触发父菜单的点击事件    event.stopPropagation();    // 获取当前点击的菜单项的第一个子元素(即子菜单的ul元素)    let subMenu = this.querySelector('ul');    // 如果存在子菜单,则切换 "show" 类    if (subMenu) {      subMenu.classList.toggle("show");    }  });}

这段代码首先获取所有顶级菜单项,然后为每个菜单项添加点击事件监听器。当点击菜单项时,它会切换其子菜单的 show 类,从而显示或隐藏子菜单。event.stopPropagation() 的作用是阻止事件冒泡,防止点击子菜单时触发父菜单的点击事件。

注意事项:

确保 CSS 文件在 HTML 文件中正确引用。根据实际需求调整 CSS 样式和断点值。可以添加更多的 JavaScript 代码来实现更复杂的功能,例如关闭其他已展开的菜单。

总结:

通过结合 HTML、CSS 和 JavaScript,我们可以创建一个响应式的多级下拉菜单,该菜单在桌面端通过鼠标悬停展开,而在移动端则通过点击展开。这种方法无需依赖任何外部库,并且可以根据实际需求进行定制。 理解了HTML结构、CSS样式控制以及JavaScript交互逻辑,就能灵活运用并扩展这个示例,构建出更复杂、更实用的导航菜单。

以上就是纯 JavaScript 实现响应式多级下拉菜单:悬停与点击切换的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月22日 16:57:31
下一篇 2025年12月22日 16:57:43

相关推荐

  • 使用纯 JavaScript 实现响应式多级下拉菜单:悬停与点击的结合

    本文旨在指导开发者如何使用原生 JavaScript、HTML 和 CSS 构建一个响应式的多级下拉菜单。该菜单在桌面端采用悬停触发,而在移动端则切换为点击触发模式,无需依赖 jQuery 库。我们将重点解决移动端点击事件无法正确展开子菜单的问题,并提供代码示例和优化建议,帮助读者构建用户体验良好的…

    2025年12月22日
    000
  • 使用 Thymeleaf 动态渲染标签名称

    本文介绍了如何使用 Thymeleaf 动态渲染 HTML 标签的名称,例如根据模型属性动态生成 到 标签。虽然可以使用 th:utext 实现,但推荐使用 Thymeleaf 的片段功能,以提高代码可读性、降低出错风险,并避免潜在的安全问题。文章提供了具体的代码示例,展示了如何定义和使用片段来实现…

    2025年12月22日
    000
  • 使用 Thymeleaf 动态渲染 HTML 标签名称

    本文介绍了如何使用 Thymeleaf 动态生成 HTML 标签名称,例如根据模型属性动态生成 到 等标题标签。文章首先展示了一种使用 th:utext 的方法,但强调了其潜在的安全风险和可读性问题。随后,推荐使用 Thymeleaf 片段(Fragment)的方式来实现相同的功能,并提供了详细的代…

    2025年12月22日
    000
  • 使用 VBA 在网页表格中点击链接的正确方法

    本文将介绍如何使用 VBA 脚本在 Internet Explorer 中,通过表格结构定位并点击特定的 标签或按钮。我们将避免使用循环,而是利用 CSS 选择器直接定位目标元素,从而提高代码效率和可维护性。通过提供的示例代码,你将学会如何精准地操控网页元素,实现自动化操作。 使用 CSS 选择器定…

    2025年12月22日
    000
  • 使用 Thymeleaf 动态渲染 HTML 标签名

    本文介绍了如何在 Thymeleaf 模板中动态生成 HTML 标签名,根据模型属性值动态渲染 到 等标题标签。虽然可以使用 th:utext 实现,但推荐使用 Thymeleaf 片段(fragments)来提高代码可读性、可维护性,并降低安全风险。通过片段,可以更清晰地组织模板结构,避免直接在模…

    2025年12月22日
    000
  • 使用BeautifulSoup高效抓取嵌套标签的教程

    本教程详细介绍了如何使用Python的BeautifulSoup库,从复杂的HTML结构中高效提取多个嵌套的标签,特别是处理如面包屑导航这类重复性元素。通过定位父容器并结合find_all()方法进行迭代处理,您可以精确地抓取所需文本内容,并提供了清晰的代码示例和实用注意事项,以优化您的网页抓取任务…

    2025年12月22日
    000
  • 掌握JavaScript游戏触控事件:从键盘到触摸的平滑过渡

    本文旨在解决JavaScript游戏中将键盘事件转换为触控事件时常见的错误。通过分析e.code属性在不同事件类型中的适用性,我们将深入探讨touchstart事件的正确处理方式,并提供示例代码和最佳实践,确保您的游戏在移动设备上提供无缝的交互体验。 理解事件类型与事件对象属性 在开发javascr…

    2025年12月22日
    000
  • JavaScript游戏触控优化指南:从键盘事件到触摸事件的平滑过渡

    本教程旨在解决JavaScript游戏从键盘控制向触摸控制转换时常见的事件处理问题。通过分析一个Flappy Bird游戏的案例,我们深入探讨了touchstart事件与e.code属性的不兼容性,并提供了正确的事件监听和处理方法,确保游戏在移动设备上也能提供流畅的触控体验。文章还涵盖了事件类型区分…

    2025年12月22日
    000
  • JavaScript游戏触控优化:正确处理touchstart事件

    本文旨在指导开发者如何将JavaScript游戏从键盘控制转换为触控操作,重点解决touchstart事件处理中的常见误区。通过分析事件对象的特性,我们将纠正导致触控失效的关键代码逻辑,并提供优化后的实现示例及触控交互的最佳实践,确保游戏在移动设备上提供流畅的用户体验。 1. 从键盘到触控:事件处理…

    2025年12月22日
    000
  • 如何让你的 JavaScript 游戏支持触摸操作

    本文旨在解决 JavaScript 游戏中键盘事件到触摸事件的转换问题,以实现游戏在移动设备上的流畅运行。通过分析常见的触摸事件处理错误,提供正确的代码示例和详细的步骤说明,帮助开发者轻松地将键盘控制的游戏移植到触摸屏设备上,提升用户体验。 理解触摸事件 在将键盘控制的游戏转换为触摸控制时,首先需要…

    2025年12月22日
    000
  • 使你的 JavaScript 游戏支持触摸操作

    本文将指导你如何修改 JavaScript 游戏,使其能够响应触摸事件,从而在移动设备上获得更好的用户体验。我们将以一个 Flappy Bird 游戏的示例代码为例,详细讲解如何将键盘事件监听改为触摸事件监听,并解决可能遇到的问题。 触摸事件监听 在 JavaScript 中,我们可以使用 touc…

    2025年12月22日
    000
  • 解决Web按钮点击一次后失效的问题:使用toggle方法

    本文旨在解决Web开发中按钮点击一次后失效,需要刷新页面才能再次点击的问题。通过分析问题代码,我们将介绍如何使用JavaScript中的toggle方法来简化代码,并实现按钮的重复点击功能,避免手动添加和移除类名,从而更有效地控制元素的显示和隐藏。 在Web开发中,经常会遇到需要通过按钮控制页面元素…

    2025年12月22日
    000
  • JavaScript实现石头剪刀布游戏:事件驱动与AI逻辑优化

    本文旨在解决JavaScript石头剪刀布游戏中常见的AI选择不显示或逻辑未按预期执行的问题。我们将深入探讨事件驱动编程在Web游戏中的核心作用,并通过优化代码结构,展示如何正确地捕获玩家输入、动态生成AI选择,并实时更新游戏界面,从而构建一个功能完善且易于扩展的游戏。 理解问题:静态代码与动态交互…

    2025年12月22日
    000
  • 修复石头剪刀布游戏:解决AI选择不显示的问题

    本文旨在帮助开发者解决JavaScript石头剪刀布游戏中AI选择无法正确显示的问题。通过分析问题代码,我们将提供一种更简洁、更有效的方法来实现AI的选择逻辑,并确保其正确显示在页面上。我们将使用数组存储AI的选项,并通过随机数来选择AI的决策,从而避免潜在的逻辑错误。同时,我们将优化事件监听器的处…

    2025年12月22日
    000
  • Vue.js项目在无服务器环境下本地运行:单HTML文件打包与部署指南

    本教程旨在解决Vue.%ignore_a_1%项目在无Web服务器或离线环境下,通过直接打开index.html文件出现空白页的问题。我们将深入探讨默认Vue CLI构建失败的原因,并提供一种将所有Vue代码和资源打包成单个HTML文件的解决方案,从而实现项目在本地设备上的独立运行,无需依赖任何服务…

    2025年12月22日
    000
  • JavaScript/React中精确获取用户选中文本并自定义复制内容的教程

    本文详细介绍了在JavaScript或React应用中,如何准确获取用户选中的部分文本并自定义其复制行为。针对document.getSelection().anchorNode.textContent无法正确获取部分选中文本的问题,教程指出应使用document.getSelection().to…

    2025年12月22日
    000
  • 使用JavaScript实现点击按钮弹出聊天机器人窗口教程

    本文详细介绍了如何使用HTML、CSS和JavaScript创建一个可点击按钮触发的浮动聊天机器人窗口。通过固定定位和动态样式切换,实现了一个位于页面右下角的悬浮按钮,点击后能弹出聊天窗口,并提供了关闭功能。教程包含完整的代码示例和实现步骤,旨在帮助开发者轻松集成类似功能到其网站。 概述 在现代网站…

    2025年12月22日
    000
  • 解决React应用中复制部分文本时获取完整节点内容的教程

    本文旨在解决在React或其他Web应用中,通过oncopy事件复制用户选中文本时,意外获取到整个DOM节点内容而非实际选中部分的问题。核心解决方案是利用document.getSelection().toString()方法,确保准确捕获用户选中的文本片段,从而实现精确的复制和后续处理。 在web…

    2025年12月22日
    000
  • 掌握HTML 元素:构建语义化网页内容的最佳实践

    本教程探讨了在HTML 之后使用 ain> 元素作为主要内容包装器的最佳实践。它强调了 在提升网页语义、可访问性方面的优势,并澄清了其对SEO的间接影响,指导开发者如何正确使用这一关键语义元素来构建结构清晰、易于理解的网页。 语义化HTML的重要性 在构建现代网页时,html的语义化使用远不止…

    2025年12月22日
    000
  • 使用映射对象在JavaScript/jQuery表格中高效显示动态状态

    本文介绍如何在jQuery生成的HTML表格中,将后端返回的数字状态码高效转换为用户友好的文本描述。通过采用映射对象和封装函数的方法,避免了冗长的if-else语句,使代码更简洁、易读、易维护,并提升了动态内容渲染的灵活性和可扩展性,尤其适用于处理表格中多种状态的条件显示。 一、背景问题:冗长的if…

    2025年12月22日
    000

发表回复

登录后才能评论
关注微信