【问题标题】:jQuery Accordion MenujQuery 手风琴菜单
【发布时间】:2011-05-01 21:18:33
【问题描述】:

这只是关于 jQuery 的一个非常新手的问题,但我只是用它来创建一个简单的手风琴菜单。 HTML 输出如下:

<ul id="nav-sub">
<li class="sub-level-0"><a href="#">Menu Item One</a></li>
<li class="parent-here last sub-level-0"><a href="#">Menu Item Two</a>   
    <ul>
        <li class="here sub-level-1"><a href="#">Sub Menu Item One</a></li>
        <li class="last sub-level-1"><a href="#">Sub Menu Item Two</a></li>
    </ul>  
</li>                                                                                        

而我目前拥有的 jQuery 是:

$(document).ready(function() {

// Show the children of the first product on page load but leave the others hidden
$("ul#nav-sub li.parent-here ul").show();

// Then attach a visibility toggle to each of the parents 
if ( $("ul#nav-sub li.sub-level-0 ul").size > 0 ) {
    $("ul#nav-sub li.sub-level-0 > a").click(function(){
        $(this).next().slideToggle("slow");
        return false; //Prevent the browser jump to the link anchor
    });
}

});

这是我可以让它完全正常工作的最接近的方法,但唯一不起作用的是切换动画。它不是一个缓慢的过渡,而是直接打开。

我基本上想要的是获得缓慢的过渡效果,但如果菜单项有任何子项(子列表 - 如上面菜单项所示二)。我需要菜单项一返回 true 并直接进入该页面。

谢谢

【问题讨论】:

  • 有什么理由不使用现有的手风琴插件之一?
  • 你看过JqueryUI 还是真的只是想自己构建它来学习或其他什么?
  • 我听说过 jQuery UI 并且知道 Accordion 选项,但是是的,我刚刚进入 jQuery 并且想自己编写任何东西来熟悉它。当我对它有信心时,jQuery UI 将提供有用的时间节省,但直到那时。
  • 嗨,Ian 你的代码似乎也不起作用jsfiddle.net/gJXL8。我厌倦了带有子菜单的两个顶部菜单,并且出现了问题......无论如何我重写了下面的一些代码。 . 希望没问题?

标签: jquery accordion


【解决方案1】:

我和你一样,喜欢想办法学习……我以为这很容易,但天哪,我花了 30 分钟调试这该死的东西……

http://jsfiddle.net/QcBNK/92/

HTML:

<ul id="nav-sub">
    <li class="sub-level-0"><a href="#">Menu Item One</a>
    <ul>
        <li class="sub-level-1"><a href="#">Sub Menu Item One</a></li>
        </ul>
      </li>
     <li class="sub-level-0"><a href="#">Menu Item Two</a>   
      <ul>
                <li class="sub-level-1"><a href="#">Sub Menu Item One</a></li>
                <li class="sub-level-1"><a href="#">Sub Menu Item Two</a></li>
      </ul>  
      </li>    
</ul>

jQuery :

$(document).ready(function() {
    //hide all SUB elements
    $(".sub-level-1").hide(); 
    //attach click to top elements only
    $("li.sub-level-0").mousedown(function(evt) {
        //find the sub element and toggle it..
       if(($(evt.target).text().indexOf("Sub"))!=0) {//Bad hack! sry =(
        $(this).find("ul .sub-level-1").slideToggle();
      }
    });

});

注意:我不是专家.. 我后来注意到子项目元素抛出事件,奇怪的是 find() 返回一个子元素&lt;ul&gt;,即使子元素抛出了事件! ?所以我不能使用evt.target==this 来测试冒泡事件。子元素事件返回整个父元素! =S 所以我扔了一个哈克!也许有更好的方法。

【讨论】:

  • 是的,我知道,这在表面上看起来很容易,但要进行微调却有点困难。我已经尝试过您的解决方案,但我并不总是在所有菜单上获得动画效果,当我单击子菜单项时,列表会再次滑回。对了,你为什么用 .mousedown 而不是 .click?
  • 哦,该链接上的代码未更新为本答案中的代码。请参阅jsfiddle.net/QcBNK/92 我在调试时更改为mousedown,但当一切正常时我忘记将其更改回来。虽然没有区别,但我不能从性能上说。观点。
  • 我已经尝试了您发送的链接中的代码,但不幸的是它仍然不存在。它不会阻止点击父项目,当点击子链接时,它会在应该保持打开状态时向上滑动。
  • 你确定吗?我检查了我之前评论中的链接以及 IE8、FF3 和 Chrome 中的答案(相同的东西)!? Menu 滑出子菜单,子菜单不会导致菜单折叠。一切都加载完毕确实需要几秒钟。见 [screenie] (mediafire.com/i/?tw6vw96j5pfiic6)
  • 嗯,我想知道真正的 html 文件和 jsfiddle 是否有区别.. 但是没有.. 在我的电脑上的 IE8、Chrome7 和 FF3 上试了一下,效果很好!?见pastebin.com/ReiYR09R
【解决方案2】:

HTML:

<dl>

<dt><a href="#">Menu Item One</a></dt>
<dd>
    <ul> 
        <li><a href="#">Sub Menu Item One</a></li>        
    </ul>
</dd>

<dt><a href="#">Menu Item Two</a></dt>
<dd>
    <ul> 
        <li><a href="#">Sub Menu Item One</a></li> 
        <li><a href="#">Sub Menu Item Two</a></li> 
    </ul>
</dd>

<dt><a href="#">Menu Item Three</a></dt>
<dd>
    <ul> 
        <li><a href='#'>Sub Menu Item One</a></li> 
        <li><a href='#'>Sub Menu Item Two</a></li> 
        <li><a href='#'>Sub Menu Item Three</a></li>            
    </ul>
</dd>

</dl>

jQuery:

<script>
    $("dd").hide();

    $("dt a").click(function(e) {
        $(e.target).parent().next().slideToggle();
    });
</script>

【讨论】:

  • 您应该为您的答案添加一些解释。不仅仅是代码。
猜你喜欢
  • 2014-03-31
  • 2013-02-03
  • 2015-07-22
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多