javascript oop开发滑动(slide)菜单控件


Posted in Javascript onAugust 25, 2010

这里使用原生的javascript,用面向对象的方式创建一个容易维护使用方便的滑动菜单,调用方式如下:

var $sliding = document.getElementById("silding"); 
var s1 = new Sliding(); 
s1.commands = $sliding.getElementsByTagName("dt"); 
s1.panels = $sliding.getElementsByTagName("dd"); ; 
s1.init("mouseover", "active");

演示代码分为slide.js和slide.html两个文件
slide.htm:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>javascript slide控件演示</title> 
<style type="text/css"> 
/*reset*/ 
dl,ul,li,dt,dd{ margin:0; padding:0; list-style:none; } 
/*silding*/ 
.silding{ width:200px; border:1px solid #ccc; line-height:25px; overflow:hidden;} 
.silding dt{border-bottom:1px solid #ccc; background-color:#bebebe; cursor:pointer} 
.silding dd{ display:none; background:#efefef; overflow:hidden; font-size:12px; } 
.silding .active{ font-weight:bold;} 
</style> 
<script type="text/javascript" src="slide.js"></script> 
</head> 
<body> 
<div id="silding" class="silding"> 
<dl> 
<dt class="active">第一个一级菜单</dt> 
<dd style="display:block;"> 
<ul> 
<li><a href="#">第一个二级菜单</a></li> 
<li>第一个二级菜单</li> 
<li>第一个二级菜单</li> 
</ul> 
</dd> 
</dl> 
<dl> 
<dt>第二个一级菜单</dt> 
<dd> 
<ul> 
<li>第二个二级菜单</li> 
<li>第二个二级菜单</li> 
<li>第二个二级菜单</li> 
</ul> 
</dd> 
</dl> 
<dl> 
<dt>第三个一级菜单</dt> 
<dd> 
<ul> 
<li>第三个二级菜单</li> 
<li>第三个二级菜单</li> 
<li>第三个二级菜单</li> 
</ul> 
</dd> 
</dl> 
</div> 
<script type="text/javascript"> 
var $sliding = document.getElementById("silding"); 
var s1 = new Sliding(); 
s1.commands = $sliding.getElementsByTagName("dt"); 
s1.panels = $sliding.getElementsByTagName("dd"); ; 
s1.init("mouseover", "active"); 
</script> 
</body> 
</html>

slide.js:
function Slider(i, panelHeight) { //dto 
this.index = i; 
this.panelHeight = panelHeight; 
} 
//class Sliding { 
function Sliding(activeIndex) { 
this.commands = []; 
this.panels = []; 
this.activeIndex = activeIndex || 0; 
this.sliderCache = {}; 
} 
Sliding.prototype = { 
//绑定事件 
init: function(eventName, activeCssClass) { 
var _this = this; 
var cmds = _this.commands; 
_this.activeClass = activeCssClass; 
for (var i = 0, n = cmds.length; i < n; i++) { 
cmds[i]["on" + eventName] = function(e) { 
_this.handel(this, e); 
} 
cmds[i].index = i; 
if (i == _this.activeIndex) { 
_this.sliderCache = new Slider(i, _this.panels[i].offsetHeight); 
} 
} 
}, 
//事件处理函数 
handel: function(elem, args) { 
var _this = this; 
var index = elem.index; 
var cacheIndex = _this.sliderCache.index; 
var cacheElem = _this.commands[cacheIndex]; 
if (index == cacheIndex) return; 
var showPanel = _this.panels[index]; 
var hidePanel = _this.panels[cacheIndex]; 
var h = parseInt(_this.sliderCache.panelHeight); 
showPanel.style.height = "0px"; 
showPanel.style.display = "block"; 
_this.tween(hidePanel, showPanel, h); 
elem.className = _this.activeClass; 
cacheElem.className = cacheElem.className.replace(eval("/ ?"+_this.activeClass+" ?/"),""); 
_this.sliderCache = new Slider(index, h); 
}, 
//动画算法 
tween: function(obj0, obj1, h) { 
_this = arguments.callee; 
var step = 20; 
if ("\v" == "v") { 
step = 30; 
} 
if (h > 0) { 
var h0 = obj0.offsetHeight; 
var h1 = obj1.offsetHeight; 
if (h < step) { 
obj0.style.display = "none"; 
obj0.style.height = (h1 + h) + "px"; 
obj1.style.height = (h1 + h) + "px"; 
} else { 
h = h - step; 
obj0.style.height = (h0 - step) + "px"; 
obj1.style.height = (h1 + step) + "px"; 
setTimeout(function() { 
_this(obj0, obj1, h) 
}, 
50) 
} 
} 
} 
} 
//}

上面就所有代码了这里因为是演示所以让HTML CSS尽量的简化,另外使用jquery的 fn.slideUp fn.slideDown 实现起来会更容易不过我作为一个专业的开发者多了解些原生的JS对技术的提高还是很有帮助。
Javascript 相关文章推荐
javascript this用法小结
Dec 19 Javascript
js正则表达式的使用详解
Jul 09 Javascript
js简单实现用户注册信息的校验代码
Nov 15 Javascript
jquery解析XML字符串和XML文件的方法说明
Feb 21 Javascript
用javascript对一个json数组深度赋值示例
Jul 27 Javascript
处理文本部分内容的TextRange对象应用实例
Jul 29 Javascript
详解JavaScript逻辑And运算符
Dec 04 Javascript
JS产生随机数的几个用法详解
Jun 22 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
Sep 05 Javascript
微信小程序 倒计时组件实现代码
Oct 24 Javascript
Java与JavaScript中判断两字符串是否相等的区别
Mar 13 Javascript
vue.js click点击事件获取当前元素对象的操作
Aug 07 Javascript
JavaScript初学者需要了解10个小技巧
Aug 25 #Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
Aug 25 #Javascript
js中判断控件是否存在
Aug 25 #Javascript
JavaScript浏览器选项卡效果
Aug 25 #Javascript
Javascript之旅 对象的原型链之由来
Aug 25 #Javascript
Javascript new关键字的玄机 以及其它
Aug 25 #Javascript
jquery下组织javascript代码(js函数化)
Aug 25 #Javascript
You might like
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
PHP设计模式之装饰者模式
2012/02/29 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
JS动态显示表格上下frame的方法
2015/03/31 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
AngularJS 模块化详解及实例代码
2016/09/14 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
原生js封装的ajax方法示例
2018/08/02 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
python读写文件操作示例程序
2013/12/02 Python
Python进行数据科学工作的简单入门教程
2015/04/01 Python
简单介绍利用TK在Python下进行GUI编程的教程
2015/04/13 Python
python中xrange用法分析
2015/04/15 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
Python发展史及网络爬虫
2019/06/19 Python
python ftplib模块使用代码实例
2019/12/31 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
Java Unsafe类实现原理及测试代码
2020/09/15 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
CPB肌肤之钥美国官网:Clé de Peau Beauté
2017/09/05 全球购物
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
酒店端午节促销方案
2014/02/18 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
秋天的图画教学反思
2014/05/01 职场文书
优秀员工评优方案
2014/06/13 职场文书
国际贸易实务实训报告
2014/11/05 职场文书
2014年党总支工作总结
2014/12/18 职场文书
担保书范本
2015/01/20 职场文书
小学英语教师研修感悟
2015/11/18 职场文书
开学第一周日记(三篇范文)
2019/08/23 职场文书
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android