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 相关文章推荐
不间断滚动JS打包类,基本可以实现所有的滚动效果,太强了
Dec 08 Javascript
jquery 表格的增行删行实现思路
Mar 21 Javascript
导航跟随滚动条置顶移动示例代码
Sep 11 Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
Nov 25 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
Dec 09 Javascript
JS操作iframe里的dom(实例讲解)
Jan 29 Javascript
javascript初学者常用技巧
Sep 02 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
Mar 11 Javascript
浅谈js键盘事件全面控制
Dec 01 Javascript
微信小程序wx:for和wx:for-item的用法详解
Apr 01 Javascript
js中位数不足自动补位扩展padLeft、padRight实现代码
Apr 06 Javascript
解决Vue-cli无法编译es6的问题
Oct 30 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
PHP 中的类
2006/10/09 PHP
可以在线执行PHP代码包装修正版
2008/03/15 PHP
深入理解PHP中的empty和isset函数
2016/05/26 PHP
Laravel核心解读之异常处理的实践过程
2019/02/24 PHP
Yii Framework框架开发微信公众平台示例
2020/04/26 PHP
Prototype RegExp对象 学习
2009/07/19 Javascript
return false;和e.preventDefault();的区别
2010/07/11 Javascript
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
javascript提取URL的搜索字符串中的参数(自定义函数实现)
2013/01/22 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
js实现jquery的offset()方法实例
2015/01/10 Javascript
JavaScript操作Cookie方法实例分析
2015/05/27 Javascript
RGB和YUV 多媒体编程基础详细介绍
2016/11/04 Javascript
vue.js利用defineProperty实现数据的双向绑定
2017/04/28 Javascript
微信JSSDK调用微信扫一扫功能的方法
2017/07/25 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
JS设计模式之单例模式(一)
2017/09/29 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
electron中使用bootstrap的示例代码
2018/11/06 Javascript
vue父组件给子组件的组件传值provide inject的方法
2019/10/23 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
2020/04/14 Javascript
浅析JavaScript 函数防抖和节流
2020/07/13 Javascript
[00:10]神之谴戒
2019/03/06 DOTA
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
多版本Python共存的配置方法
2017/05/22 Python
Django Web开发中django-debug-toolbar的配置以及使用
2018/05/06 Python
用uWSGI和Nginx部署Flask项目的方法示例
2019/05/05 Python
python 自动轨迹绘制的实例代码
2019/07/05 Python
用python写测试数据文件过程解析
2019/09/25 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
python 将dicom图片转换成jpg图片的实例
2020/01/13 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
催款律师函范文
2015/05/27 职场文书
CSS几步实现赛博朋克2077风格视觉效果
2021/06/16 HTML / CSS
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS
Java 常见的限流算法详细分析并实现
2022/04/07 Java/Android