菜单的效果见我的相册里面的作品截屏。 menutest.htm 实际应用测试页面 menudata.xml 菜单配置页面 menu.css 菜单样式表 webmenu.htc 封装后的htc菜单组件
原代码: ==================================== menutest.htm
<html>
<head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>新建网页 1</title> <link rel="stylesheet" type="text/css" href="Menu.css"> </head>
<body topmargin="0" leftmargin="0" oncontextmenu="Menu1.showMenu(window,Menu1.dataSource.documentElement.selectSingleNode('//MenuItem'),window.document.body,event.x,event.y)"> <div id="MenubarDiv"></Div> <WebMenu DataSource="xmlData" class="WebMenu" id="Menu1" Width="100" Effect="2" MenuType="1" Container="MenubarDiv"></WebMenu> <WebMenu DataSource="xmlData" class="WebMenu" id="Menu2" Width="100" Effect="3" MenuType="0" Container="MenubarDiv"></WebMenu> <textarea rows="17" id="Code" cols="73" style="display:none"></textarea><XML ID="xmlData" SRC="MenuData.xml"></XML> </body>
</html> ========================================= menudata.xml <?xml version="1.0" encoding="gb2312"?> <Root> <MenuItem hasSub="1" subWidth="160" > <MenuItem Func="" Text="一级菜单项1" img="save.gif"/> <MenuItem Func="" Text="一级菜单项2" img="addNew.gif" hasSub="1" HeadColumn="2" subWidth="200"> <MenuItem Func="" isCheckItem="1" checked="1" Text="二级级菜单项3" img=""/> <MenuItem Func="" isCheckItem="1" checked="1" Text="二级级菜单项3" img=""/> <MenuItem Func="" isCheckItem="1" Text="二级级菜单项3" img="addnew.gif"/> <MenuItem Func="" isCheckItem="1" Text="二级级菜单项3" img=""/> <MenuItem Func="" isCheckItem="1" Text="二级级菜单项3" img=""/> <MenuItem Func="" isCheckItem="1" Text="二级级菜单项3" img=""/> <MenuItem Func="" isCheckItem="1" Text="二级级菜单项3" img=""/> <MenuItem Func="" isCheckItem="1" Text="二级级菜单项3" img=""/> <MenuItem Func="" isCheckItem="1" checked="1" Text="二级级菜单项3" img="save.gif"/> <MenuItem Func="" isCheckItem="1" checked="1" Text="二级级菜单项3" img=""/> <MenuItem Func="" isCheckItem="1" Text="二级级菜单项3" img=""/> <MenuItem Func="" isCheckItem="1" Text="二级级菜单项3" img=""/> <MenuItem Func="" isCheckItem="1" Text="二级级菜单项3" img=""/> <MenuItem Func="" isCheckItem="1" Text="二级级菜单项3" img=""/> <MenuItem Func="" isCheckItem="1" Text="二级级菜单项3" img=""/> <MenuItem Func="" isCheckItem="1" Text="二级级菜单项3" img=""/> <MenuItem Func="" isCheckItem="1" Text="二级级菜单项3" img=""/> </MenuItem> <MenuItem Func="" Text="一级菜单项3" img="REFRESH.GIF" hasLine="1"/> <MenuItem Func="" Text="一级菜单项4" img=""/> <MenuItem Func="" Text="一级菜单项5" img="" hasSub="1" subWidth="160"> <MenuItem Func="" Text="二级级菜单项3" img="Edit.gif" hasLine="1"/> <MenuItem Func="" Text="二级级菜单项3" img=""/> <MenuItem Func="" Text="二级级菜单项3" img="" hasSub="1" subWidth="160"> <MenuItem Func="" Text="三级级菜单项4" img="SendEmail.gif" hasLine="1"/> <MenuItem Func="" Text="三级级菜单项4" img=""/> <MenuItem Func="" Text="三级级菜单项4" img=""/> </MenuItem> </MenuItem> <MenuItem Func="" Text="一级菜单项6" img="Search.gif"/> </MenuItem> </Root> =========================================== menu.css
.WebMenu{ BEHAVIOR: url("WebMenu.htc") }
.MenuPanel { border: 1px solid #002D96; cursor:hand; filter:progid:DXImageTransform.Microsoft.Shadow(enabled=true,color=#99CCFF,direction=135,strength=3); table-layout:fixed; }
.ItemHightLightDiv { border: 1px solid #000080; background-color: #FFEEC2; position: absolute; z-index:6; height:23px; left:2px; cursor:hand; }
.ItemHighLightTable { table-layout:fixed; width:100%; height:100%; cursor:hand; }
.ItemHL { padding-left:6px; font-size: 10pt; white-space:nowrap; }
.ItemNormal { padding-left:4px; height:25px; font-size: 10pt; padding-top:2px; background-color: #F6F6F6; border-Bottom: 1px solid #F6F6F6; white-space:nowrap; }
.ItemNormalLine { padding-left:4px; padding-top:2px; height:25px; font-size: 10pt; background-color: #F6F6F6; border-Bottom: 1px solid #6A8CCB; white-space:nowrap; }
.PicColummLeftHalf { padding-left:7px; height:25px; width:26px; afilter:progid:DXImageTransform.Microsoft.gradient(startcolorstr=#E3EFFF,endcolorstr=#8EB3E7,gradientType=1); background-image:url(LeftHalf.gif); } .PicColummRightHalf { height:25px; width:26px; padding-left:5px; afilter:progid:DXImageTransform.Microsoft.gradient(startcolorstr=#8EB3E7,endcolorstr=#88AEE4,gradientType=1); background-image:url(RightHalf.gif); }
.PicColummFull { padding-left:5px; height:25px; width:26px; afilter:progid:DXImageTransform.Microsoft.gradient(startcolorstr=#DDECFE,endcolorstr=#81A9E2,gradientType=1); background-image:url(FullBG.gif); }
.DivPanel{ position: relative; height: 1px; z-index: 2; visibility:hidden; }
.MenubarHLYellow { text-align:center; padding-right:4px; padding-left:4px; padding-top: 1px; padding-bottom: 1px; filter:progid:DXImageTransform.Microsoft.gradient(startcolorstr=#FFF4CC,endcolorstr=#FFD79D,gradientType=0); border: 1px solid #000080; }
.MenubarHLBlue { text-align:center; padding-right:4px; padding-left:4px; padding-top: 1px; padding-bottom: 1px; filter:progid:DXImageTransform.Microsoft.gradient(startcolorstr=#E3EFFF,endcolorstr=#98B9E8,gradientType=0); border: 1px solid #000080; }
.Menubar{ background-color: #98B9E8; font-size: 10pt; height:24px; width:100%; cursor:hand; }
.MenubarNormal{ font-size: 10pt; white-space:nowrap; padding-left:4px; padding-right:4px; padding-top: 1px; padding-bottom: 1px; cursor:hand; border:1px solid #98B9E8; }
========================================== webmenu.htc <PUBLIC:COMPONENT> <PUBLIC:ATTACH EVENT="ondocumentready" ONEVENT="fnInit()" /> <PUBLIC:METHOD NAME="showMenu"/> <PUBLIC:PROPERTY NAME = "DataSource" /> <PUBLIC:PROPERTY NAME = "Width" /> <PUBLIC:PROPERTY NAME = "Effect" /> <PUBLIC:PROPERTY NAME = "MenuType" /> <PUBLIC:PROPERTY NAME = "Container" /> <script LANGUAGE=javascript> //初始化默认值 function fnInit(){ element.dataSource = eval("window.document.all."+DataSource); initData = element.dataSource.documentElement; if(element.MenuType=="1"){ initWindow = window; initoEle = window.document.body; window.document.childWin=null; window.document.attachEvent("oncontextmenu",function(){showMenu(initWindow,initData,initoEle,event.x,event.y)}); } else{ oMenubar = createMenuBar(); eval("window.document.all."+element.Container+".appendChild(oMenubar)") } window.document.attachEvent("onmousedown",function(){ hideMenu(window); if(!element.Menubar) return; element.Menubar.isDisplay=false; oEles = element.Menubar.getElementsByTagName("SPAN"); for(i=0;i<oEles.length;i++){ oEles[i].className="MenubarNormal"; }
}); } //建立popup窗口,该窗口从属于参数oPopup指向的窗口 function fnCreatePopup(oParentWin){ oNewChildWin = oParentWin.document.parentWindow.createPopup(); oNewChildWin.document.createStyleSheet('Menu.css'); oParentWin.document.childWin = oNewChildWin; } //菜单淡入效果,可以在页面上通过Effect属性设置。 function fadeIn(oDiv){ oDiv.style.visibility="hidden"; switch(element.Effect){ case("1")://从左到右展开 strfilter = "progid:DXImageTransform.Microsoft.GradientWipe(duration=0.5,gradientSize=0.75,motion=forward)" break; case("2")://粒子效果 strfilter = "progid:DXImageTransform.Microsoft.RevealTrans ( duration=0.5,transition=12 )" ; break; case("3")://从上到下 strfilter = "progid:DXImageTransform.Microsoft.GradientWipe ( duration=0.5,gradientSize=0.25,motion=forward,wipeStyle=1)"; break; case("4")://最普通的淡入 strfilter = "progid:DXImageTransform.Microsoft.Fade()"; break; default: strfilter = "progid:DXImageTransform.Microsoft.GradientWipe(duration=0.5,gradientSize=0.75,motion=forward)"; } oDiv.style.filter = strfilter; oDiv.filters[0].Apply(); oDiv.style.visibility="visible"; oDiv.filters[0].play(0.2); }
function showMenu(oCurrWin,NodeData,oEle,x,y){ //当前窗口尚未有子窗口,则新建子窗口,然后创建样式。 if(oCurrWin.document.childWin==null){ fnCreatePopup(oCurrWin); } oChildWin = oCurrWin.document.childWin; //如果当前窗口的子窗口存在 //如果当前将要显示的窗口内容不是之前所显示的窗口内容 //或者将要显示的窗口内容不存在,则重新写入将要显示的窗口菜单内容 if(!oCurrWin.document.body.preShowItem||oCurrWin.document.body.preShowItem!=oEle){ oChildWin.document.body.innerHTML = ""; oDiv = createBasePanel(oChildWin); oChildWin.document.body.appendChild(oDiv); for(i=0;i<NodeData.childNodes.length;i++){ oTR = createItemTemp(oDiv,oChildWin); aNode = NodeData.childNodes.item(i) fillMenuItemData(aNode,oTR,oChildWin); } createHLDiv(oChildWin); oCurrWin.document.body.preShowItem = oEle; } //如果当前将要显示的窗口已经显示,则隐藏该子窗口上的高亮区,并不再做显示菜单的动作 if(oCurrWin.document.body.preShowItem==oEle&&oChildWin.document.DivPanel.style.visibility=="visible"&&oChildWin.isOpen){ oCurrWin.document.childWin.document.body.HLDiv.style.visibility="hidden"; return } //执行显示子窗口子菜单动作 if(x&&y){ XConer = x; YConer = y; } else{ XConer = oEle.offsetWidth+oEle.offsetLeft; YConer = oEle.offsetTop; } oChildWin.show(XConer,YConer,1,1,oCurrWin.document.body); var width = oChildWin.document.body.scrollWidth; var height = oChildWin.document.body.scrollHeight; oChildWin.show(XConer,YConer,width,height,oCurrWin.document.body);
//使用淡入效果显示菜单 fadeIn(oChildWin.document.DivPanel); //禁止系统右键菜单的弹出。 try{ event.returnValue = false; } catch(e){ } } function createHLDiv(oPopup){ //创建一个鼠标移动到菜单项的高亮效果层 oHLDiv = oPopup.document.createElement("DIV"); oTable = oPopup.document.createElement("<TABLE height='100%' border=\"0\" cellspacing=\"0\" cellpadding=\"0\">"); oTBody = oPopup.document.createElement("TBODY");//TBODY是必须要的元素,不然表格无法显示 oTable.className = "ItemHighLightTable"; oHLDiv.className = "ItemHightLightDiv"; oHLDiv.appendChild(oTable); oTable.appendChild(oTBody); oTR = oTable.insertRow(); oTD = oTR.insertCell(); oTD.style.width = 22; oTD.className = "ItemHL" ; oTR.checkTD = oTD; oTD = oTR.insertCell(); oTD.style.width = 22; oTD.className = "ItemHL" ; oTR.picTD = oTD; oTD = oTR.insertCell(); oTD.style.width = 10; oTD.className = "ItemHL" ; oTD.innerHTML = " " oTD = oTR.insertCell(); oTD.className = "ItemHL" ; oTR.textTD = oTD; oTD.noWrap = true; oTD = oTR.insertCell(); oTD.style.width = 22; oTD.className = "ItemHL" ; oTD.align = "center"; oTD.style.fontFamily = "Webdings"; oHLDiv.iTable = oTable; oHLDiv.iTable.iTBody = oTBody; oPopup.document.body.appendChild(oHLDiv); oHLDiv.style.visibility="hidden"; oPopup.document.body.HLDiv = oHLDiv; } //鼠标移动高亮效果,把高亮层下面的内容取过来。 function highLight(oEle,oWin){ if(oEle.cells[0].style.display!="none"){ oWin.document.body.HLDiv.iTable.cells[0].style.width=23; oWin.document.body.HLDiv.iTable.cells[1].style.width=24; oWin.document.body.HLDiv.iTable.cells[1].style.paddingLeft = "4px"; if(oEle.cells[0].innerHTML==""){ oWin.document.body.HLDiv.iTable.cells[0].innerHTML=" "; } else{ oWin.document.body.HLDiv.iTable.cells[0].innerHTML=oEle.cells[0].innerHTML; } } oWin.document.body.HLDiv.iTable.cells[0].style.display = oEle.cells[0].style.display; oWin.document.body.HLDiv.iTable.cells[1].innerHTML=oEle.cells[1].innerHTML; oWin.document.body.HLDiv.iTable.cells[2].innerHTML=oEle.cells[2].innerHTML; oWin.document.body.HLDiv.iTable.cells[3].innerHTML=oEle.cells[3].innerHTML; oWin.document.body.HLDiv.iTable.cells[4].innerHTML=oEle.cells[4].innerHTML;
oWin.document.body.HLDiv.style.visibility="visible"; oWin.document.body.HLDiv.style.top = oEle.offsetTop+1; oChildWin.document.body.HLDiv.style.width = oEle.offsetWidth - 2; } //当鼠标移动到没有下级子菜单项上的时候,关闭下级子菜单 function hideMenu(oWin){ try{ oWin.document.childWin.document.body.HLDiv.style.visibility="hidden"; oWin.document.childWin.hide(); } catch(e){ } } //建立基板以便插入菜单项 function createBasePanel(oWin){ oDiv = oWin.document.createElement("<DIV>"); oDiv.className = "DivPanel"; oDiv.width = element.Width; oTable = oWin.document.createElement("<TABLE border=\"0\" cellspacing=\"0\" cellpadding=\"0\">"); oTable.className = "MenuPanel"; oDiv.appendChild(oTable); oWin.document.DivPanel = oDiv; oDiv.TablePanel = oTable; return(oDiv); } //建立菜单的项的模板 function createItemTemp(oDiv,oWin){ oTable = oDiv.TablePanel oTR = oTable.insertRow(); oTD = oTR.insertCell(); oTD.style.width = 25; oTD.className = "PicColummLeftHalf" ; oTR.checkTD = oTD; oTD = oTR.insertCell(); oTD.style.width = 25; oTD.className = "PicColummRightHalf" ; oTR.picTD = oTD; oTD = oTR.insertCell(); oTD.style.width = 10; oTD.className = "ItemNormal" ; oTD.innerHTML = " " oTD = oTR.insertCell(); oTD.className = "ItemNormal" ; oTR.textTD = oTD; oTD.noWrap = true; oTD = oTR.insertCell(); oTD.style.width = 25; oTD.className = "ItemNormal" ; oTD.align = "center"; oTD.style.fontFamily = "Webdings"; oTR.nextTD = oTD; return(oTR); }
//填充菜单项数据 function fillMenuItemData(oNode,oTR,oWin){ oIMG = oNode.attributes.getNamedItem("img").text; oFunc = oNode.attributes.getNamedItem("Func").text; oText = oNode.attributes.getNamedItem("Text").text; iType = oNode.attributes.getNamedItem("iType").text; blIsChecked = oNode.attributes.getNamedItem("IsChecked").text; blhasSub = oNode.attributes.getNamedItem("hasSub").text; blSplitLine = oNode.attributes.getNamedItem("SplitLine").text; iwidth = oNode.attributes.getNamedItem("width").text; if(iType=="1"){ oTR.checkTD.style.display = "none"; oTR.picTD.className = "PicColummFull"; oTR.picTD.innerHTML = " "; oTR.checkTD.innerHTML = " "; } else{ oTR.checkTD.style.display = ""; oTR.checkTD.className = "PicColummLeftHalf"; oTR.picTD.className = "PicColummRightHalf"; oTR.picTD.innerHTML = " "; oTR.checkTD.innerHTML = " "; } if(blhasSub=="1"){ oTR.nextTD.innerHTML = "4"; oTR.attachEvent("onmouseover",function(){showMenu(oWin,oNode,oTR)}) } else{ oTR.nextTD.innerHTML = " "; oTR.attachEvent("onmouseover",function(){hideMenu(oWin)}) } if(blSplitLine=="1"){ oTR.nextTD.className = "ItemNormalLine"; oTR.textTD.className = "ItemNormalLine"; oTR.blSplitLine = "1" } else{ oTR.nextTD.className = "ItemNormal"; oTR.textTD.className = "ItemNormal"; oTR.blSplitLine = "0" } if(oIMG!=""){ strimg = "<img border=\"0\" src=\""+oIMG+"\" valign=\"absmiddle\" align=\"center\" style=\"filter:progid:DXImageTransform.Microsoft.Shadow(enabled=true,color=#99CCFF,direction=135,strength=0);\">" oTR.picTD.innerHTML = strimg ; } oTR.textTD.innerText = oText; oTR.textTD.width = iwidth; oTR.attachEvent("onmouseover",function(){highLight(oTR,oWin)}) } function createMenuBar(){ BarData = element.dataSource.documentElement; oTable = window.document.createElement("TABLE"); oTable.className = "Menubar"; oTBody = window.document.createElement("TBODY"); oTable.appendChild(oTBody); oTR = oTable.insertRow(); oTD = oTR.insertCell(); oIMG = window.document.createElement("IMG") oIMG.src = "left.gif"; oIMG.valign = "absmiddle"; oTD.appendChild(oIMG); for(i=0;i<BarData.childNodes.length;i++){ oNode = BarData.childNodes.item(i); var oNewSPAN = window.document.createElement("SPAN"); oNewSPAN.className = "MenubarNormal"; oNewSPAN.NodeData = oNode; oNewSPAN.innerHTML = oNode.attributes.getNamedItem("Text").text; oNewSPAN.hasSub = oNode.attributes.getNamedItem("hasSub").text; oNewSPAN.style.width = oNode.attributes.getNamedItem("width").text; oTD.appendChild(oNewSPAN); oNewSPAN.attachEvent("onmouseover",MenuOver); oNewSPAN.attachEvent("onmousedown",MenuMouseDown); } element.Menubar = oTable; return oTable; } function MenuOver(){ hideMenu(window) oEle = event.srcElement; oEles = oEle.parentElement.getElementsByTagName("SPAN"); for(i=0;i<oEles.length;i++){ oEles[i].className="MenubarNormal"; } if(element.Menubar.isDisplay==null||(element.Menubar.isDisplay!=null&&element.Menubar.isDisplay==false)){ oEle.className = "MenubarHLYellow"; } else{ oEle.className = "MenubarHLBlue"; if(oEle.hasSub!="1") return; showMenu(window,oEle.NodeData,oEle,getAbsLeft(oEle)+2,getAbsTop(oEle)+oEle.offsetHeight+1) } } function MenuMouseDown(){ oEle = event.srcElement; element.Menubar.isDisplay = element.Menubar.isDisplay?false:true; event.srcElement.className = (oEle.className=="MenubarHLYellow")?"MenubarHLBlue":"MenubarHLYellow"; if(element.Menubar.isDisplay&&oEle.hasSub=="1") showMenu(window,oEle.NodeData,oEle,getAbsLeft(oEle)+2,getAbsTop(oEle)+oEle.offsetHeight+1); event.cancelBubble = true; } function getAbsLeft(e){ var l=e.offsetLeft; while(e=e.offsetParent){ l+=e.offsetLeft; } return l; } function getAbsTop(e){ var t=e.offsetTop; while(e=e.offsetParent){ t+=e.offsetTop; } return t; } </script> </PUBLIC:COMPONENT>

|