讲师中心 微信公众号
AI工具推荐 视频效率加速

JavaScript 动态菜单选中效果实现:点击高亮与取消高亮

酷宇同学_6024

酷宇同学_6024

发布时间:2025-09-25 11:34:01

|

338人浏览过

|

来源于php中文网

原创

JavaScript 动态菜单选中效果实现:点击高亮与取消高亮

本教程将详细介绍如何使用 JavaScript 实现动态菜单的点击高亮与取消高亮功能。通过事件委托和状态管理,我们能够高效地为菜单项添加点击事件,使其在被点击时显示绿色背景,同时将其他未选中项恢复为白色背景,确保无论点击顺序如何,效果都能准确呈现。

动态菜单高亮功能概述

在网页交互中,菜单是常见的导航元素。为了提升用户体验,当用户点击某个菜单项时,通常需要将其高亮显示,同时取消其他菜单项的高亮状态。这不仅能清晰地指示当前选中的是哪个选项,还能提供即时视觉反馈。本教程将采用一种高效且易于维护的方法来实现这一功能。

核心实现思路

实现菜单项的动态高亮,主要包含以下几个核心思想:

  1. 事件委托 (Event Delegation):不为每个菜单项单独绑定点击事件,而是将事件监听器绑定到它们的共同父容器上。当事件在子元素上触发时,会向上冒泡到父容器,我们可以在父容器的事件监听器中判断是哪个子元素触发了事件,并进行相应处理。这种方式能有效减少事件监听器的数量,提高性能,尤其适用于菜单项数量不确定或动态增减的情况。
  2. 状态管理 (State Management):为了正确地“取消高亮”上一个选中的菜单项,我们需要一个变量来追踪当前哪个菜单项是高亮状态。当新的菜单项被点击时,我们可以先找到并重置上一个高亮项的样式,然后再高亮当前点击项。
  3. 样式控制 (Style Control):通过 JavaScript 直接修改元素的 backgroundColor 属性来实现高亮和取消高亮的效果。

详细实现步骤

我们将从 HTML 结构、CSS 样式和 JavaScript 逻辑三个方面来构建这个功能。

1. HTML 结构

首先,定义一个包含多个菜单项的 HTML 结构。每个菜单项都使用一个 p 标签,并带有相同的 menu 类,它们都包含在一个 container div 中。

<div class="container">
    <p class="menu">Home</p>
    <p class="menu">Gallery</p>
    <p class="menu">Technology</p>
    <p class="menu">Information</p>
    <p class="menu">Contact</p>
    <p class="menu">About</p>
</div>

2. CSS 样式

为了提供更好的视觉效果和用户体验,我们可以为菜单项设置默认样式和可选的悬停效果。默认情况下,所有菜单项背景色为白色。

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

Java注释规范Skills
Java注释规范Skills

当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。

