JS基于构造函数实现的菜单滑动显隐效果【测试可用】


Posted in Javascript onJune 21, 2016

本文实例讲述了JS基于构造函数实现的菜单滑动显隐效果。分享给大家供大家参考,具体如下:

运行效果截图如下:

JS基于构造函数实现的菜单滑动显隐效果【测试可用】

具体代码如下:

<!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" />
<meta http-equiv="Content-Type" content="; charset=utf-8" />
<title>JS树型菜单</title>
<script language="javascript">
function SDMenu(id) {
 if (!document.getElementById || !document.getElementsByTagName)
 return false;
 this.menu = document.getElementById(id);
 this.submenus = this.menu.getElementsByTagName("div");
 this.remember = true;
 this.speed = 1;
 this.markCurrent = true;
 this.oneSmOnly = false;
}
SDMenu.prototype.init = function() {
 var mainInstance = this;
 for (var i = 0; i < this.submenus.length; i++)
 this.submenus[i].getElementsByTagName("span")[0].onclick = function() {
  mainInstance.toggleMenu(this.parentNode);
 };
 /*if (this.markCurrent) {
 var links = this.menu.getElementsByTagName("a");
 for (var i = 0; i < links.length; i++)
  if (links[i].href == document.location.href) {
  links[i].className = "current";
  break;
  }
 }*/
 if (this.remember) {
 var regex = new RegExp("sdmenu_" + encodeURIComponent(this.menu.id) + "=([01]+)");
 var match = regex.exec(document.cookie);
 if (match) {
  var states = match[1].split("");
  for (var i = 0; i < states.length; i++)
  this.submenus[i].className = (states[i] == 0 ? "collapsed" : "");
 }
 }
};
SDMenu.prototype.toggleMenu = function(submenu) {
 if (submenu.className == "collapsed")
 this.expandMenu(submenu);
 else
 this.collapseMenu(submenu);
};
SDMenu.prototype.expandMenu = function(submenu) {
 var fullHeight = submenu.getElementsByTagName("span")[0].offsetHeight;
 var links = submenu.getElementsByTagName("a");
 for (var i = 0; i < links.length; i++)
 fullHeight += links[i].offsetHeight;
 var moveBy = Math.round(this.speed * links.length);
 var mainInstance = this;
 var intId = setInterval(function() {
 var curHeight = submenu.offsetHeight;
 var newHeight = curHeight + moveBy;
 if (newHeight < fullHeight)
  submenu.style.height = newHeight + "px";
 else {
  clearInterval(intId);
  submenu.style.height = "";
  submenu.className = "";
  mainInstance.memorize();
 }
 }, 10);
 //this.collapseOthers(submenu); 
};
SDMenu.prototype.collapseMenu = function(submenu) {
 var minHeight = submenu.getElementsByTagName("span")[0].offsetHeight;
 var moveBy = Math.round(this.speed * submenu.getElementsByTagName("a").length);
 var mainInstance = this;
 var intId = setInterval(function() {
 var curHeight = submenu.offsetHeight;
 var newHeight = curHeight - moveBy;
 if (newHeight > minHeight)
  submenu.style.height = newHeight + "px";
 else {
  clearInterval(intId);
  submenu.style.height = "";
  submenu.className = "collapsed";
  mainInstance.memorize();
 }
 }, 10);
};
/*SDMenu.prototype.collapseOthers = function(submenu) { 
 if (this.oneSmOnly) {
 for (var i = 0; i < this.submenus.length; i++)
  if (this.submenus[i] != submenu && this.submenus[i].className != "collapsed")
  this.collapseMenu(this.submenus[i]);
 }
};*/
SDMenu.prototype.memorize = function() {
 if (this.remember) {
 var states = new Array();
 for (var i = 0; i < this.submenus.length; i++)
  states.push(this.submenus[i].className == "collapsed" ? 0 : 1);
 var d = new Date();
 d.setTime(d.getTime() + (30 * 24 * 60 * 60 * 1000));
 document.cookie = "sdmenu_" + encodeURIComponent(this.menu.id) + "=" + states.join("") + "; expires=" + d.toGMTString() + "; path=/";
 }
};
var myMenu;
window.onload = function() {
 myMenu = new SDMenu("my_menu");
 myMenu.init();
};
</script>
<style type="text/css">
 html,body{
 height:100%;
 margin:0;
 font-size:12px;
 }
 span{
 background:#F0DFBE;
 border:1px solid #ffffff;
 border-left:6px solid #F2A31B;
 width:228px;
 height:23px;
 display:block;
 line-height:23px;
 padding-left:20px;
 }
 a{
 padding:3px 0 3px 40px;
 display:block;
 color:#636363;
 }
 #my_menu{
 width:255px;
 background:#F7F2E4;
 height:100%;
 }
 div.sdmenu div.collapsed {
 height: 25px;
}
 div.sdmenu div{
 overflow: hidden;
 }
