最近对菜单进行了一项改造,在这里给大家分享一下成果。
我们在网上可以看到很多这样的菜单代码,但你会发现,无一例外的会出现因窗口变小后,菜单出现层次问题。为彻底解决这样的问题,我对其进行了一个优化:
1.保持原有的菜单层次结构为基础:
即:
<ul>
<li><a href="###">1级菜单</a>
<ul>
<li>2级子菜单</li>
<li><a href="###">2级子菜单</a>
<ul>
<li><a href="###">3级子菜单</a></li>
</ul>
</li>
</ul>
</li>
</ul>
优化为:
<ul id="menu">
<li id="parent_1" class="parent"><a href="###">1级菜单</a>
<div id="child_1">
<ul>
<li>2级子菜单</li>
<li><a href="###">2级子菜单</a>
<ul>
<li><a href="###">3级子菜单</a></li>
</ul>
</li>
</ul>
</div>
</li>
</ul>
2.在BODY的最外层添加一个临时<div>,用来显示菜单用的。
3.我这里就图方便了,JS就引用jQuery库了。
4.原理就是处理1级菜单(有样式parent标示:$(".parent") )的MouseOver事件,将对应(通过id对应:如parent_1对应child_1)的2级层次的菜单内容代码赋值给临时DIV,然后把临时DIV显示在对应位置。
5.通过CSS控制,临时DIV中的3级菜单也会自动的在鼠标hover上去时出现。
6.通过CSS expression,还能对出现的3级子菜单的位置自动出现在适当的位置,这样可以解决窗口太小的时候子菜单看不见的问题。
原理就是以上所说的了,下面贴一下实际的代码吧(调试时要注意jQuery路径)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 |
<!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="X-UA-Compatible" content="IE=EmulateIE7" /> <title>DIV+CSS+JS智能导航菜单--Lupin's Blog-原中华最网</title> <script src="~/jquery/jquery-1.4.1.min.js"></script> <script> $(document).ready(function() { var oldMenuId = ""; $(".parent").hover(function() { var parentid = $(this).parent("li").attr("id"); if (parentid != null && parentid != "") { if (oldMenuId != parentid) { var child = $("#" + parentid.replace("parent", "child")); $("#tmpmenu").html(child.html()); var yy = $("#" + parentid).offset().top + 30 - $(window).scrollTop(); var xx = $("#" + parentid).offset().left - $(window).scrollLeft(); if ((xx + $("#tmpmenu").width()) > $(window).width()) { xx = $(window).width() - $("#tmpmenu").width(); } $("#tmpmenu").css({ top: yy, left: xx }); $("#tmpmenu").show(); oldMenuId = parentid; } } }, null); $("#tmpmenu").hover(null, hideMenu); $(window).resize(hideMenu); //此处可以自行添加控制菜单的显示条件。 function hideMenu() { $("#tmpmenu").hide(); oldMenuId = ""; } }); </script> <style type="text/css"> * { padding:0; margin:0; } a,a:linked { color:#000000; } a:hover { color:blue; } /*Copyright:www.cnzui.com*/ /*横向顶层*/ #menu { background: #FAFAFA; height:30px; cursor: pointer; border:1px solid #CACACA; clear: both; float: none; cursor: pointer; position: relative; } #menu ul { float: left; position: relative; } #menu li { position:relative; float:left; display: block; overflow: visible; line-height:30px; } #menu li a { width:120px; padding:10px; overflow: hidden; } #menu li a:hover { visibility:inherit; color:Red; } /*竖向1层*/ #menu ul { position:absolute; left: -999em; top: 30px; padding: 0px 0px 10px; width:120px; background: #DADADA; cursor: pointer; border:1px solid #CACACA; } /* #menu li:hover ul,#tmpmenu li.sfhover ul { left: 0px; z-index: 100; visibility: visible; }*/ #menu li li.parent { background:blue; } #menu li li { float:none; } /*竖向2层*/ #menu ul ul { margin: -31px 0 0 120px; } /* #menu li:hover ul ul,#menu li.shover ul ul { left: -999em; } #menu li li:hover ul,#menu li li.shover ul { left: 0; } */ #menu li li li { float:none; } /*以上是一般菜单样式,也就是说有上面的样式菜单只要去掉注释了的样式就 已经是可用的了,以下的只是优化,让你的菜单更加强悍智能!*/ /*临时DIV样式*/ #tmpmenu { position:fixed; z-index:10005; top: 120px; left:40px; line-height: 150%; display:none; background: #FAFAFA; } #tmpmenu ul { padding: 0px 0px 5px;/*下拉菜单下面的空白间隙*/ background: #FAFAFA; width: 120px; border:1px solid #CACACA; } #tmpmenu li { position: relative; } #tmpmenu li a { height: 30px; line-height: 30px; text-decoration: none; } #tmpmenu li a { margin: 0px 1px; padding: 0 0 0 10px; height: auto; float:right; display: block; width: 108px; } #tmpmenu .separator, #tmpmenu li .separator { margin: 2px 1px; background:#EAEAEA; /*background: 此处可以定义菜单分隔符的背景图;*/ height: 1px; float:right; display: block; width: 115px; } #tmpmenu li a.parent { /*background: 此处可以定义有子菜单的2层菜单的小箭头图;*/ } #tmpmenu ul li:hover a { background:#EAEAEA; } #tmpmenu ul li:hover li a { background:#FAFAFA; } #tmpmenu ul li li:hover a { background:#EAEAEA; } /*临时DIV中的下级子目录样式*/ #tmpmenu ul ul { position:absolute; padding: 0px 0px 5px; margin: -2px 0 0 120px; left: -999em; z-index:10; } #tmpmenu li li { float:none; } #tmpmenu ul li:hover ul { background: #FAFAFA; cursor: pointer; left:0; /*IE7不兼容之处:此代码是实现菜单智能显示之用,当窗口缩小后,在右边显示菜单用户会看不到,加上此代码后菜单可以自动从左边弹出,可以根据需要进行取舍 left:expression(((document.getElementById("tmpmenu").offsetLeft+this.parentNode.offsetWidth)>=document.body.clientWidth)?(document.getElementById("tmpmenu").scrollLeft-2*document.getElementById("tmpmenu").offsetWidth+3)+"px":"0");*/ top:0px; } </style> </head> <body> <div id="tmpmenu"></div> <ul id="menu"> <li><a href="http://www.cnzui.com">首页</a></li> <li id="parent_1"><a href="http://www.cnzui.com/archives/category/technical_documents" class="parent">技术文章</a> <div id="child_1"><ul> <li><a href="http://www.cnzui.com/archives/tag/javascript">JS相关</a></li> <li><a href="http://www.cnzui.com/archives/tag/c" class="parent">C++相关</a> <ul> <li><a href="http://www.cnzui.com/archives/tag/wxwidgets">WxWidgets</a></li> <li><a href="http://www.cnzui.com/archives/tag/windows">MFC</a></li> <li class="separator"></li> <li><a href="http://www.cnzui.com/archives/tag/programing">周边编程</a></li> </ul> </li> <li class="separator"></li> <li><a href="http://www.cnzui.com/archives/category/technical_documents">Web相关</a> <ul> <li><a href="http://www.cnzui.com/archives/tag/javascript">JavaScript</a></li> <li><a href="http://www.cnzui.com/archives/tag/flash">Flash</a></li> <li><a href="http://www.cnzui.com/archives/tag/programing">周边编程</a></li> </ul> </li> </ul> </div> </li> <li><a href="http://www.cnzui.com/archives/category/qqzone">我的QQ空间</a></li> </ul> </body> </html> |
IE7不兼容调查结果:IE7对expression表达式可能存在不兼容的地方,具体已经在代码中说明,请大家斟酌使用。
除特别声明为转载内容外,本站所有内容均为作者原创,谢绝任何单位和个人不经许可的复制和转播!
对于确有转载需要的,请先与作者联系,在获得允许后烦请在转载时保留文章出处。
本文出自Lupin's Blog:http://www.cnzui.com/archives/464