下载
body         { background-color: #efefef; font-family: sans-serif; }
.menu        { background-color: white; cursor: pointer; padding: 8px 15px; margin: 5px 0; border-radius: 4px; transition: background-color 0.2s ease; }
.menu:hover  { background-color: #e0e0e0; } /* 可选:鼠标悬停时的背景色 */
/* .menu.active { background-color: #beffc7; } */ /* 另一种通过CSS类控制高亮的方式 */

注意:在上述 CSS 中,我们注释掉了一个 .menu.active 样式。虽然本教程的 JavaScript 部分将直接修改 style.backgroundColor,但在更复杂的应用中,通过添加/移除 CSS 类(如 .active)来控制样式是更推荐的做法,因为它能更好地分离结构、样式和行为。

3. JavaScript 逻辑

JavaScript 是实现动态高亮的核心。我们将使用事件委托机制,监听父容器的点击事件,并根据点击目标来更新菜单项的样式。

// 获取菜单容器元素
let container = document.querySelector('.container');
// 用于存储当前被选中(高亮)的菜单项的引用
let currentActiveMenuItem = null; 

// 为容器添加点击事件监听器
container.addEventListener("click", (event) => {
    // 检查点击事件的实际目标是否是具有 'menu' 类的元素
    // event.target 指向实际触发事件的元素
    if (event.target.matches('.menu')) {
        // 如果存在上一个被选中的菜单项,将其背景色恢复为白色
        if (currentActiveMenuItem) {
            currentActiveMenuItem.style.backgroundColor = '#fff';
        }

        // 如果当前点击的不是之前已经高亮的菜单项,则将其高亮
        // 否则,如果点击的是同一个高亮项,则取消其高亮(使其变白)
        if (event.target !== currentActiveMenuItem) {
            event.target.style.backgroundColor = '#beffc7'; // 设置为绿色
            // 更新 currentActiveMenuItem 为当前点击的元素
            currentActiveMenuItem = event.target;
        } else {
            // 如果点击的是同一个高亮项,则取消高亮,并重置 currentActiveMenuItem
            event.target.style.backgroundColor = '#fff';
            currentActiveMenuItem = null;
        }
    }
});

代码解析:

  • let container = document.querySelector('.container');:获取菜单项的父容器。
  • let currentActiveMenuItem = null;:声明一个变量来保存当前高亮的菜单项引用。初始时没有高亮项,所以为 null。
  • container.addEventListener("click", ...):在父容器上绑定点击事件。
  • event.target.matches('.menu'):这是一个非常重要的判断。event.target 是实际触发点击事件的 DOM 元素(可能是 p.menu)。matches() 方法检查该元素是否匹配给定的 CSS 选择器。这确保了只有点击到菜单项时才执行后续逻辑,而不是点击容器的其他空白区域。
  • if (currentActiveMenuItem):检查是否存在之前高亮的菜单项。如果存在,将其 backgroundColor 设置回白色 (#fff)。
  • if (event.target !== currentActiveMenuItem):判断当前点击的菜单项是否是已经高亮的那个。
    • 如果不是同一个,则将 event.target (当前点击的菜单项) 的背景色设置为绿色 (#beffc7),并更新 currentActiveMenuItem 为当前点击的元素。
    • 如果是同一个,则取消其高亮(变白),并将 currentActiveMenuItem 重置为 null,实现点击已高亮项取消高亮的功能。

完整示例代码

将上述 HTML、CSS 和 JavaScript 组合起来,形成一个完整的可运行示例。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>动态菜单高亮</title>
    <style>
        body         { background-color: #efefef; font-family: sans-serif; display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; }
        .container   { background-color: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); }
        .menu        { background-color: white; cursor: pointer; padding: 8px 15px; margin: 5px 0; border-radius: 4px; transition: background-color 0.2s ease; }
        .menu:hover  { background-color: #e0e0e0; } /* 鼠标悬停时的背景色 */
    </style>
</head>
<body>

<div class="container">
    <p class="menu">Home</p>
    <p class="menu">Gallery</p>
    <p class="menu">Technology</p>
    <p class="menu">Information</p>
    <p class="menu">Contact</p>
    <p class="menu">About</p>
</div>

<script>
    let container = document.querySelector('.container');
    let currentActiveMenuItem = null; // To hold reference to last 'clicked' menu item

    container.addEventListener("click", (event) => {
        // When a .menu inside .container gets clicked
        if (event.target.matches('.menu')) {
            // If 'currentActiveMenuItem' exists/defined, make it white
            if (currentActiveMenuItem) {
                currentActiveMenuItem.style.backgroundColor = '#fff';
            }

            // If 'clicked' is not the current active item, toggle to green
            if (event.target !== currentActiveMenuItem) {
                event.target.style.backgroundColor = '#beffc7'; // Set to green
                currentActiveMenuItem = event.target; // Save reference to clicked element for next 'click'
            } else {
                // If clicked the same active item, deselect it
                event.target.style.backgroundColor = '#fff';
                currentActiveMenuItem = null;
            }
        }
    });
</script>

</body>
</html>

注意事项与最佳实践

  1. CSS 类管理 vs. 内联样式:尽管本教程为了简洁直接修改了 style.backgroundColor,但在大型项目中,更推荐通过添加或移除 CSS 类(如 .active)来管理高亮状态。例如,可以定义 .menu.active { background-color: #beffc7; },然后用 JavaScript 切换元素的 classList.add('active') 和 classList.remove('active')。这种方式能更好地分离样式和行为,使 CSS 样式更易于管理和复用。
  2. 初始选中状态:如果页面加载时需要某个菜单项默认是高亮状态,可以在 JavaScript 初始化时手动设置 currentActiveMenuItem 并为其添加高亮样式。
  3. 可访问性 (Accessibility):对于专业的教程,建议考虑为菜单项添加 ARIA 属性,例如 aria-current="page" 或 aria-selected="true",以提升屏幕阅读器等辅助技术的用户体验。
  4. 性能:事件委托是处理动态列表事件的最佳实践之一,它显著优于为每个元素单独绑定事件监听器,尤其在元素数量多或动态变化时。

总结

通过本教程,我们学习了如何利用 JavaScript 的事件委托机制和简单的状态管理,实现一个动态、高效且用户友好的菜单点击高亮功能。这种方法不仅代码简洁,易于理解和维护,而且在性能上也表现出色,是构建交互式网页菜单的理想选择。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

6521

2024.08.14

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

40

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

20

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

20

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

0

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

20

2026.10.22

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

20

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 6.1万人学习

CSS教程
CSS教程

共754课时 | 98.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn