首页 > 代码库 > 菜单的那些事儿(一)
菜单的那些事儿(一)
菜单的那些事儿(一)
首先呢,先做简单的二级导航菜单,在这里,我们用伪类的方法来实现鼠标点击出现二级菜单的效果,代码如下:
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>demo1</title> <style type="text/css"> *{ margin: 0; padding: 0; list-style: none; } body{ font-size: 24px; } #nav{ width: 600px; height: 40px; background-color: #eee; margin: 0 auto; } ul li{ line-height: 40px; text-align: center; float: left; position: relative; } a{ display: block; text-decoration: none; padding: 0 10px; color: #000; height: 40px; } a:hover{ color: #fff; background-color: #000; } ul li ul li{ float: none; /*在这里注意float:none和clear的区别*/ background-color: #eee; margin-top: 2px; } ul li ul{ position: absolute; left: 0; top: 40px; display: none; } ul li:hover ul{ display: block; } </style> </head> <body> <div id="nav"> <ul> <li><a href="http://www.mamicode.com/#">首页</a></li> <li><a href="http://www.mamicode.com/#">课程大厅</a> <ul> <li><a href="http://www.mamicode.com/#">HTML</a></li> <li><a href="http://www.mamicode.com/#">CSS</a></li> <li><a href="http://www.mamicode.com/#">Javascript</a></li> <li><a href="http://www.mamicode.com/#">JQuery</a></li> </ul> </li> <li><a href="http://www.mamicode.com/#">学习中心</a></li> <li><a href="http://www.mamicode.com/#">经典案例</a></li> <li><a href="http://www.mamicode.com/#">关于我们</a></li> </ul> </div> </body></html>
在这里,我们还是要注意一下,在中间的注释部分,特意强调了float:none和clear的区别;另外,hover方法对于低版本的ie浏览器兼容不太好,在这里,我们可以通过Javascript或是jquery方法来兼容低版本的ie浏览器。
Javascript方法:
首先,我们要在课程大厅的li标签上加上方法,<li onm ouseover="showsubmenu(this)" onm ouseout="hiddensubmenu(this)">,Javascript代码如下
<script type="text/javascript"> function showsubmenu(li){ var submenu = li.getElementsByTagName(‘ul‘)[0]; submenu.style.display = ‘block‘; } function hiddensubmenu(li){ var submenu = li.getElementsByTagName(‘ul‘)[0]; submenu.style.display = ‘none‘; }</script>
我们分别定义了两个函数,先使用DOM方法获得li标签的第一ul标签,然后进行相应的操作。
下面我们再看一看jquery方法:(注意:在使用前需要引入jquery,由于)
<script type="text/javascript"> //这种使用的是jquery方法,在使用前需要引入jquery $(document).ready(function(){ $(‘.submenu‘).mouseover(function(){ $(this).children("ul").show(); }); $(‘.submenu‘).mouseout(function(){ $(this).children("ul").hide(); }); }); </script>
接下来,我们要对我们菜单进行一点升级改造,我们想要鼠标经过的时候,导航菜单进行中英文切换,代码如下:
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>demo2</title> <style type="text/css"> .top-nav { font-size: 12px; font-weight: bold; list-style: none; border-bottom: 8px solid #DC4E1B; overflow: auto; } .top-nav li { float: left; margin-right: 1px; } .top-nav li a { line-height: 20px; text-decoration: none; background: #DDDDDD; color: #666666; display: block; width: 80px; text-align: center; } /*设置正常状态英文菜单隐藏*/ .top-nav li a span{ display: none; } /*鼠标移动到链接上面时将英文菜单显示*/ .top-nav li:hover span{ display: block; } /*鼠标移动到链接上面时将中文菜单位置上移*/ .top-nav li:hover{ margin-top: -20px; } </style> </head> <body> <ul class="top-nav"> <li><a href="http://www.mamicode.com/#">首页<span>Home</span></a></li> <li><a href="http://www.mamicode.com/#">课程大厅<span>Course</span></a></li> <li><a href="http://www.mamicode.com/#">学习中心<span>Learn</span></a></li> <li><a href="http://www.mamicode.com/#">关于我们<span>About</span></a></li> </ul> </body></html>
下面,我们利用前面的基础继续对我们的菜单进行升级改造,我们用前面的基础做一个简单的三级菜单,代码如下:
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>demo3</title> <style type="text/css"> *{ margin: 0px; padding: 0px; } ul{ list-style: none; } .top-nav { font-size: 12px; font-weight: bold; list-style: none; } .top-nav li { float: left; margin-right: 1px; position: relative; } .top-nav li a { line-height: 20px; text-decoration: none; background: #DDDDDD; color: #666666; display: block; width: 80px; text-align: center; } .top-nav li a:hover { background-color: darkred; color: white; } .top-nav li ul{ display: none; } .top-nav li:hover ul{ display: block; width: 80px; position: absolute; top: 20px; left: 0px; } .top-nav li:hover ul li ul{ display: none; } .top-nav li ul li:hover ul{ display: block; width: 80px; position: absolute; top: 0px; left: 80px; } </style> </head> <body> <ul class="top-nav"> <li><a href="http://www.mamicode.com/#">首页</a></li> <li><a href="http://www.mamicode.com/#">课程大厅</a></li> <li><a href="http://www.mamicode.com/#">学习中心 +</a> <ul> <li><a href="http://www.mamicode.com/#">后台课程</a></li> <li><a href="http://www.mamicode.com/#">手机开发</a></li> <li><a href="http://www.mamicode.com/#">前端课程 +</a> <ul> <li><a href="http://www.mamicode.com/#">HTML</a></li> <li><a href="http://www.mamicode.com/#">CSS</a></li> <li><a href="http://www.mamicode.com/#">JavaScript</a></li> </ul> </li> </ul> </li> <li><a href="http://www.mamicode.com/#">关于我们</a></li> </ul> </body></html>
下面介绍Javascript方法,在前面的二级菜单中,我们是在li标签中添加了两个事件,聪敏的你肯定发现了,那样做需要改动的方法太多了,下面我们对之前的方法进行改进,代码如下:
<script type="text/javascript"> window.onload = function(){// var isIE = !!window.ActiveXObject;// var isIE6 = isIE && !window.XMLHttpRequest;// if(isIE6){ var Lis = document.getElementsByTagName(‘li‘); for(var i=0;i<Lis.length;i++){ Lis[i].onmouseover = function(){ var u = this.getElementsByTagName(‘ul‘)[0]; if(u !== undefined){ u.style.display = ‘block‘; } }; Lis[i].onmouseout = function(){ var u = this.getElementsByTagName(‘ul‘)[0]; if(u !== undefined){ u.style.display = ‘none‘; } }; } }// } </script>
(要是想兼容ie6,去掉注释就行了),用这种方法我们不需要对html代码进行任何操作,直接引进html内容就行了。另外if(u !== undefined)此段代码判断了若li下面的第一个ul标签存在时,则执行,不加此判断会报错。
下面是jquery方法:
$(document).ready(function(){ if($.browser.msie && $.browser.version.substr(0,1)<7){ $("li").has(‘ul‘).mouseover(function(){ $(this).children(‘ul‘).css(‘display‘,‘block‘) }).mouseout(function(){ $(this).children(‘ul‘).css(‘display‘,‘none‘) }); } });
经常我们看到的鼠标放在一级菜单上,二级菜单是有动画效果的,哟ucss3基础的,做出动画效果很简单,但是大家都知道,css3对于低版本的兼容不是太好,接下来我们先用css3的方法做简单的动画效果,我们会尽可能的使用css3中的新方法,代码如下:
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>demo4</title> <style type="text/css"> *{ margin: 0; padding: 0; text-decoration: none; list-style: none;} a{color: #000;background-color: #eee;} a:hover{color: #fff;background-color: aqua;} /**/ .top-nav{width: 450px;height: 40px;font-size: 24px;line-height: 40px;text-align: center;margin: 0 auto;position: relative;} .top-nav li{float: left;} .top-nav li a{display: block;width: 100px;margin-right: 2px;} .top-nav li ul{position: absolute;top: 50px;left: 0;} /*.top-nav li li{float: none;margin-top: 2px;}*/ .top-nav li ul{display: none;} .sjx{display:block; width:0; height:0; border-width:0 10px 10px; border-style:solid; border-color:transparent transparent #eee; position:absolute; } .one{top:-10px; left:140px;} .two{top:-10px; left:240px;} /*.top-nav li:hover ul{display: block;}*/ </style> </head> <body> <ul class="top-nav"> <li><a href="http://www.mamicode.com/#">首页</a></li> <li><a href="http://www.mamicode.com/#">课程大厅</a> <ul> <span class="sjx one"></span> <li><a href="http://www.mamicode.com/#">HTML</a></li> <li><a href="http://www.mamicode.com/#">CSS</a></li> <li><a href="http://www.mamicode.com/#">JavaScript</a></li> </ul> </li> <li><a href="http://www.mamicode.com/#">学习中心</a> <ul> <span class="sjx two"></span> <li><a href="http://www.mamicode.com/#">后台课程</a></li> <li><a href="http://www.mamicode.com/#">手机开发</a></li> <li><a href="http://www.mamicode.com/#">前端课程</a></li> </ul> </li> <li><a href="http://www.mamicode.com/#">关于我们</a></li> </ul> </body></html>
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>demo5</title> <style type="text/css"> /*通用基础样式*/ *{margin: 0;padding: 0;list-style: none;text-decoration: none;} body{font: 18px "微软雅黑";} a{color: #963;font-weight: bold;} a:hover{color: #fff;text-shadow: 0 4px 2px #963;background-image: linear-gradient(#111,#444);} ul{background-color: #111;background-image: linear-gradient(#444,#111);border-radius: 5px;box-shadow: 1px 0 0 #444;} /*一级菜单*/ .top-nav{width: 900px;height: 40px;box-shadow: 0 1px 1px #777;margin: 0 auto;} .top-nav li{float: left;line-height: 40px;text-align: center;border-right: 1px solid #444;position: relative;} .top-nav li:last-child{border-right-style: none;} .top-nav li a{display: block;width: 100px;padding: 0 10px;} /*二级菜单*/ /*.top-nav li ul{display: block;}*/ .top-nav li ul{float: none;position: absolute;top: 38px;left: 0;z-index: 2;} .top-nav li ul{opacity: 0;margin: -100px 0 0 0;transition: all .2s ease-in-out;} .top-nav li:hover>ul{opacity: 1;margin: 0;} .top-nav ul li{border: 0;box-shadow: 0 2px 2px #000;} .top-nav ul li:first-child{border-radius: 3px 3px 0 0;} .top-nav ul li:last-child{border-radius: 0 0 3px 3px;} /*三级菜单*/ .top-nav ul ul{position: absolute;top: 0;left: 118px;z-index: 4;} .top-nav ul ul{opacity: 0;margin: 0 0 0 -100px;transition: all .2s ease-in-out;} .top-nav li li:hover>ul{opacity: 1;margin: 0;} /*三角效果的实现*/ .top-nav ul li:first-child a:before{ content: ""; display: block; position: absolute; left: 50px; top: -6px; border-left: 6px solid transparent; border-right: 6px solid transparent; border-bottom: 6px solid aqua; } .top-nav ul ul li:first-child a:before{ content: ""; display: block; position: absolute; left: -12px; top: 17px; border-top: 6px solid transparent; border-right: 6px solid aqua; border-bottom: 6px solid transparent; } </style> </head> <body> <ul class="top-nav"> <li><a href="http://www.mamicode.com/#">首页</a></li> <li><a href="http://www.mamicode.com/#">课程大厅</a></li> <li><a href="http://www.mamicode.com/#">学习中心</a> <ul> <li><a href="http://www.mamicode.com/#">后台课程</a></li> <li><a href="http://www.mamicode.com/#">手机开发</a></li> <li><a href="http://www.mamicode.com/#">前端课程</a> <ul> <li><a href="http://www.mamicode.com/#">HTML</a></li> <li><a href="http://www.mamicode.com/#">CSS</a></li> <li><a href="http://www.mamicode.com/#">JavaScript</a></li> </ul> </li> </ul> </li> <li><a href="http://www.mamicode.com/#">关于我们</a></li> </ul> </body></html>
在上那个面的例子中,css3新增的很多方法都有使用到,但是在低版本的浏览器中,我们应该如何去实现我们想要的动画效果呢?拿demo4来说,我们可以在代码中添加如下的Javascript代码:(在这之前我们需要给需要的li标签加上id,还需要在css代码中添加.top-nav li ul{height: 0;overflow: hidden;})
window.onload = function(){ var Lis = document.getElementsByTagName("li"); for(var i=0;i<Lis.length;i++){ Lis[i].onmouseover = function(){ var u = this.getElementsByTagName("ul")[0]; if(u!=undefined){ u.style.display = "block"; AddH(u.id); } }; Lis[i].onmouseleave = function(){ var u = this.getElementsByTagName("ul")[0]; if(u!=undefined){ u.style.display = "none"; SubH(u.id); } }; } } function AddH(id){//缓慢增加高度 var ulList = document.getElementById(id); var h = ulList.offsetHeight; h += 1; if(h<49){ ulList.style.height = h + "px"; setTimeout("AddH(‘"+id+"‘)",10); }else{ ulList.style.height = 50 + "px"; } } function SubH(id){//缓慢减少高度 var ulList = document.getElementById(id); var h = ulList.offsetHeight; h -=1; if(h>0){ ulList.style.height = h + "px"; setTimeout("SubH(‘"+id+"‘)",10); }else{ ulList.style.height = 0 + "px"; } }
聪明的你也肯定看出了,我们可以对上面的代码进行一定程度的优化
window.onload = function(){ var Lis = document.getElementsByTagName("li"); for(var i=0;i<Lis.length;i++){ Lis[i].onmouseover = function(){ var u = this.getElementsByTagName("ul")[0]; if(u!=undefined){ u.style.display = "block"; ChangeH(u.id,1); } }; Lis[i].onmouseleave = function(){ var u = this.getElementsByTagName("ul")[0]; if(u!=undefined){ u.style.display = "none"; ChangeH(u.id,-1); } }; } } function ChangeH(id, count) { // 根据ID找到ulList,同时得到其高度 var ulList = document.getElementById(id); var h = ulList.offsetHeight; h += count; if (count > 0) { if (h <= 42) { // 将高度赋值给ulList,同时,不断调用本函数 ulList.style.height = h + "px"; setTimeout("ChangeH(‘" + id + "‘,1)", 10); } else { return; } } else { if (h > 0) { // 将高度赋值给ulList,同时,不断调用本函数 ulList.style.height = h + "px"; setTimeout("ChangeH(‘" + id + "‘,-1)", 10); } else { ulList.style.display = "none"; return; } } }
小结:这两天的学习,虽然说学习的新东西不多,但是加深之前对于一些概念的理解,然我对前面的一些只是进行了回顾。比如说在设置菜单横向排列的时候用到的浮动float,后面又需要对浮动进行清除clear,或者说我们有时候还可以用overflow进行清除,到底什么时候该用哪种方法?优势在哪里,这些都是我们需要考虑到的。有时候这样还是不能得到我们想要的效果,我们就要对其position进行思考了,到底是应该用相对定位还是绝对定位,或者说我们有时候会用到固定定位。以前的话可以觉得:hover伪类只用在a标签上,后面才发现原来不是那么回事,后面的css3中它对其他标签也是可以使用的,在高版本的浏览器中会得到我们想要的效果,但是在低版本的ie浏览器中并不是那么支持,在考虑兼容的方法时,我们就需要用到Javascript或是jquery来帮助我们了,说道这两个,感觉有点倾向于jquery,毕竟这是前辈们画了好多时间和精力完成的,他们考虑的问题肯定比自己编写Javascript代码考虑的问题多,然后使用起来,感觉比Javascript简单,所使用的代码量也少了好多。下面说说Javascript里面用到的知识点:DOM方法,for循环,简单的数组(都算不上吧),判断,setTimeout函数的使用……这些东西前面自己都学过,但是用起来,在没学之前,是肯定不知道这个还能这么用的。后面使用的css3就更神奇了,用短短的代码就能实现Javascript或是jquery很多代码才能完成的工作,真的很神奇。慢慢的对这些东西越来越有种说不出的感觉了。
(多点思考,多点总结,慢慢的将前面的知识融会贯通,然后还要对前面的有所突破)
后面的时间我想一边学习jquery一边做点东西,做出有效果的页面真的是件很有趣的事!
Just do it!
菜单的那些事儿(一)