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 相关文章推荐
一些技巧性实用js代码小结
Oct 14 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
Apr 24 Javascript
通过pjax实现无刷新翻页(兼容新版jquery)
Jan 31 Javascript
js实现网页随机切换背景图片的方法
Nov 01 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
Nov 26 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
Dec 14 Javascript
jQuery EasyUI 页面加载等待及页面等待层
Feb 06 Javascript
node中Express 动态设置端口的方法
Aug 04 Javascript
Vue 实现html中根据类型显示内容
Oct 28 Javascript
vue实现公共方法抽离
Jul 31 Javascript
Vue操作Storage本地化存储
Apr 29 Vue.js
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
PHP获取当前页面完整URL的实现代码
2013/06/10 PHP
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
PHP+Apache环境中如何隐藏Apache版本
2017/11/24 PHP
PHP实现浏览器格式化显示XML的方法示例
2019/01/22 PHP
js下利用控制器载入对应脚本
2010/07/17 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
jQuery实现获取元素索引值index的方法
2016/09/18 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
ajax分页效果(bootstrap模态框)
2017/01/23 Javascript
用Node提供静态文件服务的方法
2018/07/06 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
详解 javascript对象创建模式
2020/10/30 Javascript
使用js获取身份证年龄的示例代码
2020/12/11 Javascript
[11:57]《一刀刀一天》第十七期:TI中国军团加油!
2014/05/26 DOTA
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
Python linecache.getline()读取文件中特定一行的脚本
2008/09/06 Python
Python使用三种方法实现PCA算法
2017/12/12 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
通过实例简单了解Python中yield的作用
2019/12/11 Python
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
2014最新离职证明范本
2014/09/12 职场文书
2014年幼儿园老师工作总结
2014/12/05 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书
七一晚会主持词
2015/06/29 职场文书
2016年“9.22”世界无车日活动小结
2016/04/05 职场文书
mysql事务对效率的影响分析总结
2021/10/24 MySQL
如何利用React实现图片识别App
2022/02/18 Javascript