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 相关文章推荐
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
Oct 11 Javascript
JavaScript游戏之优化篇
Nov 08 Javascript
jQuery页面图片伴随滚动条逐渐显示的小例子
Mar 21 Javascript
JavaScript地图拖动功能SpryMap的简单实现
Jul 17 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
May 11 Javascript
jQuery遍历json中多个map的方法
Feb 12 Javascript
JavaScript中toString()方法的使用详解
Jun 05 Javascript
JavaScript 身份证号有效验证详解及实例代码
Oct 20 Javascript
vue.js删除动态绑定的radio的指定项
Jun 02 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
Feb 09 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
Feb 22 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
Oct 29 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
mysql5写入和读出乱码解决
2006/11/25 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
2015/09/22 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
加载 Javascript 最佳实践
2011/10/30 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
浅析bootstrap原理及优缺点
2017/03/19 Javascript
vue2.0构建单页应用最佳实战
2017/04/01 Javascript
JavaScript程序设计高级算法之动态规划实例分析
2017/11/24 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
vue 1.0 结合animate.css定义动画效果
2018/07/11 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
详解Vue之计算属性
2020/06/20 Javascript
vue实现图片裁剪后上传
2020/12/16 Vue.js
[03:56]显微镜下的DOTA2第十一期——鬼畜的死亡先知播音员
2014/06/23 DOTA
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
跟老齐学Python之复习if语句
2014/10/02 Python
Python中使用urllib2模块编写爬虫的简单上手示例
2016/01/20 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
Python如何实现转换URL详解
2019/07/02 Python
python笔记_将循环内容在一行输出的方法
2019/08/08 Python
Django 博客实现简单的全文搜索的示例代码
2020/02/17 Python
Python多进程编程multiprocessing代码实例
2020/03/12 Python
python爬取招聘要求等信息实例
2020/11/20 Python
详解pandas映射与数据转换
2021/01/22 Python
HTML5各种头部meta标签的功能(推荐)
2017/03/13 HTML / CSS
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
产品质量承诺书范文
2014/03/27 职场文书
2015年度企业工作总结
2015/05/21 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android
Python爬虫网络请求之代理服务器和动态Cookies
2022/04/12 Python