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 相关文章推荐
JQuery的一些小应用收集
Mar 27 Javascript
原生JavaScript生成GUID的实现示例
Sep 05 Javascript
JQuery异步获取返回值中文乱码的解决方法
Jan 29 Javascript
使用pjax实现无刷新更改页面url
Feb 05 Javascript
详解AngularJS中自定义指令的使用
Jun 17 Javascript
jQuery改变form表单的action,并进行提交的实现代码
May 25 Javascript
灵活使用数组制作图片切换js实现
Jul 28 Javascript
详解Javascript中的原型OOP
Oct 12 Javascript
String字符串截取的四种方式总结
Nov 28 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
Feb 20 Javascript
微信小程序开发之toast提示插件使用示例
Jun 08 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
Aug 04 Javascript
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速度全攻略
2006/10/09 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
2013/04/26 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
2020/05/29 PHP
javascript使用正则表达式检测IP地址
2014/12/03 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
JS中使用FormData上传文件、图片的方法
2016/08/07 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
用Vue编写抽象组件的方法
2019/05/06 Javascript
Vue.js组件通信之自定义事件详解
2019/10/19 Javascript
[55:11]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第一场 11.26
2020/11/30 DOTA
Python3实现生成随机密码的方法
2014/08/23 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
Python打包方法Pyinstaller的使用
2018/10/09 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
python微信撤回监测代码
2019/04/29 Python
Python使用线程来接收串口数据的示例
2019/07/02 Python
Python将主机名转换为IP地址的方法
2019/08/14 Python
python中提高pip install速度
2020/02/14 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
利用HTML5+css3+jquery+weui实现仿微信聊天界面功能
2018/01/08 HTML / CSS
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
美国现代家具网站:Design Within Reach
2018/07/19 全球购物
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
好军嫂事迹材料
2014/01/15 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
考试保密承诺书
2014/08/30 职场文书
党性教育心得体会
2014/09/03 职场文书
党的群众路线教育实践活动批评与自我批评范文
2014/10/16 职场文书
js 数组 fill() 填充方法
2021/11/02 Javascript
Mysql中的触发器定义及语法介绍
2022/06/25 MySQL