当前位置: 首页 > web >正文

前端:纯HTML、CSS和JS菜单样式

实现了一个多级折叠菜单系统,使用纯HTML、CSS和JavaScript(无任何框架)

一、二级菜单展开

1、实现效果

初始状态-展示全部一级菜单

选中共状态,一级标题选中共为蓝色背景色,二级标题选中共为蓝色文字,展开右侧图标为-,后缩状态右侧图标为+

2、实现

​HTML结构​

<ul class="menu"><li class="menu-item"><div class="menu-header"><a href="#" class="menu-link">一级标题</a><span class="toggle">+</span></div><ul class="submenu"><li><a href="#" class="submenu-link">子菜单项</a></li><!-- 更多子项... --></ul></li><!-- 更多一级菜单... -->
</ul>
  • ​层级关系​​:menu > menu-item > menu-header + submenu
  • ​关键元素​​:
    • .menu-header - 可点击的菜单标题区域
    • .toggle - 控制展开/折叠的"+"/-"按钮
    • .submenu - 默认隐藏的子菜单容器

CSS样式​

.menu-header {display: flex; /* Flex布局实现水平排列 */align-items: center; /* 垂直居中 */justify-content: space-between; /* 左右分散对齐 */background-color: #76787b; /* 灰色背景 */transition: background-color 0.3s ease; /* 悬停动画 */
}.submenu {display: none; /* 初始隐藏子菜单 */padding-left: 30px; /* 缩进效果 */background-color: #f1f1f1; /* 浅灰色背景 */
}.active .menu-header {background-color: #0096c7; /* 选中状态蓝色高亮 */
}
  • ​布局特点​​:
    • 使用Flexbox实现菜单标题和切换按钮的完美对齐
    • 子菜单默认隐藏(display: none
    • 通过缩进(padding-left)实现层级视觉区分

​JavaScript交互​

function toggleSubmenu(item) {const submenu = item.querySelector('.submenu');const toggle = item.querySelector('.toggle');if (submenu.style.display === 'block') {// 折叠逻辑submenu.style.display = 'none';toggle.textContent = '+';} else {// 展开逻辑submenu.style.display = 'block';toggle.textContent = '-';}
}
  • ​核心功能​​:

    1. ​点击菜单头​​时切换子菜单显示状态
    2. ​自动关闭其他菜单​​(保持单开模式)
    3. ​视觉反馈​​:
      • 切换"+"和"-"图标
      • 添加.active类改变背景色

​关键实现技巧​

  • ​纯CSS隐藏/显示​​:通过display: none/block控制子菜单显隐
  • ​状态管理​​:用.active类标记当前展开的菜单项
  • ​事件委托​​:直接给每个菜单头绑定点击事件(适合简单结构)
  • ​视觉层次​​:通过背景色和缩进区分不同级别菜单

实现代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Multi-Level Menu with Flexbox</title><style>/* styles.css */body {font-family: Arial, sans-serif;margin: 0;padding: 0;}.menu-container {padding: 20px;}.menu {list-style-type: none;padding: 0;margin: 0;width:400px;}.menu-header {display: flex;/* 使用 Flexbox 布局 */align-items: center;/* 垂直居中对齐 */justify-content: space-between;/* 图标和文字之间的间距 */padding: 10px 20px;background-color: #76787b;color: white;cursor: pointer;transition: background-color 0.3s ease;border:1px solid #fff;}.menu-header:hover {background-color: #444;}.toggle {font-size: 20px;color: white;}.menu-link {color: white;text-decoration: none;flex-grow: 1;/* 让链接占据剩余空间 */}.submenu {list-style-type: none;padding-left: 30px;display: none;/* 初始状态下隐藏子菜单 */background-color: #f1f1f1;}.submenu-link {display: block;padding: 5px 0;colo
http://www.xdnf.cn/news/2623.html

相关文章:

  • 如何免费把PPT的页面输出为透明的图片-快速制作图新说汇报内容
  • 【Java开发日记】OpenFeign 的 9 个坑
  • 【wpf】 WPF中实现动态加载图片浏览器(边滚动边加载)
  • GCC 15.1 发布,包含 COBOL 编译器及多项其他改进
  • FastAPI中使用Pydantic进行数据验证的示例与关键技术点分析
  • java Optional
  • 【vLLM 学习】CPU 离线处理
  • 通俗易懂一文讲透什么是 MCP?
  • 坐标转换:从WGS-84到国内坐标系(GCJ-02BD-09)
  • 大语言模型 - 运行、微调的显存计算详解与优化 全量微调、LoRA 优化策略
  • windows安装docker教程
  • PTA -L1-005 考试座位号(BufferedReader、Arraylist动态数组、Map)
  • 记录一下从debian12升级到debian13出现的小插曲01
  • C++翻转数相乘 2024年信息素养大赛复赛 C++小学/初中组 算法创意实践挑战赛 真题详细解析
  • shell编程基础知识及脚本示例
  • Android源码编译命令详解
  • 基于 Amazon RDS 数据库之间复制数据并屏蔽个人身份信息
  • 写读后感的时候,可以适当地引用书中的内容吗?
  • 【JavaGUI】
  • 边缘函数:全栈开发的最后1毫秒性能革命
  • MQTT - MQTT 实践(Windows EMQX、MQTTX、客户端认证、连接与主题)
  • ES练习册
  • Java多线程实现顺序执行
  • [计算机科学#3]:布尔逻辑 (计算机数学基础)
  • Python第三周作业
  • 语音合成之八-情感化语音合成的演进路线
  • [ECCV 2024]UMBRAE: Unified Multimodal Brain Decoding
  • 赞奇AIknow是什么?
  • 2025年8月PMP考试费用上涨?8月PMP考试费用解析!
  • 电力系统失步解列与振荡解析