代码之家  ›  专栏  ›  技术社区  ›  codea

JQuery slideUp水平菜单而不是slideDown

  •  2
  • codea  · 技术社区  · 15 年前

    我有这个菜单:

    <html>
     <head>
      <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js"></script>
      <script>
       $(function() {
        $("#menu").find("li").each(function() {
         if ($(this).find("ul").length > 0) {
          $(this).mouseenter(function() {
           $(this).find("ul").stop(true, true).slideDown(); 
          }); 
          $(this).mouseleave(function() {  
           $(this).find("ul").stop(true, true).slideUp();  
          });
         }
        });
       });
      </script>
      <style>
       #menu {
        display:block;
        margin:120px auto 20px;
        border:1px solid #222;
        position:relative;
        background-color:#6a6a6a;
        font:16px Tahoma, Sans-serif;
       }  
       #menu ul {
        padding:0;
        margin:0;
       }  
       #menu li {
        position:relative;
        float:left;
        list-style-type:none;
       }  
       #menu ul:after {
        content:".";
        display:block;
        height:0;
        clear:both;
        visibility:hidden;
       }  
       #menu li a {
        display:block;
        padding:10px 20px;
        border-left:1px solid #999;
        border-right:1px solid #222;
        color:#eee;
        text-decoration:none;
       }  
       #menu li a:focus {
        outline:none;
        text-decoration:underline;
       }  
       #menu li:first-child a {
        border-left:none;
       }  
       #menu li.last a {
        border-right:none;
       }  
       #menu a span {
        display:block;
        float:right;
        margin-left:5px;
       }  
       #menu ul ul {
        display:none;
        width:100%;
        position:absolute;
        left:0;
        background:#6a6a6a;
       }  
       #menu ul ul li {
        float:none;
       }  
       #menu ul ul a {
        padding:5px 10px;
        border-left:none;
        border-right:none;
        font-size:14px;
       }
    
       a:hover {
        cursor: pointer;
       }
      </style>
     </head>
     <body>
      <div id="menu">
       <ul>
        <li>
         <a>Item1</a>
        </li>
        <li>
         <a>Item2</a>
         <ul>
          <li><a href="#">item2-1</a></li>
          <li><a href="#">item2-2</a></li>
          <li><a href="#">item2-3</a></li>
         </ul>
        </li>
       <li>
        <a>Item3</a>
        <ul>
         <li><a href="#">item3-1</a></li>
         <li><a href="#">item3-2</a></li>
         <li><a href="#">item3-3</a></li>
        </ul>
       </li>
       <li>
        <a>Item4</a>
       </li>
      </ul>
     </div>
     <body>
    <html>
    

    当光标位于 li 包含 ul .

    我希望子菜单向上滑动到水平菜单上方,而不是向下滑动。

    我怎样才能做到这一点?

    谢谢您!

    Here's the jsFiddle

    3 回复  |  直到 15 年前
        1
  •  6
  •   generalhenry    15 年前
    #menu ul ul {
        bottom:38px;
    } 
    

    设置嵌套列表的底部就可以了

        2
  •  3
  •   user113716    15 年前

    我不完全确定问题出在哪里,但您应该能够使用更复杂的选择器将代码缩减为:

    $("#menu > ul > li:has(ul)").mouseenter(function() { 
        $(this).find("ul").stop(true, true).slideDown();  
    }).mouseleave(function() {  
        $(this).find("ul").stop(true, true).slideUp();  
    });
    

    编辑: 我明白了,你希望菜单的物理方向是向上而不是向下。要做到这一点,你的菜单将需要绝对定位在底部。然后高度的变化会使它们上升。

    例子: http://jsfiddle.net/BKLjs/

    #menu ul ul {
        display:none;
        width:100%;
        position:absolute;
        left:0;
        bottom: 40px;
        background:#6a6a6a;
    }
    

    下面是进一步的代码缩减: http://jsfiddle.net/BKLjs/2/

    $("#menu > ul > li:has(ul)").hover(function(e) { 
        $(this).find("ul").stop(true, true)['slide' + (e.type === 'mouseenter' ? 'Down' : 'Up')]();  
    });
    
        3
  •  2
  •   Sebastian Patane Masuelli    15 年前

    http://jsfiddle.net/SebastianPataneMasuelli/LDQfW/10/

    注意:使用jquery用户界面:

    .show("slide", { direction: "down" });
    .hide("slide", { direction: "up" });