折叠菜单让你在尽可能小的地方放置尽可能多的内容,同时加大了操作的简便性,因此,深受前台设计师的喜爱。随着大家对动画效果的钟爱,折叠菜单也开始“动”起来了,本文介绍的就是 DimX 制作的滑动式折叠菜单效果-Slashdot's Menu。
 
  1. <script type="text/javascript">
  2. function SDMenu(id) {
  3.     if (!document.getElementById || !document.getElementsByTagName)
  4.         return false;
  5.     this.menu = document.getElementById(id);
  6.     this.submenus = this.menu.getElementsByTagName("div");
  7.     this.remember = true;
  8.     this.speed = 3;
  9.     this.markCurrent = true;
  10.     this.oneSmOnly = false;
  11. }
  12. SDMenu.prototype.init = function() {
  13.     var mainInstance = this;
  14.     for (var i = 0; i < this.submenus.length; i++)
  15.         this.submenus[i].getElementsByTagName("span")[0].onclick = function() {
  16.             mainInstance.toggleMenu(this.parentNode);
  17.         };
  18.     if (this.markCurrent) {
  19.         var links = this.menu.getElementsByTagName("a");
  20.         for (var i = 0; i < links.length; i++)
  21.             if (links[i].href == document.location.href) {
  22.                 links[i].className = "current";
  23.                 break;
  24.             }
  25.     }
  26.     if (this.remember) {
  27.         var regex = new RegExp("sdmenu_" + encodeURIComponent(this.menu.id) + "=([01]+)");
  28.         var match = regex.exec(document.cookie);
  29.         if (match) {
  30.             var states = match[1].split("");
  31.             for (var i = 0; i < states.length; i++)
  32.                 this.submenus[i].className = (states[i] == 0 ? "collapsed" : "");
  33.         }
  34.     }
  35. };
  36. SDMenu.prototype.toggleMenu = function(submenu) {
  37.     if (submenu.className == "collapsed")
  38.         this.expandMenu(submenu);
  39.     else
  40.         this.collapseMenu(submenu);
  41. };
  42. SDMenu.prototype.expandMenu = function(submenu) {
  43.     var fullHeight = submenu.getElementsByTagName("span")[0].offsetHeight;
  44.     var links = submenu.getElementsByTagName("a");
  45.     for (var i = 0; i < links.length; i++)
  46.         fullHeight += links[i].offsetHeight;
  47.     var moveBy = Math.round(this.speed * links.length);
  48.     var mainInstance = this;
  49.     var intId = setInterval(function() {
  50.         var curHeight = submenu.offsetHeight;
  51.         var newHeight = curHeight + moveBy;
  52.         if (newHeight < fullHeight)
  53.             submenu.style.height = newHeight + "px";
  54.         else {
  55.             clearInterval(intId);
  56.             submenu.style.height = "";
  57.             submenu.className = "";
  58.             mainInstance.memorize();
  59.         }
  60.     }, 30);
  61.     this.collapseOthers(submenu);
  62. };
  63. SDMenu.prototype.collapseMenu = function(submenu) {
  64.     var minHeight = submenu.getElementsByTagName("span")[0].offsetHeight;
  65.     var moveBy = Math.round(this.speed * submenu.getElementsByTagName("a").length);
  66.     var mainInstance = this;
  67.     var intId = setInterval(function() {
  68.         var curHeight = submenu.offsetHeight;
  69.         var newHeight = curHeight - moveBy;
  70.         if (newHeight > minHeight)
  71.             submenu.style.height = newHeight + "px";
  72.         else {
  73.             clearInterval(intId);
  74.             submenu.style.height = "";
  75.             submenu.className = "collapsed";
  76.             mainInstance.memorize();
  77.         }
  78.     }, 30);
  79. };
  80. SDMenu.prototype.collapseOthers = function(submenu) {
  81.     if (this.oneSmOnly) {
  82.         for (var i = 0; i < this.submenus.length; i++)
  83.             if (this.submenus[i] != submenu && this.submenus[i].className != "collapsed")
  84.                 this.collapseMenu(this.submenus[i]);
  85.     }
  86. };
  87. SDMenu.prototype.expandAll = function() {
  88.     var oldOneSmOnly = this.oneSmOnly;
  89.     this.oneSmOnly = false;
  90.     for (var i = 0; i < this.submenus.length; i++)
  91.         if (this.submenus[i].className == "collapsed")
  92.             this.expandMenu(this.submenus[i]);
  93.     this.oneSmOnly = oldOneSmOnly;
  94. };
  95. SDMenu.prototype.collapseAll = function() {
  96.     for (var i = 0; i < this.submenus.length; i++)
  97.         if (this.submenus[i].className != "collapsed")
  98.             this.collapseMenu(this.submenus[i]);
  99. };
  100. SDMenu.prototype.memorize = function() {
  101.     if (this.remember) {
  102.         var states = new Array();
  103.         for (var i = 0; i < this.submenus.length; i++)
  104.             states.push(this.submenus[i].className == "collapsed" ? 0 : 1);
  105.         var d = new Date();
  106.         d.setTime(d.getTime() + (30 * 24 * 60 * 60 * 1000));
  107.         document.cookie = "sdmenu_" + encodeURIComponent(this.menu.id) + "=" + states.join("") + "; expires=" + d.toGMTString() + "; path=/";
  108.     }
  109. };
  110. </script>