</style>
</head>
<body>
 <div style="float:left" id="my_menu" class="sdmenu">
 <div>
  <span>菜单一</span>
  <a href="#">>  菜单一子内容</a>
  <a href="#">>  菜单一子内容</a>
  <a href="#">>  菜单一子内容</a>
  <a href="#">>  菜单一子内容</a>
  <a href="#">>  菜单一子内容</a>
 </div>
 <div>
  <span>菜单二</span>
  <a href="#">>  菜单二子内容</a>
  <a href="#">>  菜单二子内容</a>
  <a href="#">>  菜单二子内容</a>
 </div>
 <div>
  <span>菜单三</span>
  <a href="#">>  菜单三子内容</a>
  <a href="#">>  菜单三子内容</a>
  <a href="#">>  菜单三子内容</a>
 </div>
 <div>
  <span>菜单三</span>
  <a href="#">>  菜单三子内容</a>
  <a href="#">>  菜单三子内容</a>
  <a href="#">>  菜单三子内容</a>
 </div>
 <div>
  <span>菜单三</span>
  <a href="#">>  菜单三子内容</a>
  <a href="#">>  菜单三子内容</a>
  <a href="#">>  菜单三子内容</a>
 </div>
 <div>
  <span>菜单x</span>
  <a href="#">>  菜单三子内容</a>
  <a href="#">>  菜单三子内容</a>
  <a href="#">>  菜单三子内容</a>
 </div>
 </div>
</body>
</html>

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
User Scripts: Video Download by User Scripts
May 14 Javascript
收藏Javascript中常用的55个经典技巧
Aug 12 Javascript
javascript hashtable实现代码
Oct 13 Javascript
jquery插件制作 手风琴Panel效果实现
Aug 17 Javascript
jquery如何把参数列严格转换成数组实现思路
Apr 01 Javascript
js自动查找select下拉的菜单并选择(示例代码)
Feb 26 Javascript
JavaScript保存并运算页面中数字类型变量的写法
Jul 06 Javascript
js实现类似MSN提示的页面效果代码分享
Aug 24 Javascript
node.js实现的装饰者模式示例
Sep 06 Javascript
Vue使用NProgress进度条的方法
Sep 21 Javascript
vuex(vue状态管理)的特殊应用案例分享
Mar 03 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
Jan 12 Vue.js
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
Jun 21 #Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
Jun 21 #Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
Jun 21 #Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
Jun 21 #Javascript
带有定位当前位置的百度地图前端web api实例代码
Jun 21 #Javascript
jQuery中的ready函数与window.onload谁先执行
Jun 21 #Javascript
纯JS前端实现分页代码
Jun 21 #Javascript
You might like
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
初学PHP的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
Extjs实现进度条的两种便捷方式
2013/09/26 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
jQuery实现Div拖动+键盘控制综合效果的方法
2015/03/10 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
JavaScript的代码编写格式规范指南
2015/12/07 Javascript
javascript+HTML5自定义元素播放焦点图动画
2016/02/21 Javascript
JavaScript学习笔记之ES6数组方法
2016/03/25 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
理解javascript async的用法
2017/08/22 Javascript
详解webpack之scss和postcss-loader的配置
2018/01/09 Javascript
angularJs-$http实现百度搜索时的动态下拉框示例
2018/02/27 Javascript
详解JavaScript事件循环机制
2018/09/07 Javascript
[42:32]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第二局
2016/02/27 DOTA
Python中itertools模块用法详解
2014/09/25 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
Python将list中的string批量转化成int/float的方法
2018/06/26 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
2019/07/04 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
python读取excel数据并且画图的实现示例
2021/02/08 Python
利用CSS的Sass预处理器(框架)来制作居中效果
2016/03/10 HTML / CSS
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
IBatis持久层技术
2016/07/18 面试题
护理学中专毕业生求职信
2013/11/11 职场文书
个人充满哲理的自我评价
2014/02/20 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
经济管理自荐书
2014/06/09 职场文书
党的群众路线教育实践活动总结
2014/10/30 职场文书
2014镇党委书记党建工作汇报材料
2014/11/02 职场文书
整改落实自查报告
2014/11/05 职场文书
2014年乡镇卫生院工作总结
2014/11/24 职场文书
2014年小学德育工作总结
2014/12/05 职场文书
导游词之丹东鸭绿江
2019/10/24 职场文书