原创JavaScript Jquery特效之----多重特效折叠菜单(附带详细注释和算法思路)


<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>折叠菜单</title>
		<script type="text/javascript" src="js/jquery-2.1.0.js"></script>
		<script type="text/javascript" src="js/foldMenu.js" ></script>
		<style type="text/css">
			* {
				padding: 0;
				margin: 0;
			}
			#FoldingMenuBar {
				margin: 200px;;
			}
			li {
				list-style: none;
			}
			.left {
				float: left;
			}
			.TotalMenu {
				float: left;
			}
			.TotalMenu li{
				height: auto;
				overflow:auto;
			}
			.menuBody{
				position: relative;
				display: none;
			}
			.ulMenuBody{
				float:left;
				width: 220px;
			}
			.ulMenuBody{
				display: none;
				position: relative;
			}
			.ulMenuBody li{
				width: 220px;
				height: 34px;
				background: white;
				border-top: 1px solid #ccc;
				line-height: 34px;
				text-indent: 50px;
			}
			.ulMenuBody li:hover{
				background:#0099FF;
			}
			.menuHeader{
				height: 35px;
				width: 220px;
				background:#DA0A0A;
				line-height: 34px;
				cursor: pointer;
				text-align: center;
				
			}
		</style>
	</head>
	<body>
		<div id="FoldingMenuBar">
			<ul class="TotalMenu">
				<li class="firstMenu">
					<div class="menuHeader">
						<span>第一期</span>
					</div>
					<div class="menuBody">
						<ul class="ulMenuBody">
							<li><a href="#">公司名称11</a></li>
							<li><a href="#">公司名称11</a></li>
							<li><a href="#">公司名称11</a></li>
							<li><button class="PreviousPage">上一页</button>
								<button class="NextPage">下一页</button>
							</li>
						</ul>
						<ul class="ulMenuBody">
							<li><a href="#">公司名称12</a></li>
							<li><a href="#">公司名称12</a></li>
							<li><a href="#">公司名称12</a></li>
							<li><button class="PreviousPage">上一页</button>
								<button class="NextPage">下一页</button>
							</li>
						</ul>
						<ul class="ulMenuBody">
							<li><a href="#">公司名称13</a></li>
							<li><a href="#">公司名称13</a></li>
							<li><a href="#">公司名称13</a></li>
							<li><button class="PreviousPage">上一页</button>
								<button class="NextPage">下一页</button>
							</li>
						</ul>
						<ul class="ulMenuBody">
							<li><a href="#">公司名称14</a></li>
							<li><a href="#">公司名称14</a></li>
							<li><a href="#">公司名称14</a></li>
							<li><button class="PreviousPage">上一页</button>
								<button class="NextPage">下一页</button>
							</li>
						</ul>
					</div>
				</li>
				<li class="secondMenu">
					<div class="menuHeader">
						<span>第二期</span>
					</div>
					<div class="menuBody">
						<ul class="ulMenuBody">
							<li><a href="#">公司名称21</a></li>
							<li><a href="#">公司名称21</a></li>
							<li><a href="#">公司名称21</a></li>
							<li><button class="PreviousPage">上一页</button>
								<button class="NextPage">下一页</button>
							</li>
						</ul>
						<ul class="ulMenuBody">
							<li><a href="#">公司名称22</a></li>
							<li><a href="#">公司名称22</a></li>
							<li><a href="#">公司名称22</a></li>
							<li><button class="PreviousPage">上一页</button>
								<button class="NextPage">下一页</button>
							</li>
						</ul>
					</div>
				</li>
				<li class="thirdMenu">
					<div class="menuHeader">
						<span>第三期</span>
					</div>
					<div class="menuBody">
						<ul class="ulMenuBody">
							<li><a href="#">公司名称31</a></li>
							<li><a href="#">公司名称31</a></li>
							<li><a href="#">公司名称31</a></li>
							<li><button class="PreviousPage">上一页</button>
								<button class="NextPage">下一页</button>
							</li>
						</ul>
						<ul class="ulMenuBody">
							<li><a href="#">公司名称32</a></li>
							<li><a href="#">公司名称32</a></li>
							<li><a href="#">公司名称32</a></li>
							<li><button class="PreviousPage">上一页</button>
								<button class="NextPage">下一页</button>
							</li>
						</ul>
					</div>
				</li>
			</ul>
		</div>
		<div id="divTemp">
			调试输出
		</div>
	</body>
