
在现代 web 应用中,下拉菜单(dropdown menu)是常见的 ui 组件。当页面上存在多个下拉菜单时,如何优雅地管理它们的开关状态,避免多个菜单同时打开,并实现在点击菜单外部时自动关闭,是前端开发中一个常见而重要的需求。本教程将通过 jquery 提供一套简洁高效的解决方案。
首先,我们需要一个清晰的 HTML 结构来表示下拉菜单。每个下拉菜单都将包含一个触发按钮和一个内容列表,并用一个共同的父容器包裹。
<div class="tm-dropdown">
<button type="button" class="tm-button tm-button-primary-l6 tm-button-ghost text-grey-medium tm-dropdown-button" aria-describedby="tooltip">
<span>EN</span>
</button>
<ul class="tm-dropdown-content" role="tooltip">
<li>English</li>
<li>Bahasa Melayu</li>
<li>中文简体</li>
</ul>
</div>
<div class="tm-dropdown">
<button type="button" class="tm-button tm-button-primary-l6 tm-button-ghost text-grey-medium tm-dropdown-button" aria-describedby="tooltip">
<span>菜单二</span>
</button>
<ul class="tm-dropdown-content" role="tooltip">
<li>选项A</li>
<li>选项B</li>
<li>选项C</li>
</ul>
</div>
<!-- 引入 jQuery 库 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>在这个结构中:
为了控制下拉菜单的显示与隐藏,我们将使用 CSS 类来切换其可见性。.opened 类将用于显示下拉菜单内容。
.tm-dropdown {
position: relative; /* 确保下拉内容定位正确 */
display: inline-block; /* 允许多个下拉菜单并排显示 */
margin-right: 10px;
}
.tm-dropdown-content {
display: none; /* 默认隐藏 */
position: absolute;
background-color: #f9f9f9;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
z-index: 1;
list-style: none;
padding: 0;
margin: 0;
border-radius: 4px;
}
.tm-dropdown-content li {
padding: 12px 16px;
text-decoration: none;
display: block;
color: black;
cursor: pointer;
}
.tm-dropdown-content li:hover {
background-color: #f1f1f1;
}
/* 当父容器有 opened 类时,显示下拉内容 */
.tm-dropdown.opened .tm-dropdown-content {
display: block;
}
/* 示例按钮样式 */
.tm-button {
padding: 8px 15px;
border: 1px solid #ccc;
background-color: #eee;
cursor: pointer;
border-radius: 4px;
}核心的交互逻辑将通过 jQuery 实现,主要包含两个部分:全局点击事件处理和下拉按钮点击事件处理。
我们首先监听 document 上的 click 或 touchstart 事件。当用户点击页面任何位置时,此事件都会触发。我们的目标是,如果点击发生在任何 .tm-dropdown 区域之外,则关闭所有已打开的下拉菜单。
$(document).on('click touchstart', function(e) {
// 检查点击事件的目标元素是否在任何 .tm-dropdown 内部
// .closest('.tm-dropdown') 会从 e.target 向上查找最近的 .tm-dropdown 父元素
// 如果找不到(即点击在任何 .tm-dropdown 外部),则长度为 0
if ($(e.target).closest('.tm-dropdown').length === 0) {
// 关闭所有已打开的下拉菜单
$('.tm-dropdown').removeClass('opened');
}
});解释:
接下来,我们监听所有 .tm-dropdown-button 按钮的点击事件。当一个按钮被点击时,我们需要完成两件事:
$(".tm-dropdown-button").on('click', function(e) {
// 阻止事件冒泡到 document,防止全局点击事件立即关闭当前打开的菜单
e.stopPropagation();
var $this = $(this); // 当前被点击的按钮
var $parentDropdown = $this.parent(); // 当前按钮所属的 .tm-dropdown 父容器
// 关闭所有其他已打开的下拉菜单
// .not($parentDropdown) 确保不关闭当前正在操作的菜单
$('.tm-dropdown').not($parentDropdown).removeClass('opened');
// 切换当前下拉菜单的 'opened' 类
// 如果当前菜单已打开,则关闭;如果已关闭,则打开
$parentDropdown.toggleClass('opened');
});解释:
将 HTML、CSS 和 jQuery 代码整合,即可得到一个功能完整的、支持多下拉菜单智能开关和外部点击关闭的解决方案。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>jQuery 多下拉菜单管理</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
.tm-dropdown {
position: relative;
display: inline-block;
margin-right: 15px;
}
.tm-button {
padding: 10px 20px;
border: 1px solid #ccc;
background-color: #f0f0f0;
cursor: pointer;
border-radius: 5px;
font-size: 16px;
}
.tm-button:hover {
background-color: #e0e0e0;
}
.tm-dropdown-content {
display: none;
position: absolute;
background-color: #fff;
min-width: 180px;
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
z-index: 1000; /* 确保下拉菜单在其他内容之上 */
list-style: none;
padding: 0;
margin: 5px 0 0 0; /* 稍微向下偏移,与按钮保持距离 */
border-radius: 5px;
border: 1px solid #ddd;
}
.tm-dropdown-content li {
padding: 12px 15px;
color: #333;
cursor: pointer;
font-size: 14px;
}
.tm-dropdown-content li:hover {
background-color: #f5f5f5;
}
/* 当父容器有 opened 类时,显示下拉内容 */
.tm-dropdown.opened .tm-dropdown-content {
display: block;
}
</style>
</head>
<body>
<div class="tm-dropdown">
<button type="button" class="tm-button tm-dropdown-button">
<span>语言选择</span>
</button>
<ul class="tm-dropdown-content" role="tooltip">
<li>English</li>
<li>Bahasa Melayu</li>
<li>中文简体</li>
</ul>
</div>
<div class="tm-dropdown">
<button type="button" class="tm-button tm-dropdown-button">
<span>更多选项</span>
</button>
<ul class="tm-dropdown-content" role="tooltip">
<li>个人资料</li>
<li>设置</li>
<li>退出</li>
</ul>
</div>
<div class="tm-dropdown">
<button type="button" class="tm-button tm-dropdown-button">
<span>通知</span>
</button>
<ul class="tm-dropdown-content" role="tooltip">
<li>新消息 (3)</li>
<li>系统更新</li>
<li>查看全部</li>
</ul>
</div>
<p style="margin-top: 50px;">点击此处或任意空白区域可关闭所有下拉菜单。</p>
<script>
$(document).on('click touchstart', function(e) {
// 如果点击发生在任何 .tm-dropdown 元素之外,则关闭所有下拉菜单
if ($(e.target).closest('.tm-dropdown').length === 0) {
$('.tm-dropdown').removeClass('opened');
}
});
$(".tm-dropdown-button").on('click', function(e) {
// 阻止事件冒泡,避免触发 document 上的关闭事件
e.stopPropagation();
var $this = $(this); // 当前被点击的按钮
var $parentDropdown = $this.parent(); // 当前按钮所属的 .tm-dropdown 父容器
// 关闭所有其他已打开的下拉菜单
$('.tm-dropdown').not($parentDropdown).removeClass('opened');
// 切换当前下拉菜单的 'opened' 类(打开/关闭)
$parentDropdown.toggleClass('opened');
});
</script>
</body>
</html>通过上述 jQuery 解决方案,您可以轻松地在您的项目中实现多个下拉菜单的智能管理,提供直观且用户友好的交互体验。
以上就是使用 jQuery 实现多下拉菜单的智能开关与外部点击关闭的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号