导航是一个网站的开始,导航下面经常会有二级菜单和三级菜单,鼠标经过主导航,菜单就需要显示出来,鼠标移开,相应的导航也需要隐藏,这是这个导航伸缩显示的原理。实现这样的功能,七娃总结了一下,目前接触到的有3中类型:包含关系导航,相邻关系导航,以及今天要说的非相邻关系导航!
对于前两种:可以用css和js都能实现
1.包含/相邻关系导航
<ul>
<h3>案例</h3>
<li>
<a href=""><b>Cases1</b></a>
<a href=""><b>Cases2</b></a>
<a href=""><b>Cases3</b></a>
</li>
</ul>
针对这样的,我们只需用css将li的元素隐藏起来,h3经过的时候显示即可,连js都不需要用,如下:
ul li{dispaly:none;}
ul h3:hover li{display:block;}
或者用js实现,如下:
$("ul h3").hover(function(){
$("ul li").show();
},function(){
$("ul li").hide();
})
2.这是我们今天要讲的,不相邻元素/盒子/div的导航怎么实现呢?
七娃最开始想的是用js控制元素的隐藏和显示,和案例1一样,但是出现了bug:就是永远不能将鼠标移动到二级导航上,鼠标一旦移出一级菜单,二级菜单就隐藏了!这跟没有办法控制;然后七娃想通过二级菜单显示之后判断鼠标当前位置,是否在二级导航里面,如果是,那就不隐藏,如果不是就隐藏;不过这明显没有实现,因为利用监听元素控制鼠标一直判断位置不太友好,最后放弃改想法;
最终实现原理:js利用显示隐藏,加上计时器,然后再判断一次鼠标是否经过二级菜单;
就是说,在鼠标经过一级菜单时,二级菜单显示,鼠标移出一级菜单时触发了一个倒计时2秒的计时器,计时器回调函数进行二次判断,判断鼠标是否移入到了二级菜单里面,如果是,就不采取任何动作,否则将二级菜单隐藏;
代码如下:
$("一级导航元素").hover(function(){
$("二级导航元素").show();
},function(){
setTimeout(function(){
if($('二级导航元素').mouseenter()){
$("二级导航元素").css({"display":"block"});
}else if($('二级导航元素').mouseleave()) {
$("二级导航元素").hide();}
},2000);
})
$('二级导航元素').mouseleave(function(){
$("二级导航元素").hide();
})
这样就实现了非相邻关系下的导航显示和隐藏!其中“一级导航元素”和“二级导航元素”分别对应菜单的class名字或者id即可