</html>

$(document).ready(function () {
	//一个menuHeader下方有一个menuBody
	var menuHeader=$(".menuHeader");
	var menuBody=$(".menuBody");
	var divTemp=document.getElementById("divTemp");
	var moveTime=300;
	var globalMoveLock=false;//全局动画锁
	menuHeader.each(function(i){
		$(this).click(function(){
			if($(menuBody[i]).css("display") == "block"){
				$(menuBody[i]).slideUp(300);
			}
			else{
				//遍历所有menuBody并且关闭所有menuBody,再打开当前menuBody
				menuBody.each(function(i){
					if($(this).css("display") == "block"){
						$(this).slideUp(300);
					}
				});
				//显示点击项(先查看menuBody[i].children是否全部隐藏,是则显示其中一项)
				var flag=false;
				$(menuBody[i].children).each(function(){
					if($(this).css("display") == "none" && $(this).css("opacity")=="1"){
						flag=true;
					}
					else{
						//本段代码似乎不可能执行到....
						flag=false;
					}
				});
				if(flag==true){
					//当menuBody[i].children全部不可见时,显示第一项
					$(menuBody[i].children[0]).css("display","block");
				}
				$(menuBody[i]).slideDown(300);
			}
		});
	});
	//获取所有上一页按钮按钮,下一页按钮
	var preBtns=$(".PreviousPage");
	var nexBtns=$(".NextPage");
	//所有上一页按钮
	preBtns.each(function(){
		$(this).click(function(){
			//$(this.parentNode.parentNode).animate({right:'220px'});
			//先获取点击区域的MenuBody,和该区域的所有ulMenuBody
			var menuBodys=this.parentNode.parentNode.parentNode;
			var ulMenuBodys=menuBodys.children
			var index=-1;
			//判断哪一个ulMenuBody是可见的,可见的即代表是当前的ulMenuBody,并记录下标
			$(ulMenuBodys).each(function(i){
				//下行判断必须用!=0而不是==1(因为需要动画执行完毕才==1)
				if($(this).css("opacity") != "0"){
					index=i;
					return false;
				}
			});
			//alert(index);
			if(ulMenuBodys[index-1]!=undefined){
				//点击上一页,整体向右动,当前块需要隐藏同时透明度设置为0,动画停止后最后透明度设置为1
				//$(ulMenuBodys[index+1]).css("display","block");
				$(menuBodys).animate({right:"-=220px"},moveTime);
				$(ulMenuBodys[index]).animate({opacity:"0"},moveTime,function(){
					$(ulMenuBodys[index]).css("opacity","1").css("display","none");
				});
			    $(ulMenuBodys[index-1]).animate({opacity:"1"},moveTime);
			}
		})
	});
	//所有下一页按钮
	nexBtns.each(function(){
		$(this).click(function(){
			//$(this.parentNode.parentNode).animate({right:'220px'});
			//先获取点击区域的MenuBody,和该区域的所有ulMenuBody
			var menuBodys=this.parentNode.parentNode.parentNode;
			var ulMenuBodys=menuBodys.children
			var index=-1;
			//判断哪一个ulMenuBody是可见的,可见的即代表是当前的ulMenuBody,并记录下标
			$(ulMenuBodys).each(function(i){
				//下行判断必须用!=0而不是==1(因为需要动画执行完毕才==1)
				if($(this).css("opacity") != "0"){
					index=i;
					//divTemp.innerHTML="index="+index;
					return false;
				}
			});
			if(ulMenuBodys[index+1]!=undefined && globalMoveLock==false){
				//moveLock();
				//先设置成可见,透明度为0,再慢慢将透明度提高到1
				$(ulMenuBodys[index+1]).css("display","block")
				.css("opacity","0")
				.animate({opacity:"1"},moveTime);
				$(menuBodys).animate({right:"+=220px"},moveTime);
			    $(ulMenuBodys[index]).animate({opacity:"0"},moveTime);
			    //divTemp.innerHTML+="index="+index;
			}
		})
	});
});

function moveUnLock()
{
	globalMoveLock=false;
}
function moveLock()
{
	globalMoveLock=true;
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。