zoukankan      html  css  js  c++  java
  • 滑动式折叠菜单 - Slashdot's Menu

    折叠菜单让你在尽可能小的地方放置尽可能多的内容,同时加大了操作的简便性,因此,深受前台设计师的喜爱。随着大家对动画效果的钟爱,折叠菜单也开始“动”起来了,本文介绍的就是 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.     
    49.     var mainInstance = this;
    50.     var intId = setInterval(function({
    51.         var curHeight = submenu.offsetHeight;
    52.         var newHeight = curHeight + moveBy;
    53.         if (newHeight < fullHeight)
    54.             submenu.style.height = newHeight + "px";
    55.         else {
    56.             clearInterval(intId);
    57.             submenu.style.height = "";
    58.             submenu.className = "";
    59.             mainInstance.memorize();
    60.         }
    61.     }, 30);
    62.     this.collapseOthers(submenu);
    63. };
    64. SDMenu.prototype.collapseMenu = function(submenu{
    65.     var minHeight = submenu.getElementsByTagName("span")[0].offsetHeight;
    66.     var moveBy = Math.round(this.speed * submenu.getElementsByTagName("a").length);
    67.     var mainInstance = this;
    68.     var intId = setInterval(function({
    69.         var curHeight = submenu.offsetHeight;
    70.         var newHeight = curHeight - moveBy;
    71.         if (newHeight > minHeight)
    72.             submenu.style.height = newHeight + "px";
    73.         else {
    74.             clearInterval(intId);
    75.             submenu.style.height = "";
    76.             submenu.className = "collapsed";
    77.             mainInstance.memorize();
    78.         }
    79.     }, 30);
    80. };
    81. SDMenu.prototype.collapseOthers = function(submenu{
    82.     if (this.oneSmOnly{
    83.         for (var i = 0; i < this.submenus.length; i++)
    84.             if (this.submenus[i] != submenu && this.submenus[i].className != "collapsed")
    85.                 this.collapseMenu(this.submenus[i]);
    86.     }
    87. };
    88. SDMenu.prototype.expandAll = function({
    89.     var oldOneSmOnly = this.oneSmOnly;
    90.     this.oneSmOnly = false;
    91.     for (var i = 0; i < this.submenus.length; i++)
    92.         if (this.submenus[i].className == "collapsed")
    93.             this.expandMenu(this.submenus[i]);
    94.     this.oneSmOnly = oldOneSmOnly;
    95. };
    96. SDMenu.prototype.collapseAll = function({
    97.     for (var i = 0; i < this.submenus.length; i++)
    98.         if (this.submenus[i].className != "collapsed")
    99.             this.collapseMenu(this.submenus[i]);
    100. };
    101. SDMenu.prototype.memorize = function({
    102.     if (this.remember{
    103.         var states = new Array();
    104.         for (var i = 0; i < this.submenus.length; i++)
    105.             states.push(this.submenus[i].className == "collapsed" ? 0 : 1);
    106.         var d = new Date();
    107.         d.setTime(d.getTime() + (30 * 24 * 60 * 60 * 1000));
    108.         document.cookie = "sdmenu_" + encodeURIComponent(this.menu.id) + "=" + states.join("") + "; expires=" + d.toGMTString() + "; path=/";
    109.     }
    110. };
    111. </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(); // 关闭所有菜单
  • 相关阅读:
    剑指offer(14)链表中倒数第K个节点
    剑指offer(13)调整数组顺序使奇数位于偶数前面
    跨域资源共享CORS
    同源政策
    剑指offer(12)数值的整数次方
    剑指offer(11)二进制中1的个数
    面试金典——交点
    LeetCode——简化路径
    LeetCode——跳跃游戏 I-II
    LeetCode——最大矩形
  • 原文地址:https://www.cnblogs.com/whtydn/p/5953991.html
Copyright © 2011-2022 走看看