jQuery 的 toggle()
函数是一个常用的显示/隐藏切换方法,它可以交替显示和隐藏匹配的元素。在移动端菜单实现中,经常使用这个方法来控制菜单的展开和收起。
当使用 toggle()
控制移动菜单时,常见的问题是:
$(document).ready(function() {
// 菜单按钮和菜单元素
var $menuButton = $('#menu-button');
var $menu = $('#mobile-menu');
// 点击菜单按钮切换菜单
$menuButton.click(function(e) {
e.stopPropagation(); // 阻止事件冒泡
$menu.toggle();
});
// 点击文档任意位置关闭菜单
$(document).click(function() {
if ($menu.is(':visible')) {
$menu.hide();
}
});
// 阻止菜单内部点击事件冒泡到document
$menu.click(function(e) {
e.stopPropagation();
});
});
$(document).ready(function() {
var $menu = $('#mobile-menu');
// 切换菜单显示状态
$('#menu-button').on('click', function(e) {
e.stopPropagation();
$menu.toggle();
});
// 监听整个文档的点击事件
$(document).on('click', function(e) {
// 如果点击的不是菜单按钮或菜单本身,且菜单可见
if (!$(e.target).closest('#menu-button, #mobile-menu').length && $menu.is(':visible')) {
$menu.hide();
}
});
});
$(document).ready(function() {
var $menu = $('#mobile-menu');
var $menuButton = $('#menu-button');
$menuButton.click(function(e) {
e.stopPropagation();
$menu.toggleClass('active');
});
$(document).click(function() {
$menu.removeClass('active');
});
$menu.click(function(e) {
e.stopPropagation();
});
});
对应的 CSS:
#mobile-menu {
display: none;
}
#mobile-menu.active {
display: block;
}
stopPropagation()
阻止事件冒泡,否则菜单按钮点击会同时触发 document 的点击事件<!DOCTYPE html>
<html>
<head>
<title>移动菜单任意位置关闭示例</title>
<style>
#mobile-menu {
display: none;
position: fixed;
top: 60px;
left: 0;
width: 100%;
background: #333;
color: white;
padding: 20px;
box-sizing: border-box;
}
#menu-button {
position: fixed;
top: 10px;
right: 10px;
padding: 10px;
background: #007bff;
color: white;
border: none;
cursor: pointer;
}
</style>
</head>
<body>
<button id="menu-button">菜单</button>
<div id="mobile-menu">
<ul>
<li><a href="#">首页</a></li>
<li><a href="#">产品</a></li>
<li><a href="#">服务</a></li>
<li><a href="#">关于我们</a></li>
<li><a href="#">联系我们</a></li>
</ul>
</div>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
var $menu = $('#mobile-menu');
var $menuButton = $('#menu-button');
// 菜单按钮点击事件
$menuButton.click(function(e) {
e.stopPropagation();
$menu.toggle();
});
// 文档点击事件
$(document).click(function() {
if ($menu.is(':visible')) {
$menu.hide();
}
});
// 阻止菜单内部点击事件冒泡
$menu.click(function(e) {
e.stopPropagation();
});
});
</script>
</body>
</html>
这个解决方案实现了在屏幕任意位置点击都能关闭移动菜单的功能,同时保持了菜单按钮的正常切换功能。