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简单实现交换Li的值
May 22 Javascript
JavaScript使用focus()设置焦点失败的解决方法
Sep 03 Javascript
jquery中change()用法实例分析
Feb 06 Javascript
AngularJS表单编辑提交功能实例
Feb 13 Javascript
基于javascript数组实现图片轮播
May 02 Javascript
前端编码规范(3)JavaScript 开发规范
Jan 21 Javascript
深入理解Angularjs中$http.post与$.post
May 19 Javascript
微信小程序自定义tab实现多层tab嵌套功能
Jun 15 Javascript
Angularjs之ngModel中的值验证绑定方法
Sep 13 Javascript
JavaScript中的回调函数实例讲解
Jan 27 Javascript
mpvue全局引入sass文件的方法步骤
Mar 06 Javascript
Vue和Flask通信的实现
May 19 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
新闻分类录入、显示系统
2006/10/09 PHP
Wordpress php 分页代码
2009/10/21 PHP
PHP clearstatcache()函数详解
2010/03/02 PHP
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
2014/02/02 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
PHP实现的简单适配器模式示例
2017/06/22 PHP
JQuery与Ajax调用新浪API获取短网址的代码
2014/02/07 Javascript
MVC+jQuery.Ajax异步实现增删改查和分页
2020/12/22 Javascript
Vue系列:通过vue-router如何传递参数示例
2017/01/16 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
vue.js获得当前元素的文字信息方法
2018/03/09 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
[38:38]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.17
2020/12/18 DOTA
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
一波神奇的Python语句、函数与方法的使用技巧总结
2015/12/08 Python
django之session与分页(实例讲解)
2017/11/13 Python
Python3学习urllib的使用方法示例
2017/11/29 Python
Python使用requests发送POST请求实例代码
2018/01/25 Python
Python的多维空数组赋值方法
2018/04/13 Python
python pands实现execl转csv 并修改csv指定列的方法
2018/12/12 Python
Python类的继承用法示例
2019/01/31 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
2020/03/11 Python
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
婚礼证婚人证婚词
2014/01/08 职场文书
民族团结先进个人材料
2014/02/05 职场文书
电子信息专业应届生自荐信
2014/06/04 职场文书
喝酒驾驶检讨书
2014/10/01 职场文书
重温入党誓词主持词
2015/06/29 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
Python实现提取PDF简历信息并存入Excel
2022/04/02 Python
Spring boot实现上传文件到本地服务器
2022/08/14 Java/Android