Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
使用原生 JavaScript 实现响应式多级下拉菜单(悬停与点击切换)_创想鸟

使用原生 JavaScript 实现响应式多级下拉菜单(悬停与点击切换)

使用原生 javascript 实现响应式多级下拉菜单(悬停与点击切换)

本文旨在指导开发者使用原生 JavaScript、HTML 和 CSS 构建一个响应式的多级下拉菜单。该菜单在桌面端通过鼠标悬停展开,在移动端则通过点击展开。文章将详细介绍实现思路、代码示例以及注意事项,帮助读者理解并掌握如何在不同设备上提供最佳的用户体验。

HTML 结构

首先,我们需要构建 HTML 结构。一个典型的多级下拉菜单包含一个 div 容器,内部包含一个无序列表 ul,列表项 li 可能包含嵌套的 ul 列表,形成多级菜单。

建议使用 标签包裹菜单项文本,以便添加链接。对于顶级 li 标签,可以考虑使用 标签包裹文本,方便样式控制和语义化。例如:

  • Link
    • Child Link
    • Child Link
  • CSS 样式

    CSS 负责菜单的布局和外观。关键点在于如何实现悬停效果和媒体查询,以便在不同屏幕尺寸下应用不同的样式。

    .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 {  display: flex;}.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 {    visibility: hidden;    opacity: 0;    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;}

    关键点:

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

    隐藏子菜单: 默认情况下,使用 visibility: hidden; 和 opacity: 0; 隐藏子菜单。悬停效果: 在桌面端媒体查询中,使用 :hover 伪类来改变子菜单的 visibility 和 opacity,实现悬停展开效果。移动端样式: 在移动端媒体查询中,可以调整菜单的布局,例如将其设置为垂直排列。.menu ul.show: 这个CSS规则是解决问题的关键。它确保当 show 类被添加到 ul 元素时,该元素的 visibility 和 opacity 属性被正确设置,从而显示子菜单。

    JavaScript 交互

    JavaScript 用于处理移动端的点击事件,实现点击展开/收起子菜单的功能。

    let menu = document.querySelector(".menu ul");menu = menu.children;for (let i = 0; i < menu.length; i++) {  console.log(menu[i]);  menu[i].addEventListener("click", function() {    menu[i].firstElementChild.classList.toggle("show");    console.log(menu[i].firstElementChild);  });}

    这段代码遍历顶级菜单项,并为每个菜单项添加点击事件监听器。当点击菜单项时,它会切换其第一个子元素(通常是子菜单 ul)的 show 类。

    改进建议:

    更精确的选择器: 使用更精确的选择器来避免潜在的问题。例如,可以使用 document.querySelectorAll(“.menu > ul > li”) 来选择顶级菜单项。事件委托: 使用事件委托可以提高性能,尤其是在菜单项数量较多时。将事件监听器添加到父元素(例如 .menu ul),然后根据点击的目标元素来判断是否需要展开/收起子菜单。判断屏幕尺寸: 在 JavaScript 中判断当前屏幕尺寸,只在移动端应用点击事件处理程序,避免与桌面端的悬停效果冲突。可以使用 window.innerWidth 或 window.matchMedia 来判断屏幕尺寸。

    示例代码(包含改进):

    document.addEventListener('DOMContentLoaded', function() {    const menu = document.querySelector('.menu ul');    // 仅在移动设备上启用点击事件    if (window.innerWidth <= 1200) { // 假设1200px是移动端和桌面端的分割点        menu.addEventListener('click', function(event) {            const target = event.target;            // 检查点击的是否是顶级菜单项            if (target.tagName === 'LI' && target.parentElement === menu) {                const subMenu = target.querySelector('ul'); // 查找子菜单                if (subMenu) {                    event.preventDefault(); // 阻止默认行为(例如,如果菜单项是链接)                    subMenu.classList.toggle('show'); // 切换 show 类                }            }        });    }});

    代码解释:

    document.addEventListener(‘DOMContentLoaded’, function() { … });:确保在DOM加载完成后执行JavaScript代码。window.innerWidth target.tagName === ‘LI’ && target.parentElement === menu:检查点击的元素是否是顶级菜单项。target.querySelector(‘ul’):查找当前菜单项的子菜单。event.preventDefault():阻止默认行为,例如,如果菜单项是一个链接,阻止页面跳转。subMenu.classList.toggle(‘show’):切换子菜单的 show 类,从而显示或隐藏子菜单。

    总结

    通过 HTML 构建菜单结构,CSS 控制菜单样式和响应式布局,JavaScript 处理移动端的点击交互,我们可以实现一个功能完善、用户体验良好的响应式多级下拉菜单。记住,清晰的结构、合理的样式和简洁的 JavaScript 代码是构建高质量 Web 应用的关键。根据实际需求,你可以进一步优化代码,例如添加动画效果、自定义样式等。

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

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

    赞 (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    HTML语义化:元素在网页结构中的核心作用与最佳实践
    上一篇 2025年12月22日 16:57:43
    实现反向模糊效果:从模糊到清晰的图片处理教程
    下一篇 2025年12月22日 16:58:00

    相关推荐

    发表回复

    登录后才能评论
    关注微信