折叠菜单让你在尽可能小的地方放置尽可能多的内容,同时加大了操作的简便性,因此,深受前台设计师的喜爱。随着大家对动画效果的钟爱,折叠菜单也开始“动”起来了,本文介绍的就是 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. 查看linux系统版本命令 (转)

    查看linux系统版本命令 分类: Linux 知识小结2011-10-10 15:26 240162人阅读 评论(9) 收藏 举报 linuxredhatdebianx86susesun 一.查看内 ...

  2. jQuery(一)

    1,浏览器内核不同-->兼容性问题-->不同浏览器相对应不同代码 2,javascript框架, 只写代码,不用考虑浏览器兼容问题  prototype.mootools.jQuery(目 ...

  3. iOS获取当前时间

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; // ----------设置你想要的格式,hh与HH的区别:分别表示12小时 ...

  4. 用:hover伪类代替js的hover事件

    制作二级菜单要实现鼠标移动上去显示子菜单,鼠标移出子菜单隐藏,或者其他类似需求的地方,首先我会想到用jquery的hover事件来实现,如: $(".nav").hover(fun ...

  5. smarty模板中如何嵌入javascript脚本

    [官方网站](http://www.php100.com/manual/smarty/) 在smarty文件里直接写javascript代码时候,造成500错误. javascript代码有很多的{} ...

  6. sql:sum(value)与count(letter),当用户不存在时查询到的值

    SELECT sum(value) FROM invoice where username='yueer' SELECT count(letters) FROM invoice where usern ...

  7. Lambda表达式遍历集合

    1.Collection Java 8 为Iterable接口新增了一个forEach(Consumer action)默认方法,该方法所需参数的类型是一个函数式接口,而Iterable接口是Coll ...

  8. JavaScript中的编码函数

    JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...

  9. 如何让同局域网的同事访问我电脑上的PHP网站和数据库

    需求:想让公司同一局域网的同事电脑访问我的电脑里面的php项目. 条件:首先确认localhost正常访问你的本地项目 环境:我使用的是wampserver2.5集成环境 步骤: 1.增加新增监听端口 ...

  10. linux rpm -ivh MySQL-server-5.5.31-2.el6.i686.rpm

    linux rpm 安装mysql异常: [root@localhost upload]# rpm -ivh MySQL-server-5.5.31-2.el6.i686.rpmerror: Fail ...