全兼容可高亮二级缓冲折叠菜单


冰极峰 转贴请注明出处 2010年5月28日2:50:29


最近一段时间一直比较忙,已经有好几个月没有打理博客了。现将一个最近在项目中制作的一个菜单实例整理出来,共享一下。

在后台或OA系统中最常用到的布局往往是一个全屏布局,一般都是上中下三行两列布局,页头、页脚、左侧菜单加一个右侧ifame框架页。所以那种带折叠的二级菜单是会经常使用到的,本例便是实现这样一种比较通用的全兼容可高亮二级缓冲折叠菜单

特点:

1.全兼容,浏览器测试:IE5.5IE6IE7IE8FF3.0、谷歌、Safari 4.0Opera9.0

2. Html结构优雅简洁,无多余标签,利于程序循环输出。

3.样式与结构分离,你可以在样式表中修改不同的风格。

4.当前选中项高亮状态,一级菜单和二级菜单都可以高亮显示。

5.折叠层优雅缓冲动画。

6.最适用于后台和一些OA系统界面。

缺点:

1.不支持防刷新,这个功能在后台应用系统中应该用途不大,没有加入这个功能。

2.IE6中缓冲效果没有出来,对于IE6,就弱化一下效果。

还是先看看效果截图:

图一

简单说一下制作这样的菜单的一些简单的思路和会遇到的问题。

一般制作一个效果,我的制作流程一般是先画出HTML结构层内容,再写样式,之后是搞一些锦上添花的效果,如JS特效等等。不知各位大牛们是怎样一个流程模式。

 

结构层:

结构层的构思一般是建立在一个感性认识上的,一般是有一个效果图,根据这个效果图构建最简洁的HTML结构。如上图所示,映入眼帘的第一印象,首先是想到用一个UL的无序列表,但是这是一个二级嵌套的列表,这是我们首先需要考虑的问题。

因此结构应该是下面这样子:

<li><a href="#none">一级菜单项</a>

<ul>

<li><a href="#none">二级菜单项</a></li>         

</ul>

</li>

在有二级菜单时是一个嵌套的UL结构,无二级菜单时则是如下:

<ul class="menu">

<li><a href="#none">一级菜单项</a></li>

</ul>

当然,你也可以采用dl-dt-dd有序列表的方式来创建这种嵌套的结构,视你的实际情况而定。

有了最原始的结构层,你就需要添加一些必要的钩子,用于CSSJS控制样式和效果,我一直反对那种添加很多类名的写法,这会增加页面的体积,所以最精简的作法是应用一两个必要的类名给父容器即可,然后在样式表中用子(群)选择符设置各种个性的设置。在上面的结构,你会想到用几个类名来定义所有的样式呢?

我的做法是只用三个类名即可以控制全部的样式显示了。一个是最顶级UL,定义为class=”menu”,一个是二级菜单的容器,也就是嵌套的UL定义一个class=”level2”,最后是一级菜单项li定义一个class=”level1”,有了这三个钩子,你就可以操纵整个结构的样式了。

 

表现层:

样式表的设置都很简单,唯一要注意的是,为了便于JS控制二级菜单的显隐和记录当前选中项的高亮状态,所以我不用hover伪类来实现鼠标的滑入滑出效果,而采用JS来模拟它。用JS控制样式的关键代码如下:

一级菜单样式

