您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# jQuery怎么实现折叠菜单效果
折叠菜单是网页交互设计中常见的组件,能够有效节省页面空间并提升用户体验。本文将详细介绍如何使用jQuery实现折叠菜单效果,包含基础实现、动画优化、事件处理等完整方案。
## 一、基础HTML结构
首先需要构建符合语义化的HTML结构,推荐使用无序列表`<ul>`嵌套实现层级关系:
```html
<div class="menu-container">
<ul class="main-menu">
<li>
<a href="#">一级菜单1</a>
<ul class="sub-menu">
<li><a href="#">二级菜单1</a></li>
<li><a href="#">二级菜单2</a></li>
</ul>
</li>
<li>
<a href="#">一级菜单2</a>
<ul class="sub-menu">
<li><a href="#">二级菜单3</a></li>
<li><a href="#">二级菜单4</a></li>
</ul>
</li>
</ul>
</div>
为菜单添加基本样式,默认隐藏子菜单:
.menu-container {
width: 250px;
font-family: Arial, sans-serif;
}
.main-menu, .sub-menu {
list-style: none;
padding: 0;
margin: 0;
}
.sub-menu {
display: none; /* 默认隐藏子菜单 */
padding-left: 15px;
}
.menu-item {
position: relative;
}
.menu-item > a {
display: block;
padding: 10px 15px;
color: #333;
text-decoration: none;
border-bottom: 1px solid #eee;
}
.menu-item > a:hover {
background-color: #f5f5f5;
}
.has-submenu::after {
content: "+";
position: absolute;
right: 15px;
}
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
$(document).ready(function() {
// 给所有包含子菜单的项添加标记
$('.menu-item:has(.sub-menu)').addClass('has-submenu');
// 点击事件绑定
$('.has-submenu > a').click(function(e) {
e.preventDefault();
// 获取相邻的子菜单
var submenu = $(this).next('.sub-menu');
// 切换当前子菜单显示状态
submenu.slideToggle(200);
// 切换图标
$(this).parent().toggleClass('active');
$(this).parent().find('::after').text(
$(this).parent().hasClass('active') ? '-' : '+'
);
});
});
$('.has-submenu > a').click(function(e) {
e.preventDefault();
// 关闭其他展开的子菜单
$('.sub-menu').not($(this).next('.sub-menu')).slideUp(200);
$('.has-submenu').not($(this).parent()).removeClass('active');
// 当前菜单切换
$(this).next('.sub-menu').slideToggle(200);
$(this).parent().toggleClass('active');
});
$('.has-submenu > a').click(function(e) {
e.preventDefault();
var submenu = $(this).next('.sub-menu');
// 使用动画队列防止快速点击导致的问题
if (!submenu.is(':animated')) {
submenu.slideToggle({
duration: 300,
easing: 'easeOutQuad',
start: function() {
$(this).css('display', 'block');
}
});
}
});
// 保存状态
function saveMenuState() {
var states = [];
$('.has-submenu').each(function() {
states.push({
id: $(this).find('> a').attr('href'),
isOpen: $(this).hasClass('active')
});
});
localStorage.setItem('menuStates', JSON.stringify(states));
}
// 恢复状态
function restoreMenuState() {
var states = JSON.parse(localStorage.getItem('menuStates'));
if (states) {
states.forEach(function(state) {
var item = $('.has-submenu > a[href="' + state.id + '"]');
if (state.isOpen) {
item.next('.sub-menu').show();
item.parent().addClass('active');
}
});
}
}
// 初始化时调用
$(document).ready(function() {
restoreMenuState();
$('.has-submenu > a').click(function() {
// ...原有点击逻辑...
saveMenuState();
});
});
function checkMenuMode() {
if ($(window).width() < 768) {
// 移动端模式:默认全部折叠
$('.sub-menu').hide();
$('.has-submenu').removeClass('active');
} else {
// PC模式:根据保存状态或默认展开一级
restoreMenuState();
}
}
$(window).resize(function() {
checkMenuMode();
});
$(document).ready(function() {
checkMenuMode();
});
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jQuery折叠菜单</title>
<style>
/* 前面列出的CSS样式 */
</style>
</head>
<body>
<!-- 前面列出的HTML结构 -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
// 初始化菜单标记
$('.menu-item:has(.sub-menu)').addClass('has-submenu');
// 恢复保存的状态
function restoreMenuState() {
// 实现代码如前
}
// 响应式检查
function checkMenuMode() {
// 实现代码如前
}
// 主点击事件
$('.has-submenu > a').click(function(e) {
e.preventDefault();
// 手风琴效果
if (!$(this).parent().hasClass('active')) {
$('.sub-menu').not($(this).next('.sub-menu')).slideUp(200);
$('.has-submenu').not($(this).parent()).removeClass('active');
}
// 当前菜单动画
$(this).next('.sub-menu').stop(true, true).slideToggle(200);
$(this).parent().toggleClass('active');
// 保存状态
localStorage.setItem('menuStates', JSON.stringify(
$('.has-submenu').map(function() {
return {
id: $(this).find('> a').attr('href'),
isOpen: $(this).hasClass('active')
};
}).get()
));
});
// 初始化
checkMenuMode();
$(window).resize(checkMenuMode);
});
</script>
</body>
</html>
快速点击导致动画堆积:
stop(true, true)
清除动画队列is(':animated')
状态移动端触摸事件冲突:
$('.has-submenu > a').on('click touchstart', function(e) {
e.preventDefault();
// 处理逻辑
});
性能优化建议:
$('.menu-container').on('click', '.has-submenu > a', function(e) {
// 处理逻辑
});
通过以上步骤,您可以实现一个功能完善、用户体验良好的jQuery折叠菜单。根据实际需求,可以进一步自定义样式和交互细节。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。