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


Posted in Javascript onJune 04, 2010

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

特点:

全兼容,浏览器测试:IE5.5、IE6、IE7、IE8、FF3.0、谷歌、Safari 4.0、Opera9.0。
Html结构优雅简洁,无多余标签,利于程序循环输出。
样式与结构分离,你可以在样式表中修改不同的风格。
当前选中项高亮状态,一级菜单和二级菜单都可以高亮显示。
折叠层优雅缓冲动画。
最适用于后台和一些OA系统界面。

缺点:

不支持防刷新,这个功能在后台应用系统中应该用途不大,没有加入这个功能。
在IE6中缓冲效果没有出来,对于IE6,就弱化一下效果。
还是先看看效果截图:
js 全兼容可高亮二级缓冲折叠菜单
简单说一下制作这样的菜单的一些简单的思路和会遇到的问题。

一般制作一个效果,我的制作流程一般是先画出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有序列表的方式来创建这种嵌套的结构,视你的实际情况而定。

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

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

表现层:

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

一级菜单样式

/*一级菜单三态样式,供JS调用*/ 
.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;} 
.menu li.level1 a.hove{background-position:left -31px;} 
.menu li.level1 a.cur{background-position:left -62px;}

二级菜单样式
/*二级菜单三态样式,供JS调用*/ 
.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;} 
.menu li.level1 a.hove{background-position:left -31px;} 
.menu li.level1 a.cur{background-position:left -62px;}

行为层:

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

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

有什么问题请在本博客中跟贴讨论,祝你用得开心!
在线演示地址 http://demo.3water.com/js/caidan_js/demo.html
打包下载地址 https://3water.com/jiaoben/27308.html

Javascript 相关文章推荐
Javascript 阻止javascript事件冒泡,获取控件ID值
Jun 27 Javascript
json-lib出现There is a cycle in the hierarchy解决办法
Feb 24 Javascript
JavaScript之编码规范 推荐
May 23 Javascript
jQuery登陆判断简单实现代码
Apr 21 Javascript
让checkbox不选中即将选中的checkbox不选中
Jul 11 Javascript
node.js中的path.basename方法使用说明
Dec 09 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
Nov 20 Javascript
详解angularJS自定义指令间的相互交互
Jul 05 Javascript
用Node提供静态文件服务的方法
Jul 06 Javascript
vue项目开发中setTimeout等定时器的管理问题
Sep 13 Javascript
JS浅拷贝和深拷贝原理与实现方法分析
Feb 28 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
Jul 15 Javascript
JavaScript中使用replace结合正则实现replaceAll的效果
Jun 04 #Javascript
利用jquery操作select下拉列表框的代码
Jun 04 #Javascript
JavaScript 页面编码与浏览器类型判断代码
Jun 03 #Javascript
javascript cookie操作类的实现代码小结附使用方法
Jun 02 #Javascript
js操作select控件的几种方法
Jun 02 #Javascript
Jquery升级新版本后选择器的语法问题
Jun 02 #Javascript
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
Jun 02 #Javascript
You might like
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
ThinkPHP行为扩展Behavior应用实例详解
2014/07/22 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
2016/01/18 PHP
php文件上传及下载附带显示文件及目录功能
2017/04/27 PHP
php实现数字补零的方法总结
2018/09/12 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
简单实例处理url特殊符号&amp;处理(2种方法)
2013/04/02 Javascript
jquery实现简单易懂的图片展示小例子
2013/11/21 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
2014/03/26 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
jQuery简单实现title提示效果示例
2016/08/01 Javascript
js中时间格式化的几种方法
2018/07/22 Javascript
vue中多个倒计时实现代码实例
2019/03/27 Javascript
elementUI 动态生成几行几列的方法示例
2019/07/11 Javascript
JavaScript的console命令使用实例
2019/12/03 Javascript
[51:17]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
Python标准库与第三方库详解
2014/07/22 Python
Python列表生成器的循环技巧分享
2015/03/06 Python
Python中的hypot()方法使用简介
2015/05/18 Python
解析Python中的__getitem__专有方法
2016/06/27 Python
django之常用命令详解
2016/06/30 Python
django celery redis使用具体实践
2019/04/08 Python
如何利用Anaconda配置简单的Python环境
2019/06/24 Python
Python秒算24点实现及原理详解
2019/07/29 Python
办公室助理岗位职责
2013/12/25 职场文书
培训讲师邀请函
2014/01/10 职场文书
实验室的标语
2014/06/20 职场文书
党员干部批评与自我批评反四风思想汇报
2014/09/21 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
2014年煤矿工人工作总结
2014/12/08 职场文书
python获取字符串中的email
2022/03/31 Python
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸
阿里云日志过滤器配置日志服务
2022/04/09 Servers