1 /*一级菜单三态样式,供JS调用*/
2 .menu li.level1 a{display:block;line-height:31px;height:31px;padding-left:50px; font-size:12px;color:#fff;background:url(../images/menubg.gif) no-repeat left top;}
3 .menu li.level1 a.hove{background-position:left -31px;}
4 .menu li.level1 a.cur{background-position:left -62px;}
5 

    二级菜单样式

1 /*二级菜单三态样式,供JS调用*/
2 .menu li.level1 a{display:block;line-height:31px;height:31px;padding-left:50px; font-size:12px;color:#fff;background:url(../images/menubg.gif) no-repeat left top;}
3 .menu li.level1 a.hove{background-position:left -31px;}
4 .menu li.level1 a.cur{background-position:left -62px;}

 行为层:

因为前面已经提到,我们在样式表并没有定义菜单的三态效果,所以我们需要给每个菜单项绑定onmouseoveronmouseoutonclick事件模拟出这种效果来。在结构层中我们并没有定义这个总容器的ID,而只定义了一个class类名,所以在JS添加了一个扩展的getElementsByClassName()方法(感谢好友司徒正美),根据类名来获得这个对象。用循环闭包来绑定这三个事件。

详细代码就不一一解说了,Demo中注释得非常清楚,请下载到本机浏览。

 

有什么问题请在本博客中跟贴讨论,祝你用得开心!

根据网友的意见修改了一下源码。

最后附上全部源码:Demo下载

标签: html, css, js
posted @ 2010-05-28 02:59 Biny 阅读(6894) 评论(26) 编辑 收藏

 回复 引用 查看   
#1楼 2010-05-28 06:11 天天      
大公无私~~
 回复 引用 查看   
#2楼 2010-05-28 08:58 FLY FREE      
楼主,请问什么叫不支持仿刷新,仿刷新是啥意思?
 回复 引用 查看   
#3楼 2010-05-28 09:02 liy      
楼主的作品不错 支持一个

实实在在的

 回复 引用 查看   
#4楼[楼主] 2010-05-28 09:02 Biny      
@FLY FREE
不好意思,这个字错了,应该是“防刷新”,就是不能记忆高亮的状态,如果你点一下浏览器的刷新按钮,菜单的高亮状态就消失了。

 回复 引用 查看   
#5楼 2010-05-28 09:05 FLY FREE      
额。。明白,3Q!8错啊!
 回复 引用 查看   
#6楼[楼主] 2010-05-28 09:11 Biny      
@liy
谢谢支持!

 回复 引用 查看   
#7楼 2010-05-28 09:19 bravf      
加上cookie就可防刷新了,我就是这么做的。
 回复 引用 查看   
#8楼 2010-05-28 09:20 风枫峰      
好久没见楼主发文章了。。。。。。
 回复 引用 查看   
#9楼 2010-05-28 09:23 追寻者      
强烈支持。。
 回复 引用 查看   
#10楼[楼主] 2010-05-28 09:28 Biny      
@bravf
加cookie是一种办法,但是有副作用。
@风枫峰
呵呵,一直比较忙,没时间写文章。
@追寻者
谢谢!

 回复 引用 查看   
#11楼 2010-05-28 09:41 mozheshen      
很好很强大!
非常感谢楼主!

 回复 引用 查看   
#12楼 2010-05-28 10:17 liujiang.2018      
楼主的东西很精致,但有个问题,在IE8下这个菜单的height:100%并不正常显示。
 回复 引用 查看   
#13楼 2010-05-28 10:21 liujiang.2018      
补充一下,我是把div放在<form id="form1" runat="server"></form>里才显示不正常的,height:100%貌似就不起作用了。
 回复 引用 查看   
#14楼[楼主] 2010-05-28 10:38 Biny      
@liujiang.2018
这样使用肯定会出问题的,你重置一下form的样式,将它的高度也设置为100%。

干得非常棒。

 回复 引用 查看   
#16楼 2010-05-28 17:57 卡恩和巴拉克粉丝      
楼主的博客界面比较漂亮

能否共享

 回复 引用 查看   
#17楼[楼主] 2010-05-28 20:01 Biny      
谢谢支持!
另外根据网友反馈的信息作了一点小修改,并调整了一下缓冲的速度,请各位下载最新版本。

@卡恩和巴拉克粉丝
博客界面还是个性化一点比较好,搞得每个人都相同就没意思了。呵呵!

 回复 引用 查看   
#18楼 2010-06-08 11:12 snowsky      
很漂亮...
 回复 引用 查看   
#19楼 2010-07-14 14:13 wuyongbiao      
是有点眼睛一亮感觉
 回复 引用 查看   
#20楼 2010-07-22 00:24 baby54971      
请问一下,要实现对展开的二级菜单项再次点击就闭合的效果,该怎么修改呢?
 回复 引用 查看   
#21楼 2010-09-10 10:15 topbar      
@bravf
请问题防刷新怎么修改呀,我搞了三天了,还是没有明白,,,哭
啊,.我的邮箱topbar@126.com

 回复 引用 查看   
#22楼 2010-12-05 17:31 john_226      
希望博主继续发博,看了很有帮助。

 回复 引用 查看   
#23楼 2011-10-21 10:40 tubuwuwa      
跪求这个防刷新的菜单
 回复 引用 查看   
#24楼 2011-10-21 10:41 tubuwuwa      
跪求防刷新的菜单
 回复 引用 查看   
#25楼 2011-10-21 10:43 tubuwuwa      
跪求防刷新的菜单
邮箱:754811726@qq.com

 回复 引用 查看   
#26楼 2011-11-29 13:10 百步飞剑      
对博主深感钦佩!