2013-03-20 42 views
1

我想创建一个简单的移动菜单,当点击时会打开和关闭。我也希望它只显示父母,而不是孩子的猫,直到父母被点击。css显示属性干扰我的jQuery的切换

我研究过,并找到了这两个好的答案。但是,当我结合时,我没有得到所需的结果。

具体来说,我使用的jquery切换依赖于设置为“display:none”的nav ul作为它们的开始状态,但这会以某种方式干扰我的其他jquery功能,以隐藏其父级为最高级别的元素ul类。

除了没有任何子项的部分在菜单初始加载时显示以外,一切都按预期工作。但是,一旦我删除了我最初完全隐藏了导航栏的css行,那么这些孩子就会隐藏起来(但当然,我的导航栏随后会在加载后展开,当我想隐藏它时)。试图解决它的:[http://saks-jewelers.com/mobile-nav/mobile_nav.html#]

这里是我的html代码和jQuery:

<!doctype html> 
    <html lang="en"> 
    <head> 
    <meta charset="utf-8"> 
    <title>Responsive Header Nav</title> 
    <meta name="description" content="Responsive Header Nav"> 
    <meta name="author" content="Treehouse"> 
    <meta name="viewport" content="width=device-width; initial-scale=1; maximum-scale=1"> 
    <link rel="stylesheet" href="styles.css"> 
    <!--[if IE]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]--> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"> 
    </script> 
    <script> 
    $(document).ready(function(){ 
     $("#menu-icon").click(function(){ 
     $("nav ul").toggle(200); 
     }); 

     $('#nav>li>ul').each(function(){ 
      if($(this).parent().hasClass("level0")) 
      { 
       $(this).hide(); 
      } else { 
       $(this).show(); 
      } 
     }); 
     $('#nav>li').click(function(){ 
      // check that the menu is not currently animated 
      if ($('#nav ul:animated').size() == 0) { 
       // create a reference to the active element (this) 
       // so we don't have to keep creating a jQuery object 
       $heading = $(this); 
       // create a reference to visible sibling elements 
       // so we don't have to keep creating a jQuery object 
       $expandedSiblings = $heading.siblings().find('ul:visible'); 
       if ($expandedSiblings.size() > 0) { 
        $expandedSiblings.slideUp(200, function(){ 
         $heading.find('ul').slideDown(200); 
        }); 
       } 
       else { 
        $heading.find('ul').slideDown(200); 
       } 
      } 
     }); 
    }); 
    </script> 
    <body> 
    <header> 
    <a href="#" id="logo"></a> 
    <nav> 
     <a href="#" id="menu-icon"></a> 
    <ul id="nav"> 
      <li class="level0 nav-1 first level-top parent"> 
      <a href="#" class="level-top"><span>Rings</span></a> 
      <ul class="level0"> 
       <li class="level1 nav-1-1 first"><a href="#" class=""><span>CZ Fashion</span></a></li> 
       <li class="level1 nav-1-2"><a href="#" class=""><span>Gemstone Fashion</span></a></li> 
       <li class="level1 nav-1-3"><a href="#" class=""><span>Silver &amp; Gold Fashion</span></a></li> 
       <li class="level1 nav-1-4"><a href="#" class=""><span>Pearl</span></a></li> 
       <li class="level1 nav-1-5"><a href="#" class=""><span>Moissanite™</span></a></li> 
       <li class="level1 nav-1-6"><a href="#" class=""><span>Religious &amp; Symbolic</span></a></li> 
       <li class="level1 nav-1-7"><a href="#" class=""><span>Youth</span></a></li> 
       <li class="level1 nav-1-8"><a href="#" class=""><span>Promise Rings</span></a></li> 
       <li class="level1 nav-1-9 last"><a href="#" class=""><span>Wedding</span></a></li> 
      </ul> 
     </li> 
     <li class="level0 nav-2 level-top parent"><a href="#" class="level-top"><span>Earrings</span></a> 
      <ul class="level0"> 
       <li class="level1 nav-2-1 first"><a href="#" class=""><span>CZ Fashion</span></a></li> 
       <li class="level1 nav-2-2"><a href="#" class=""><span>Gemstone Fashion</span></a></li> 
       <li class="level1 nav-2-3"><a href="#" class=""><span>Silver &amp; Gold Fashion</span></a></li> 
       <li class="level1 nav-2-4"><a href="#" class=""><span>Pearl</span></a></li> 
       <li class="level1 nav-2-5"><a href="#" class=""><span>Moissanite™</span></a></li> 
       <li class="level1 nav-2-6"><a href="#" class=""><span>Religious &amp; Symbolic</span></a></li> 
       <li class="level1 nav-2-7 last"><a href="#" class=""><span>Youth</span></a></li> 
      </ul> 
     </li> 
    </ul> 
    </nav> 
    </header> 
    <section> 
    <img src="featured.png" alt="Respond" /> 
    <h1>Respond to Your Surroundings</h1> 
    <p>...Filler Text</p> 
    <p>...Filler Text</p> 
    <p>Filler Text</p> 
    </section> 
    </body> 
    </html> 

,这里是我的CSS:

/*RESET*/ 
    html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {margin:0; padding:0; border:0; outline:0; font-size:100%; vertical-align:baseline; background:transparent;} body {line-height: 1;}ol, ul{list-style:none;} blockquote, q{quotes:none;} blockquote:before, blockquote:after, q:before, q:after{content:'';content:none;} :focus{outline:0;} ins{text-decoration:none;} del{text-decoration:line-through;} table{border-collapse:collapse; border-spacing:0;} 

    /*MAIN*/ 
    body { 
     font-size: 1.05em; 
     line-height: 1.25em; 
     font-family: Helvetica Neue, Helvetica, Arial; 
     background: #f9f9f9; 
     color: #555; 
    } 
    a { 
     color: #4C9CF1; 
     text-decoration: none; 
     font-weight: bold; 
    } 
    a:hover { color: #444; } 
    img { width: 100%; } 
    header { 
     background: #fff; 
     width: 100%; 
     height: 76px; 
     position: fixed; 
     top: 0; 
     left: 0; 
     border-bottom: 4px solid #4C9CF1; 
     z-index: 100; 
      } 
    #logo{ 
     margin: 20px; 
     float: left; 
     width: 200px; 
     height: 40px; 
     background: url(nav-logo.png) no-repeat center; 
     display: block; 
      } 
    nav { float: right; padding: 20px; } 
    #menu-icon { 
     display: hidden; 
     width: 40px; 
     height: 40px; 
     background: #4C8FEC url(nav-menu-icon.png) center; 
    } 
    a:hover#menu-icon {background-color: #444; border-radius: 4px 4px 0 0; } 
    ul { list-style: none; } 
    li { 
     display: inline-block; 
     float: left; 
      padding: 10px 
    } 
    .current {color: #2262AD;} 
    section { 
     margin: 80px auto 40px; 
     max-width: 980px; 
     position: relative; 
     padding: 20px 
    } 
    h1 { 
     font-size: 2em; 
     color: #2262AD; 
     line-height: 1.15em; 
     margin: 20px 0 ; 
    } 
    p {line-height: 1.45em; margin-bottom: 20px;} 

    /*MEDIA QUERY*/ 
    @media only screen and (max-width : 640px) { 

     header {position: absolute; } 
     #menu-icon { display:inline-block; } 
     nav ul, nav:active ul { 
      display: none; 
      position: absolute; 
      padding: 20px; 
      background: #fff; 
      right: 20px; 
      top: 60px; 
      width: 50%; 
     } 
     nav li { 
      text-align: left; 
      width: 100%; 
      padding: 10px 0; 
      margin: 0; 
     } 

而且我这只是一个愚蠢的做法,我正在尝试做什么,我愿意接受更简单的替代方案。

+0

FWIW,当我在一个简单的演示页面上进行设置时,最终的计划是将其实施到一个可以动态创建导航菜单的magento店面。 – skondris 2013-03-21 00:21:03

+0

'$('#nav> li> ul')。show()。parent('。level0')。find('> ul')。hide(); ()($(this).parent()。hasClass(“level0”)) { $(this))与$('#nav> li> ul' .hide(); } else { $(this).show(); } });' – 2013-03-21 00:24:05

+0

我想了一下,它可以简单地为:'$('#nav> li .level0> ul')。hide();' – 2013-03-21 00:27:53

回答

1

您可能能够改善这方面的一些(如果我得到你的意图,这应该工作)

var subs = $('#nav>li.level0>ul'); 
$("#menu-icon").click(function() { 
     $("nav> ul").toggle(200); 
     if ($("nav ul").is(':hidden')) { 
      subs.hide(); 
     } 
    }); 
    subs.hide(); 
    $('#nav>li').click(function() { 
     if (!$('#nav ul:animated').length) { 
      $heading = $(this); 
      $expandedSiblings = $heading.siblings().find('ul:visible'); 
      if ($expandedSiblings.length) { 
       $expandedSiblings.slideUp(200, function() { 
        $heading.find('ul').slideDown(200); 
       }); 
      } else { 
       $heading.find('ul').slideDown(200); 
      } 
     } 
    }); 

这也似乎工作,更简单:

var subs = $('#nav>li.level0>ul'); 
$("#menu-icon").click(function() { 
    $("nav> ul").toggle(200); 
    if ($("nav ul").is(':hidden')) { 
     subs.hide(); 
    } 
}); 
subs.hide(); 
$('#nav>li').click(function() { 
    if (!$('#nav ul:animated').length) { 
     $(this).siblings().find('ul:visible').slideUp(200, function() { 
      $(this).find('ul').slideDown(200); 
     }); 
     $(this).find('ul').slideDown(200); 
    } 
}); 
+0

太棒了!谢谢!这个作品完美!我使用了更简单的一个。 – skondris 2013-03-21 01:06:31

1

我认为你已经结束了整个事情。我会做它的方式:

<div class="rings" style="display:none"> 
    <ul> 
     <li> ring 1 .... </li> 
     <li> ring 2 .... </li> 
     .... 
    </ul> 
</div> 

<div class="earrings" style="display:none"> 
    <ul> 
     <li> ring 1 .... </li> 
     <li> ring 2 .... </li> 
     .... 
    </ul> 
</div> 

下一个jQuery的:

​​

至于CSS去那里有点没用的东西在那里,但我认为你可以解决这个问题,没有显著的问题。

+0

是的,我倾向于过分复杂的东西。 :)注意:我将在一个magento店面中实现这个动态菜单,所以我宁愿坚持像nav设置容器vs每个父导航元素设置显示属性。再次,切换工作本身很好,这就是当我也尝试这个其他人的方法隐藏子元素,直到父母被点击,事情变得粘滞。 – skondris 2013-03-21 00:24:37