调用方式
HTML:

    1.  
    2. var myMenu = new SDMenu("main_menu"); // 菜单ID
    3.  
    4. // 默认参数
    5. myMenu.speed = 3; // 折叠速度
    6. myMenu.remember = true; // 是否记录状态
    7. myMenu.oneSmOnly = false; // 一次只有一个菜单打开
    8. myMenu.markCurrent = true; // 是否高亮当前菜单
    9.  
    10. myMenu.init();
    11.  
    12. // 附加方法
    13. var firstSubmenu = myMenu.submenus[0];
    14. myMenu.expandMenu(firstSubmenu); // 打开一个菜单
    15. myMenu.collapseMenu(firstSubmenu); // 关闭一个菜单
    16. myMenu.toggleMenu(firstSubmenu); // 当菜单关闭时打开,当菜单打开时关闭
    17.  
    18. myMenu.expandAll(); // 打开所有菜单
    19. myMenu.collapseAll(); // 关闭所有菜单

滑动式折叠菜单 - Slashdot's Menu的更多相关文章

  1. CSS:响应式下的折叠菜单(条纹式)

    原文:CSS: Responsive Navigation Menu 译文:CSS:响应式导航菜单 译者:dwqs 写在之前,关于如何制作响应式的下拉菜单:响应式下的下拉菜单 之前,我写了一篇关于怎么 ...

  2. jquery 展开折叠菜单

    jquery 展开折叠菜单 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <ht ...

  3. 顶 兼容各种浏览器js折叠菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. JS三级折叠菜单特效 自动收缩其它级

    真的很不错!很实用,在IE6.IE7.IE8.FF.chrome等浏览器都正常运行,去掉CSS中 #menu ul中 {height:100px; overflow:auto;} 即可高度自适应 &l ...

  5. JS+CSS打造三级折叠菜单,自动收缩其它级 js

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  6. slideToggle+slideup实现手机端折叠菜单效果

    折叠菜单的效果,网上有很多的插件,比如bootstrap的 Collapse ,很好用也很简单,但是如果你使用的不是bootstrap框架,就会造成很多不必要的麻烦,比如默认样式被修改,代码冗余等等, ...

  7. 原生Js_实现简单的下拉折叠菜单(添加弹出动画效果)

    用javascript实现简单的下拉折叠菜单效果 实现步骤 (a)获得各操作的dom对象: (b)在所有菜单按钮对象上添加单击事件: (c)设置所有菜单按钮样式为空,并将当前按钮的样式设置为“acti ...

  8. CSS+JS相应式导航菜单

    响应式导航菜单 响应式导航菜单就是当网页在其他不同视口的样式,不同的设备需要不同的样式 需要掌握的知识 - 掌握媒体查询,如果你不是很懂那就看我写的CSS响应式布局 掌握CSS重的display:no ...

  9. 响应式导航菜单(css+js)

    1.响应式导航菜单 先来看下效果图把: 当视口大于640px的时候,导航条会显示在外,当视口小于768px的时候,导航菜单需要隐藏起来!代码如下: <!doctype html> < ...

随机推荐

  1. js中arguments的用法

    了解这个对象之前先来认识一下javascript的一些功能: 其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载.Javascrip中国每个函数都会有一个Argume ...

  2. 移动APP项目优化

    团队计划:设计一款给用户提供就医帮助的安卓APP. 项目计划:两个月内团队成员共同开发完成此款APP,此款APP提供预约挂号,名医名院咨询,就医导航等功能. 角色职责:负责交互设计.UI界面设计.1. ...

  3. Unity3D心得分享

    本篇文章的内容以各种tips为主,不间断更新 系列文章 =========================== "Unity测试系列"文章索引 Unity-Animator深入系列 ...

  4. android Json Gson FastJson 解析

    一 Json xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:a ...

  5. linux下的a.out文件

       当然这里,我更重要的是强调这个什么段,什么段.这以前就知道.但其实是对一个可以执行的c语言程序的分析.就好比你分析一篇作文.有标题.有段落. .out文件就是扩展名为out的文件,它本身不代表任 ...

  6. Upload java coed in Ubuntu(在Linux 16上,上传代码)

    指令如下:(按照如下指令顺序执行即可) 1.git status  (注释:可以查看哪些代码改动了) 2.git add .     (注意:不要漏掉add后面的" . ",将本地 ...

  7. Learn GIT

    1.创建版本库: git init 设置用户: git config --global user.email "you@example.com" 2.添加到仓库(将修改的内容提交到 ...

  8. 使用reflux进行react组件之间的通信

    前言 组件之间为什么要通信?因为有依赖. 那么,作为React组件,怎么通信? React官网说, 进行 父-子 通信,可以直接pass props. 进行 子-父 通信,往父组件传给子组件的函数注入 ...

  9. validate插件深入学习-02 常用方法和validate对象的方法

    ①检查表单元素是否有效 valid() 在表单内添加<button id="check">检查</button> $('#check').click(fun ...

  10. Mac系统下配置JDK环境变量

    第一次用Mac做开发,在网上也搜索了一些环境变量配置的文章,在此总结一下以方便日后使用. 1.打开终端Terminal: 2.进入当前用户主目录,cd ~: 3.临时授权,sudo su: 4.输入密 ...