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 15 Javascript
在次封装easyui-Dialog插件实现代码
Nov 14 Javascript
深入理解JavaScript系列(4) 立即调用的函数表达式
Jan 15 Javascript
jquery控制select的text/value值为选中状态
Jun 03 Javascript
js实现鼠标经过时图片滚动停止的方法
Feb 16 Javascript
js验证框架之RealyEasy验证详解
Jun 08 Javascript
AngularJS教程 ng-style 指令简单示例
Aug 03 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
Oct 31 Javascript
jQuery实现的弹幕效果完整实例
Sep 06 jQuery
BootStrap自定义popover,点击区域隐藏功能的实现
Jan 23 Javascript
puppeteer实现html截图的示例代码
Jan 10 Javascript
Layui实现数据表格默认全部显示(不要分页)
Oct 26 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获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
2012/10/03 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
Yii2选项卡的简单使用
2017/05/26 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
2018/10/14 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
javascript 硬盘序列号+其它硬件信息
2008/12/23 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
jquery foreach使用示例
2013/09/12 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
JS来动态的修改url实现对url的增删查改
2014/09/05 Javascript
Jquery为DIV添加click事件的简单实例
2016/06/02 Javascript
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
微信小程序textarea层级过高(盖住其他元素)问题的解决办法
2019/03/04 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
Vue.js watch监视属性知识点总结
2019/11/11 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
[00:10]DOTA2全国高校联赛 以DOTA2会友
2018/05/30 DOTA
轻松实现python搭建微信公众平台
2016/02/16 Python
Python注释详解
2016/06/01 Python
python爬虫获取多页天涯帖子
2018/02/23 Python
深入浅析python with语句简介
2018/04/11 Python
详解python 注释、变量、类型
2018/08/10 Python
python读取和保存图片5种方法对比
2018/09/12 Python
Python语言快速上手学习方法
2018/12/14 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
win10下python2和python3共存问题解决方法
2019/12/23 Python
Python+PyQt5+MySQL实现天气管理系统
2020/06/16 Python
什么时候需要进行强制类型转换
2016/09/03 面试题
毕业生精彩的自我评价分享
2013/10/06 职场文书
主治医师岗位职责
2013/12/10 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
申报优秀教师材料
2014/12/16 职场文书
联欢会开场白
2015/06/01 职场文书
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技