下面是html代码,包括了css和js及测试的html标签,在ie6和ff3下测试通过,附详细注释以及源文件下载
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <HEAD> <TITLE> New Document </TITLE> <META NAME="Generator" CONTENT="EditPlus"> <META NAME="Author" CONTENT=""> <META NAME="Keywords" CONTENT=""> <META NAME="Description" CONTENT=""> <style type="text/css"> body { font-size: 14px; } .hrtc_popupmenu,.hrtc_popupmenu ul { margin: 0; padding: 0; list-style: none;/*取消列表样式*/ } /*顶层链接样式*/ .hrtc_popupmenu a{ display: block;/*使a链接可以撑满父标签,这样空白处也会响应事件*/ /*word-break:break-all; 文本过长自动换行*/ text-decoration: none; color: #293D6B; background: #C3D3E0; text-align:center; width: 120px;/*顶层链接宽度*/ font-weight: bold; } /*下层链接样式*/ .hrtc_popupmenu ul li a{ display: block;/*使a链接可以撑满父标签,这样空白处也会响应事件*/ /*border:1px solid black;*/ /*word-break:break-all; 文本过长自动换行*/ text-decoration: none; text-align:left; width: 190px;/*下层链接宽度*/ padding-left: 10px; } .hrtc_popupmenu a:hover{ background-color: #98B1C4; } .hrtc_popupmenu li { float:left;/*设为浮动使得第一层菜单可以水平展开*/ margin: 0; padding: 0; line-height: 20px;/*为了计算方便不设置padding属性,因此设置了该属性来控制间距*/ position: relative; z-index: 1; } .hrtc_popupmenu li ul { display:none;/*隐藏子菜单*/ position: absolute;/*设为绝对位置,不会影响父元素布局*/ z-index: 100;/*最大允许zindex*/ border:1px solid #98B1C4; } .hrtc_popupmenu li ul li { clear: left;/*下级菜单换行*/ } .hrtc_popupmenu li ul li ul{ top:0px;/*弹出式菜单偏移量*/ } </style> <SCRIPT LANGUAGE="JavaScript"> <!-- /* 该例子只是为了演示,直接创建了对象*/ var hrtc_popupmenu = { /** 返回父节点下和某个路径匹配的元素集合 @pNode 父节点 @path 例如li>a 和 xpath类似 */ selectNodes:function(pNode,path){ var nodesRes = [pNode]; var strs = path.toUpperCase().split(">"); for(var i = 0;i < strs.length;i++){ var nodesResT = []; for(j = 0;j < nodesRes.length;j++){ nodesResT = nodesResT.concat(this.searchNodes(nodesRes[j],strs[i])); } nodesRes = nodesResT; if(nodesRes.length == 0){ break; } } return nodesRes; } , /** 搜索父节点下和某个标签匹配的元素集合 @pNode 父节点 @tagName 标签名 */ searchNodes:function(pNode,tagName){ var nodesRes = []; var nodes = pNode.childNodes; for(var i = 0;i < nodes.length;i++){ if(nodes[i].nodeType == "1"){ if(tagName == "*" || nodes[i].tagName == tagName){ nodesRes.push(nodes[i]); } } } return nodesRes; } , /** 返回父节点下第一个和某个路径匹配的元素 @pNode 父节点 @path 例如li>a 和 xpath类似 */ selectNode:function(pNode,path){ var strs = path.toUpperCase().split(">"); var node = pNode; for(var i = 0;i < strs.length;i++){ node = this.searchNode(node,strs[i]); if(!node){ break; } } return node; } , /** 搜索父节点下和第一个某个标签匹配的元素 @pNode 父节点 @tagName 标签名 */ searchNode:function(pNode,tagName){ var nodes = pNode.childNodes; for(var i = 0;i < nodes.length;i++){ if(nodes[i].nodeType == "1"){ if(nodes[i].tagName == tagName){ return nodes[i]; } } } } , doOnMouseOver:function(eleUL){ eleUL.style.display = "block"; } , doOnMouseOut:function(eleUL){ eleUL.style.display = "none"; } , /** 绑定事件,为了兼容ie和ff @obj 要绑定事件的元素名 @event 事件名 @handler 处理事件 */ bindEvent:function(obj,event,handler){ if(document.all){ obj.attachEvent("on"+event,handler); }else{ obj.addEventListener(event,handler,false); } } , /** 遍历菜单树 @pNode 结点 @left 样式,左边偏移位置 */ traver:function(pNode,left){ //绑定事件和属性 if(pNode.nodeType == "1" && pNode.tagName == "UL"){ var nodesUL = this.selectNodes(pNode,"li>ul"); for(var i = 0;i < nodesUL.length;i++){ var objLi = nodesUL[i].parentNode; //子节点设为absolute后,必须设置父节点为relative,这样子节点会相对于父节点计算坐标,计算方便,直接设置为+(向右展开)/-(向左展开)width //objLi.style.position = "relative"; //这里用到了闭包,因为绑定的必须要是一个函数,并且需要把参数传进去 this.bindEvent(objLi,"mouseover",function(obj,objUL){return function(){obj.doOnMouseOver(objUL);}}(this,nodesUL[i])); this.bindEvent(objLi,"mouseout",function(obj,objUL){return function(){obj.doOnMouseOut(objUL);}}(this,nodesUL[i])); var objA = this.selectNode(objLi,"a"); nodesUL[i].style.left = left+"px"; if(left > 0){ objA.innerHTML = objA.innerHTML+" >"; }else{ objA.innerHTML = "< " + objA.innerHTML; } } } //遍历下层并设置宽度 var nodes = pNode.childNodes; for(var i = 0;i < nodes.length;i++){ if(nodes[i].nodeType == "1"){ if(nodes[i].tagName == "UL" || nodes[i].tagName == "LI"){ //每层菜单的首先出现的li的zIndex必须比后面的大否则会覆盖子层 if(nodes[i].tagName == "LI"){ nodes[i].style.zIndex = 100 - i ; } this.traver(nodes[i],left); } } } } , /** *@id 对象名 *@offset 宽度 */ bindMenu:function(id,offset){ var menu; if(typeof id == "string"){ menu = document.getElementById(id); } else { menu = id; } if(!menu || menu.nodeName != "UL"){ alert("只能绑定UL元素"); return; } //遍历第一次水平菜单 var nodesUL = this.selectNodes(menu,"li>ul"); for(var i = 0;i < nodesUL.length;i++){ var objLi = nodesUL[i].parentNode; //这里无需设置relative因为是向下弹出菜单,下级菜单样式并非absolute //objLi.style.position = "relative"; this.bindEvent(objLi,"mouseover",function(obj,objUL){return function(){obj.doOnMouseOver(objUL);}}(this,nodesUL[i])); this.bindEvent(objLi,"mouseout",function(obj,objUL){return function(){obj.doOnMouseOut(objUL);}}(this,nodesUL[i])); } var nodes = this.selectNodes(menu,"li"); if (nodes.length > 0){ //除了最优边的菜单都往右侧弹出,最右边的菜单往左侧弹出 for(var i = 0;i < nodes.length - 1;i++){ this.traver(nodes[i],offset); } this.traver(nodes[nodes.length - 1],-offset); } } } window.onload = function(){ hrtc_popupmenu.bindMenu("hrtc_popupmenu",190); } //--> </SCRIPT> </HEAD> <BODY> <div style="float:left;"> <ul id="hrtc_popupmenu" class="hrtc_popupmenu"> <li><a href="#">菜单11</a></li> <li><a href="#">菜单12</a> <ul> <li><a href="#">菜单121</a></li> <li> <a href="#">菜单122</a> <ul> <li><a href="#">菜单1221</a></li> <li> <a href="#">菜单1222</a> <ul> <li><a href="#">菜单1221</a></li> <li><a href="#">菜单1222</a></li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单123</a></li> </ul> </li> <li><a href="#">菜单13</a> <ul> <li><a href="#">菜单12111111111111111</a></li> <li> <a href="#">菜单122</a> <ul> <li><a href="#">菜单1221</a></li> <li> <a href="#">菜单1222</a> <ul> <li><a href="#">菜单1221</a></li> <li><a href="#">菜单1222</a></li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单123</a> <ul> <li><a href="#">菜单121</a> <ul> <li><a href="#">菜单121</a></li> <li> <a href="#">菜单122</a> <ul> <li><a href="#">菜单1221</a></li> <li> <a href="#">菜单1222</a> <ul> <li><a href="#">菜单1221</a></li> <li><a href="#">菜单1222</a></li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单123</a></li> </ul> </li> <li> <a href="#">菜单122</a> <ul> <li><a href="#">菜单1221</a></li> <li> <a href="#">菜单1222</a> <ul> <li><a href="#">菜单1221</a></li> <li><a href="#">菜单1222</a></li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单123</a></li> </ul> </li> </ul> </li> <li><a href="#">菜单13</a> <ul> <li><a href="#">菜单121</a></li> <li> <a href="#">菜单122</a> <ul> <li><a href="#">菜单1221</a></li> <li> <a href="#">菜单1222</a> <ul> <li><a href="#">菜单1221</a></li> <li><a href="#">菜单1222</a></li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单123</a> <ul> <li><a href="#">菜单121</a> <ul> <li><a href="#">菜单121</a></li> <li> <a href="#">菜单122</a> <ul> <li><a href="#">菜单1221</a></li> <li> <a href="#">菜单1222</a> <ul> <li><a href="#">菜单1221</a></li> <li><a href="#">菜单1222</a></li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单123</a></li> </ul> </li> <li> <a href="#">菜单122</a> <ul> <li><a href="#">菜单1221</a></li> <li> <a href="#">菜单1222</a> <ul> <li><a href="#">菜单1221</a></li> <li><a href="#">菜单1222</a></li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单123</a></li> </ul> </li> </ul> </li> <li><a href="#">菜单13</a> <ul> <li><a href="#">菜单121</a></li> <li> <a href="#">菜单122</a> <ul> <li><a href="#">菜单1221</a></li> <li> <a href="#">菜单1222</a> <ul> <li><a href="#">菜单1221</a></li> <li><a href="#">菜单1222</a></li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单123</a> <ul> <li><a href="#">菜单121</a> <ul> <li><a href="#">菜单121</a></li> <li> <a href="#">菜单122</a> <ul> <li><a href="#">菜单1221</a></li> <li> <a href="#">菜单1222</a> <ul> <li><a href="#">菜单1221</a></li> <li><a href="#">菜单1222</a></li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单123</a></li> </ul> </li> <li> <a href="#">菜单122</a> <ul> <li><a href="#">菜单1221</a></li> <li> <a href="#">菜单1222</a> <ul> <li><a href="#">菜单1221</a></li> <li><a href="#">菜单1222</a></li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单123</a></li> </ul> </li> </ul> </li> <li><a href="#">菜单14</a> <ul> <li><a href="#">菜单121</a></li> <li> <a href="#">菜单122</a> <ul> <li><a href="#">菜单1221</a></li> <li> <a href="#">菜单1222</a> <ul> <li><a href="#">菜单1221</a></li> <li><a href="#">菜单1222</a></li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单123</a> <ul> <li><a href="#">菜单121</a> <ul> <li><a href="#">菜单121</a></li> <li> <a href="#">菜单122</a> <ul> <li><a href="#">菜单1221</a></li> <li> <a href="#">菜单1222</a> <ul> <li><a href="#">菜单1221</a></li> <li><a href="#">菜单1222</a></li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单123</a></li> </ul> </li> <li> <a href="#">菜单122</a> <ul> <li><a href="#">菜单1221</a></li> <li> <a href="#">菜单1222</a> <ul> <li><a href="#">菜单1221</a></li> <li><a href="#">菜单1222</a></li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单1223</a></li> </ul> </li> <li><a href="#">菜单123</a></li> </ul> </li> </ul> </li> </ul> </div> </BODY> </HTML>
参考了下面纯css实现的三级菜单,下面的例子有一系列大概六篇文章,不过是偶然搜到的,现在完整的找不到了。谁知道能告诉我下。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>三级dropdown弹出菜单</title> <style type="text/css"> /* common styling */ .menu {font-family: arial, sans-serif; width:750px; position:relative; margin:0; font-size:11px; margin:50px 0;} .menu ul li a, .menu ul li a:visited {display:block; text-decoration:none; color:#000;width:104px; height:20px; text-align:center; color:#fff; border:1px solid #fff; background:#710069; line-height:20px; font-size:11px; overflow:hidden;} .menu ul {padding:0; margin:0;list-style-type: none; } .menu ul li {float:left; margin-right:1px; position:relative;} .menu ul li ul {display: none;} /* specific to non IE browsers */ .menu ul li:hover a {color:#fff; background:#36f;} .menu ul li:hover ul {display:block; position:absolute; top:21px; left:0; width:105px;} .menu ul li:hover ul li a.hide {background:#6a3; color:#fff;} .menu ul li:hover ul li:hover a.hide {background:#6fc; color:#000;} .menu ul li:hover ul li ul {display: none;} .menu ul li:hover ul li a {display:block; background:#ddd; color:#000;} .menu ul li:hover ul li a:hover {background:#6fc; color:#000;} .menu ul li:hover ul li:hover ul {display:block; position:absolute; left:105px; top:0;} .menu ul li:hover ul li:hover ul.left {left:-105px;} </style> <!--[if lte IE 6]> <style type="text/css"> .menu ul li a.hide, .menu ul li a:visited.hide {display:none;} .menu ul li a:hover ul li a.hide {display:none;} .menu ul li a:hover {color:#fff; background:#36f;} .menu ul li a:hover ul {display:block; position:absolute; top:21px; left:0; width:105px;} .menu ul li a:hover ul li a.sub {background:#6a3; color:#fff;} .menu ul li a:hover ul li a {display:block; background:#ddd; color:#000;} .menu ul li a:hover ul li a ul {visibility:hidden;} .menu ul li a:hover ul li a:hover {background:#6fc; color:#000;} .menu ul li a:hover ul li a:hover ul {visibility:visible; position:absolute; left:105px; top:0; color:#000;} .menu ul li a:hover ul li a:hover ul.left {left:-105px;} </style> <![endif]--> </head> <body> <div class="menu"> <ul> <li><a class="hide" href="../menu/index.html">DEMOS</a> <!--[if lte IE 6]> <a href="../menu/index.html">DEMOS <table><tr><td> <![endif]--> <ul> <li><a href="../menu/zero_dollars.html" title="The zero dollar ads page">zero dollars</a></li> <li><a href="../menu/embed.html" title="Wrapping text around images">wrapping text</a></li> <li><a href="../menu/form.html" title="Styling forms">styled form</a></li> <li><a href="../menu/nodots.html" title="Removing active/focus borders">active focus</a></li> <li><a class="hide" href="../menu/hover_click.html" title="Hover/click with no active/focus borders">HOVER/CLICK ></a> <!--[if lte IE 6]> <a class="sub" href="../menu/hover_click.html" title="Hover/click with no active/focus borders">HOVER/CLICK > <table><tr><td> <![endif]--> <ul> <li><a href="../menu/form.html" title="Styling forms">styled form</a></li> <li><a href="../menu/nodots.html" title="Removing active/focus borders">active focus</a></li> <li><a href="../menu/hover_click.html" title="Hover/click with no active/focus borders">hover/click</a></li> </ul> <!--[if lte IE 6]> </td></tr></table> </a> <![endif]--> </li> <li><a href="../menu/shadow_boxing.html" title="Multi-position drop shadow">shadow boxing</a></li> <li><a href="../menu/old_master.html" title="Image Map for detailed information">image map</a></li> <li><a href="../menu/bodies.html" title="fun with background images">fun backgrounds</a></li> <li><a href="../menu/fade_scroll.html" title="fade-out scrolling">fade scrolling</a></li> <li><a href="../menu/em_images.html" title="em size images compared">em sized images</a></li> </ul> <!--[if lte IE 6]> </td></tr></table> </a> <![endif]--> </li> <li><a class="hide" href="index.html">MENUS</a> <!--[if lte IE 6]> <a href="index.html">MENUS <table><tr><td> <![endif]--> <ul> <li><a href="spies.html" title="a coded list of spies">spies menu</a></li> <li><a href="vertical.html" title="a horizontal vertical menu">vertical menu</a></li> <li><a href="expand.html" title="an enlarging unordered list">enlarging list</a></li> <li><a href="enlarge.html" title="an unordered list with link images">link images</a></li> <li><a href="cross.html" title="non-rectangular links">non-rectangular</a></li> <li><a href="jigsaw.html" title="jigsaw links">jigsaw links</a></li> <li><a href="circles.html" title="circular links">circular links</a></li> </ul> <!--[if lte IE 6]> </td></tr></table> </a> <![endif]--> </li> <li><a class="hide" href="../layouts/index.html">LAYOUTS</a> <!--[if lte IE 6]> <a href="../layouts/index.html">LAYOUTS <table><tr><td> <![endif]--> <ul> <li><a href="../layouts/bodyfix.html" title="Cross browser fixed layout">Fixed 1</a></li> <li><a href="../layouts/body2.html" title="Cross browser fixed layout">Fixed 2</a></li> <li><a href="../layouts/body4.html" title="Cross browser fixed layout">Fixed 3</a></li> <li><a href="../layouts/body5.html" title="Cross browser fixed layout">Fixed 4</a></li> <li><a href="../layouts/minimum.html" title="A simple minimum width layout">minimum width</a></li> </ul> <!--[if lte IE 6]> </td></tr></table> </a> <![endif]--> </li> <li><a class="hide" href="../boxes/index.html">BOXES</a> <!--[if lte IE 6]> <a href="../boxes/index.html">BOXES <table><tr><td> <![endif]--> <ul> <li><a href="spies.html" title="a coded list of spies">spies menu</a></li> <li><a href="vertical.html" title="a horizontal vertical menu">vertical menu</a></li> <li><a href="expand.html" title="an enlarging unordered list">enlarging list</a></li> <li><a href="enlarge.html" title="an unordered list with link images">link images</a></li> <li><a href="cross.html" title="non-rectangular links">non-rectangular</a></li> <li><a href="jigsaw.html" title="jigsaw links">jigsaw links</a></li> <li><a href="circles.html" title="circular links">circular links</a></li> </ul> <!--[if lte IE 6]> </td></tr></table> </a> <![endif]--> </li> <li><a class="hide" href="../mozilla/index.html">MOZILLA</a> <!--[if lte IE 6]> <a href="../mozilla/index.html">MOZILLA <table><tr><td> <![endif]--> <ul> <li><a href="../mozilla/dropdown.html" title="A drop down menu">drop down menu</a></li> <li><a href="../mozilla/cascade.html" title="A cascading menu">cascading menu</a></li> <li><a href="../mozilla/content.html" title="Using content:">content:</a></li> <li><a href="../mozilla/moxbox.html" title=":hover applied to a div">mozzie box</a></li> <li><a href="../mozilla/rainbow.html" title="I can build a rainbow">rainbow box</a></li> <li><a href="../mozilla/snooker.html" title="Snooker cue">snooker cue</a></li> <li><a href="../mozilla/target.html" title="Target Practise">target practise</a></li> <li><a href="../mozilla/splittext.html" title="Two tone headings">two tone headings</a></li> <li><a href="../mozilla/shadow_text.html" title="Shadow text">shadow text</a></li> </ul> <!--[if lte IE 6]> </td></tr></table> </a> <![endif]--> </li> <li><a class="hide" href="../ie/index.html">EXPLORER</a> <!--[if lte IE 6]> <a href="../ie/index.html">EXPLORER <table><tr><td> <![endif]--> <ul> <li><a href="../ie/exampleone.html" title="Example one">example one</a></li> <li><a href="../ie/weft.html" title="Weft fonts">weft fonts</a></li> <li><a href="../ie/exampletwo.html" title="Vertical align">vertical align</a></li> </ul> <!--[if lte IE 6]> </td></tr></table> </a> <![endif]--> </li> <li><a class="hide" href="../opacity/index.html">OPACITY</a> <!--[if lte IE 6]> <a href="../opacity/index.html">OPACITY <table><tr><td> <![endif]--> <ul> <li><a href="../opacity/colours.html" title="colour wheel">opaque colours</a></li> <li><a href="../opacity/picturemenu.html" title="a menu using opacity">opaque menu</a></li> <li><a href="../opacity/png.html" title="partial opacity">partial opacity</a></li> <li><a href="../opacity/png2.html" title="partial opacity II">partial opacity II</a></li> <li><a class="hide" href="../menu/hover_click.html" title="Hover/click with no active/focus borders">< HOVER/CLICK</a> <!--[if lte IE 6]> <a class="sub" href="../menu/hover_click.html" title="Hover/click with no active/focus borders">< HOVER/CLICK <table><tr><td> <![endif]--> <ul class="left"> <li><a href="../menu/form.html" title="Styling forms">styled form</a></li> <li><a href="../menu/nodots.html" title="Removing active/focus borders">active focus</a></li> <li><a href="../menu/hover_click.html" title="Hover/click with no active/focus borders">hover/click</a></li> </ul> <!--[if lte IE 6]> </td></tr></table> </a> <![endif]--> </li> </ul> <!--[if lte IE 6]> </td></tr></table> </a> <![endif]--> </li> </ul> </div> </body> </html>