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 相关文章推荐
JS中FRAME的操作问题实例分析
Oct 21 Javascript
firefox浏览器用jquery.uploadify插件上传时报HTTP 302错误
Mar 01 Javascript
javascript中Array()数组函数详解
Aug 23 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
Jan 23 Javascript
如何使用AngularJs打造权限管理系统【简易型】
May 09 Javascript
基于JavaScript实现购物网站商品放大镜效果
Sep 06 Javascript
js判断所有表单项不为空则提交表单的实现方法
Sep 09 Javascript
原生js实现商品放大镜效果
Jan 12 Javascript
js实现返回顶部效果
Mar 10 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
Mar 07 Javascript
jQuery简单判断值是否存在于数组中的方法示例
Apr 17 jQuery
webpack 样式加载的实现原理
Jun 12 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
Sony CFR 320 修复改造
2020/03/14 无线电
使用Apache的rewrite技术
2006/06/22 PHP
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
php设计模式 Command(命令模式)
2011/06/26 PHP
php中过滤非法字符的具体实现
2013/10/29 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
PHP实现用户登录的案例代码
2018/05/10 PHP
PHP levenshtein()函数用法讲解
2019/03/08 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
JavaScript CSS 修改学习第四章 透明度设置
2010/02/19 Javascript
通过pjax实现无刷新翻页(兼容新版jquery)
2014/01/31 Javascript
js获取url中&quot;?&quot;后面的字串方法
2014/05/15 Javascript
JS拖拽组件学习使用
2016/01/19 Javascript
leaflet的开发入门教程
2016/11/17 Javascript
JSON对象转化为字符串详解
2017/08/11 Javascript
vue之浏览器存储方法封装实例
2018/03/15 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
vue自动路由-单页面项目(非build时构建)
2019/04/30 Javascript
新手简单了解vue
2019/05/29 Javascript
Vue 刷新当前路由的实现代码
2019/09/26 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
2020/06/01 Javascript
vue.js+element 默认提示中英文操作
2020/11/11 Javascript
Python结巴中文分词工具使用过程中遇到的问题及解决方法
2017/04/15 Python
pandas object格式转float64格式的方法
2018/04/10 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
彻底搞懂 python 中文乱码问题(深入分析)
2020/02/28 Python
Python WebSocket长连接心跳与短连接的示例
2020/11/24 Python
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
Expedia加拿大官方网站:加拿大最大的在线旅游提供商
2017/12/31 全球购物
班干部竞选演讲稿
2014/04/24 职场文书
一帮一活动总结
2014/05/08 职场文书
文秘应届生求职信
2014/07/05 职场文书
党员批评与自我批评范文
2014/09/23 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书