菜单高亮效果是每个网页经常采用的设计方式,它能有效地让用户知道自己当前所在的栏目。这也是我经常采用的方式,一般的网页至少都有两级菜单,第一个是顶部的总导航条菜单,另一个是左侧的分类导航菜单。一般要求在一级菜单高亮下二级菜单也能记录当前状态。
对于一个包含顶部菜单的页头区域如果固定不变的,也就是它不用每次都重新加载,这种情况下用纯CSS或JS方式可以很容易地实现,但今天我要谈的不是这种,今天说的是一级菜单和二级菜单在每个页面中都是动态加载的,也就是它们是作为用户控件的方式载入的。这种情况下要想记录菜单的高亮状态是一件比较困难的事情。
当然,你可能会说,用cookie可以记录每个页面加载时上次记录的高亮状态,是的,它确实可以记录,但是这种方式在一些复杂的包含许多子页面的应用中,会给用户造成许多困扰和麻烦。比如在cookie生存周期内,重新打开这个项目时,此时cookie的生存周期还没有完全结束,它还记录着上次保存的状态,而这时页面地址已经发生了变化,那么当前高亮的菜单所指向的就不是用户所希望看到的页面。实践证明,这个cookie的生存周期无论你设置多长都不能完美解决用户恶意刷新页面的状况。这确实是一件糟糕的事情!
那么有没有一种较好的办法来解决这种状况呢?
答案是有的。我们知道要解决这个问题,最理想的办法是在每个页面加载时,根据页面的url地址显式地设置当前菜单的高亮样式。这能完美地解决此类问题,并且这种方式无论用户如何恶意点击刷新按钮,高亮状态依旧保持不变。 知道了原理,要实现起来就容易多了。
结构层
一级菜单结构层:
<ul id="menu">
<li><a href="default.html">首页</a></li>
<li><a href="clothing.html">服装用品</a></li>
<li><a href="house.html">家居用品</a></li>
<li><a href="cosmetic.html">化妆用品</a></li>
</ul>
可以看到在这个一级菜单中,其链接地址一般是没有参数值的。 二级菜单的结构层:
<ul id="othermenu">
<li><a href="house.html?pId=2&sId=1">日常用品</a></li>
<li><a href="house.html?pId=2&sId=2">小型家具</a></li>
<li><a href="house.html?pId=2&sId=3">电器配件</a></li>
<li><a href="house.html?pId=2&sId=4">床品套件</a></li>
<li><a href="house.html?pId=2&sId=5">婚庆床品</a></li>
<li><a href="house.html?pId=2&sId=6">儿童床品</a></li>
<li><a href="house.html?pId=2&sId=7">工艺摆设</a></li>
<li><a href="house.html?pId=2&sId=8">清洁工具</a></li>
<li><a href="house.html?pId=2&sId=9">家居清洁</a></li>
</ul>
与一级菜单不同的是,我们将二级菜单中的链接地址加入两个参数值,pId参数指向的是顶部一级菜单的的序号,而sId则是菜单自己的顺序号。我们将这两个菜单的总容器ul都设置了两个不同中的ID,它们需要在JS中调用,所以千万不能少。
样式层
关于样式,其实都没有什么特别的地方,你可以随心所意地设置成你想要的样式,只是需要注意的地方是,我们需要单独设置菜单高亮的三种状态样式,以供JS动态调用。
/*一级菜单的三种样式设置*/
#menu li a.normal{background:#fff;}//普通样式
#menu li a.over{background:#00ff00;} //翻滚样式
#menu li a.cur{background:#ff0000;color:#fff;} //高亮样式
/*二级菜单的三种样式设置*/
#othermenu li a.normal{background:#fff;} //普通样式
#othermenu li a.over{background:#AA7F00;color:#fff;} //翻滚样式
#othermenu li a.cur{background:#7F0000;color:#fff;} //高亮样式