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 相关文章推荐
pjblog中的UBBCode.js
Apr 25 Javascript
Javascript !!的作用
Dec 04 Javascript
实现51Map地图接口(示例代码)
Nov 22 Javascript
jQuery基础_入门必看知识点
Jul 04 Javascript
JavaScript伪数组用法实例分析
Dec 22 Javascript
javascript实现最长公共子序列实例代码
Feb 05 Javascript
React props和state属性的具体使用方法
Apr 12 Javascript
ng-alain表单使用方式详解
Jul 10 Javascript
vue 路由子组件created和mounted不起作用的解决方法
Nov 05 Javascript
ElementUI多个子组件表单的校验管理实现
Nov 07 Javascript
使用JS来动态操作css的几种方法
Dec 18 Javascript
全网小程序接口请求封装实例代码
Nov 06 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
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
学习php设计模式 php实现适配器模式
2015/12/07 PHP
php use和include区别总结
2019/10/13 PHP
Laravel5.1 框架路由基础详解
2020/01/04 PHP
JS 统计时间
2021/03/09 Javascript
通过JAVAScript实现页面自适应
2007/01/19 Javascript
项目实践之javascript技巧
2007/12/06 Javascript
判断浏览器的javascript版本的代码
2010/09/03 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
2012/11/01 Javascript
纯javascript模仿微信打飞机小游戏
2015/08/20 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
Angular.js中$resource高大上的数据交互详解
2017/07/30 Javascript
react实现菜单权限控制的方法
2017/12/11 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
javascript中call,apply,callee,caller用法实例分析
2019/07/24 Javascript
JavaScript 反射和属性赋值实例解析
2019/10/28 Javascript
tensorflow获取变量维度信息
2018/03/10 Python
pandas去除重复列的实现方法
2019/01/29 Python
python3实现小球转动抽奖小游戏
2020/04/15 Python
django admin 自定义替换change页面模板的方法
2019/08/23 Python
Python 寻找局部最高点的实现
2019/12/05 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
2020/01/16 Python
Python字典深浅拷贝与循环方式方法详解
2020/02/09 Python
python speech模块的使用方法
2020/09/09 Python
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
新东网科技Java笔试题
2012/07/13 面试题
一套英文Java笔试题面试题
2016/04/21 面试题
材料物理专业大学毕业生求职信
2013/10/15 职场文书
停车位租赁协议书
2014/09/24 职场文书
1000字打架检讨书
2014/11/03 职场文书
2014年计生工作总结
2014/11/21 职场文书
外国人来华邀请函
2015/01/31 职场文书
mysql 数据插入优化方法之concurrent_insert
2021/07/01 MySQL
MySQL七大JOIN的具体使用
2022/02/28 MySQL