在网页交互开发中,动态菜单的点击选中与颜色切换是高频需求,通过原生JavaScript实现可以避免引入额外框架,同时保证逻辑的清晰和可维护性。实现这一功能的核心思路是监听菜单的点击事件,动态修改对应菜单项的样式类,同时维护当前选中项的状态。

需求拆解与实现思路
首先明确需要实现的核心功能点:
- 菜单项默认有未选中样式,点击后切换为选中样式
- 同一时间只能有一个菜单项处于选中状态
- 选中状态的颜色与未选中状态有明显区分
- 支持动态新增菜单项时无需额外绑定事件
基于以上需求,我们可以采用事件委托的方式监听菜单容器的点击事件,这样既可以减少事件绑定的数量,也能支持动态新增的菜单项自动响应点击操作。同时通过维护一个当前选中项的引用,避免遍历所有菜单项来修改样式,提升性能。
基础HTML结构搭建
首先定义菜单的基础HTML结构,菜单容器使用ul标签,每个菜单项使用li标签,默认给所有菜单项添加未选中的基础样式类:
<style>
/* 基础菜单样式 */
.menu-container {
list-style: none;
padding: 0;
margin: 0;
display: flex;
gap: 16px;
}
/* 未选中状态样式 */
.menu-item {
padding: 8px 16px;
cursor: pointer;
color: #333;
background-color: #f5f5f5;
border-radius: 4px;
transition: all 0.2s ease;
}
/* 选中状态样式 */
.menu-item.active {
color: #fff;
background-color: #1677ff;
}
</style>
<ul class="menu-container" id="menuContainer">
<li class="menu-item">首页</li>
<li class="menu-item">产品中心</li>
<li class="menu-item">解决方案</li>
<li class="menu-item">关于我们</li>
</ul>
JavaScript核心逻辑实现
接下来编写JavaScript逻辑,主要包含事件监听、状态更新、样式切换三个部分:
// 获取菜单容器元素
const menuContainer = document.getElementById('menuContainer');
// 维护当前选中项的引用,初始为null
let currentActiveItem = null;
// 给菜单容器绑定点击事件,使用事件委托
menuContainer.addEventListener('click', function(event) {
// 判断点击的目标是否是菜单项
const target = event.target;
if (target.classList.contains('menu-item')) {
// 如果已经有选中项,先移除它的选中样式
if (currentActiveItem) {
currentActiveItem.classList.remove('active');
}
// 给当前点击的菜单项添加选中样式
target.classList.add('active');
// 更新当前选中项的引用
currentActiveItem = target;
}
});
上述代码中,我们首先获取了菜单容器的DOM元素,然后声明了一个currentActiveItem变量用来存储当前选中的菜单项。通过给容器绑定点击事件,利用事件冒泡机制捕获子元素的点击,判断点击目标是否带有menu-item类,如果是则执行样式切换逻辑。
功能扩展与优化
支持默认选中项
如果需要页面加载时默认选中某个菜单项,可以在初始化时手动设置:
// 初始化默认选中第一个菜单项
window.addEventListener('DOMContentLoaded', function() {
const firstMenuItem = menuContainer.querySelector('.menu-item');
if (firstMenuItem) {
firstMenuItem.classList.add('active');
currentActiveItem = firstMenuItem;
}
});
支持动态新增菜单项
由于我们使用了事件委托,动态新增的菜单项不需要额外绑定事件,直接插入到菜单容器中即可生效:
// 动态新增菜单项的方法
function addMenuItem(text) {
const newItem = document.createElement('li');
newItem.className = 'menu-item';
newItem.textContent = text;
menuContainer.appendChild(newItem);
}
// 调用方法新增菜单项
addMenuItem('联系我们');
获取当前选中项信息
如果需要获取当前选中项的文本或其他属性,可以直接通过currentActiveItem变量获取:
// 获取当前选中项的文本
function getCurrentActiveText() {
if (currentActiveItem) {
return currentActiveItem.textContent;
}
return null;
}
// 调用方法获取选中项文本
console.log(getCurrentActiveText());
实现注意事项
在实际开发中需要注意以下几点:
- 样式切换尽量通过修改类而不是修改内联样式实现,这样便于样式统一管理
- 事件委托的目标判断要准确,避免误判容器内的其他子元素
- 如果菜单项有嵌套结构,需要调整目标判断的逻辑,确保点击到正确的菜单项元素
- 过渡效果可以通过CSS的
transition属性实现,提升交互的流畅感
这种实现方案没有依赖任何第三方框架,代码简洁且扩展性强,适配大多数动态菜单的点击选中与颜色切换需求,开发者可以根据实际场景调整样式和逻辑细节。
JavaScript动态菜单点击选中颜色切换DOM操作修改时间:2026-07-04 15:03:26