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 操作css实现代码
Jun 11 Javascript
JavaScript中:表达式和语句的区别[译]
Sep 17 Javascript
jQuery实现鼠标经过图片预览大图效果
Apr 10 Javascript
jQuery 判断图片是否加载完成方法汇总
Aug 10 Javascript
微信企业号开发之微信考勤百度地图定位
Sep 11 Javascript
javascript函数自动执行常用方法汇总
Mar 28 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
Feb 20 Javascript
javascript 玩转Date对象(实例讲解)
Jul 11 Javascript
webpack 从指定入口文件中提取公共文件的方法
Nov 13 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
Oct 28 Javascript
JavaScript onclick事件使用方法详解
May 15 Javascript
Vue实现随机验证码功能
Dec 29 Vue.js
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
推荐文章系统(一)
2006/10/09 PHP
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
ZF框架实现发送邮件的方法
2015/12/03 PHP
Yii2框架实现数据库常用操作总结
2017/02/08 PHP
php图片合成方法(多张图片合成一张)
2017/11/25 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
Javascript new Date().valueOf()的作用与时间戳由来详解
2013/04/24 Javascript
js简单实现让文本框内容逐个字的显示出来
2013/10/22 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
2017/01/09 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
浅谈在react中如何实现扫码枪输入
2018/07/04 Javascript
JS实现将二维数组转为json格式字符串操作示例
2018/07/12 Javascript
微信浏览器左上角返回按钮监听的实现
2020/03/04 Javascript
vue-cli3单页构建大型项目方案
2020/04/07 Javascript
Python实现的多线程端口扫描工具分享
2015/01/21 Python
Python内置函数OCT详解
2016/11/09 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
2019/02/28 Python
python粘包问题及socket套接字编程详解
2019/06/29 Python
Python 实现使用空值进行赋值 None
2020/03/12 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
Python实现Keras搭建神经网络训练分类模型教程
2020/06/12 Python
移动端HTML5开发神器之vconsole详解
2020/12/15 HTML / CSS
Boden英国官网:英国知名原创时装品牌
2018/11/06 全球购物
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
Oracle的内存结构(Memory structures)
2015/06/10 面试题
2014年六一儿童节演讲稿
2014/05/23 职场文书
过程装备与控制工程专业求职信
2014/07/02 职场文书
单位活动策划方案
2014/08/17 职场文书
辛亥革命观后感
2015/06/02 职场文书