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 相关文章推荐
一段实时更新的时间代码
Jul 07 Javascript
javascript下function声明一些小结
Dec 28 Javascript
理解JavaScript的prototype属性
Feb 11 Javascript
js 判断浏览器使用的语言示例代码
Mar 22 Javascript
jQuery中eq()方法用法实例
Jan 05 Javascript
jQuery判断多个input file 都不能为空的例子
Jun 23 Javascript
jQuery表格行上移下移和置顶的实现方法
Oct 08 Javascript
js删除数组元素、清空数组的简单方法(必看)
Jul 27 Javascript
jQuery实现的简单拖拽功能示例
Sep 13 Javascript
使用JavaScript根据图片获取条形码的方法
Jul 04 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
Nov 02 Javascript
微信小程序Echarts图表组件使用方法详解
Jun 25 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
destoon数据库表说明汇总
2014/07/15 PHP
php中stdClass的用法分析
2015/02/27 PHP
Prototype使用指南之selector.js说明
2008/10/26 Javascript
添加JavaScript重载函数的辅助方法2
2010/07/04 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
javascript里绝对用的上的字符分割函数总结
2014/07/31 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
微信小程序 图片加载(本地,网路)实例详解
2017/03/10 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
前端axios下载excel文件(二进制)的处理方法
2018/07/31 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
2018/09/14 Javascript
在Vue中使用axios请求拦截的实现方法
2018/10/25 Javascript
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】
2019/01/19 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
Vue-cli3项目引入Typescript的实现方法
2019/10/18 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
Python中捕捉详细异常信息的代码示例
2014/09/18 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
2017/05/08 Python
Python求离散序列导数的示例
2019/07/10 Python
Tensorflow 实现释放内存
2020/02/03 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
2020/08/27 Python
ASOS亚洲:ASOS Asia
2018/03/04 全球购物
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
增员口号大全
2014/06/18 职场文书
师德师风建设整改措施思想汇报
2014/10/11 职场文书
学校教师培训工作总结
2015/10/14 职场文书
vue+iview实现手机号分段输入框
2022/03/25 Vue.js
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js