jQuery UI手风琴让多个部分保持打开状态?

Wal*_*ker 91 html javascript jquery jquery-ui

我可能是个白痴,但你如何在jQuery UI的手风琴中保持多个部分?演示一次只有一个开放...我正在寻找一个可折叠的菜单类型系统.

2up*_*dia 116

很简单:

<script type="text/javascript">
    (function($) {
        $(function() {
            $("#accordion > div").accordion({ header: "h3", collapsible: true });
        })
    })(jQuery);
</script>

<div id="accordion">
    <div>
        <h3><a href="#">First</a></h3>
        <div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
    </div>
    <div>
        <h3><a href="#">Second</a></h3>
        <div>Phasellus mattis tincidunt nibh.</div>
    </div>
    <div>
        <h3><a href="#">Third</a></h3>
        <div>Nam dui erat, auctor a, dignissim quis.</div>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • (facepalm)每个街区都有独立的手风琴. (16认同)
  • 在jquery-ui 1.10中,开始折叠,而不是`create:function(event){$(event.target).accordion("activate",false); 你设置选项:`{active:false}` (7认同)
  • 太棒了 很高兴为您解决。:)我喜欢使事情尽可能简单。 (2认同)
  • 这是我用来测试它的jsFiddle http://jsfiddle.net/txo8rx3q/1/我还添加了一些CSS来停止打开的手风琴部分,使其在展开时看起来像是选中的 (2认同)

Mva*_*est 92

最初是AccordionjQuery UI文档中讨论的:

注意:如果您想一次打开多个部分,请不要使用手风琴

手风琴不允许同时打开多个内容面板,这需要花费很多精力.如果您正在寻找允许打开多个内容面板的小部件,请不要使用它.通常它可以用几行jQuery编写,如下所示:

jQuery(document).ready(function(){
  $('.accordion .head').click(function() {
      $(this).next().toggle();
      return false;
  }).next().hide();
});
Run Code Online (Sandbox Code Playgroud)

或动画:

jQuery(document).ready(function(){
  $('.accordion .head').click(function() {
      $(this).next().toggle('slow');
      return false;
  }).next().hide();
});
Run Code Online (Sandbox Code Playgroud)

"我可能是个白痴" - 如果你不阅读文档,你就不是白痴,但如果你遇到问题,通常会加快寻找解决方案的速度.

  • 此外,这根本不是问题的解决方案.手风琴文件和选项,事件等清单很差.而不是告诉用户"如果我们没有你的选择 - 不要使用它!" 他们应该说"抱歉没有选择,但我们欢迎任何为我们的插件添加功能的贡献者" (12认同)
  • 该解决方案不做任何手风琴造型. (9认同)
  • 这没有任何意义。如果音乐家的手臂相距很远,手风琴可以将所有褶皱打开,如果乐器的两半放在一起,或者介于两者之间,则所有褶皱都可以关闭。如果文字有任何意义,那么手风琴软件 UI 控件应该允许打开和关闭面板的任意组合。 (3认同)

Boa*_*oaz 74

在类似的帖子中发布此内容,但认为它也可能与此相关.

使用jQuery-UI Accordion的单个实例实现此目的

正如其他人所指出的那样,Accordion小部件没有直接执行此操作的API选项.但是,如果由于某种原因您必须使用窗口小部件(例如,您正在维护现有系统),则可以通过使用beforeActivate事件处理程序选项来破坏和模拟窗口小部件的默认行为来实现此目的.

例如:

$('#accordion').accordion({
    collapsible:true,

    beforeActivate: function(event, ui) {
         // The accordion believes a panel is being opened
        if (ui.newHeader[0]) {
            var currHeader  = ui.newHeader;
            var currContent = currHeader.next('.ui-accordion-content');
         // The accordion believes a panel is being closed
        } else {
            var currHeader  = ui.oldHeader;
            var currContent = currHeader.next('.ui-accordion-content');
        }
         // Since we've changed the default behavior, this detects the actual status
        var isPanelSelected = currHeader.attr('aria-selected') == 'true';

         // Toggle the panel's header
        currHeader.toggleClass('ui-corner-all',isPanelSelected).toggleClass('accordion-header-active ui-state-active ui-corner-top',!isPanelSelected).attr('aria-selected',((!isPanelSelected).toString()));

        // Toggle the panel's icon
        currHeader.children('.ui-icon').toggleClass('ui-icon-triangle-1-e',isPanelSelected).toggleClass('ui-icon-triangle-1-s',!isPanelSelected);

         // Toggle the panel's content
        currContent.toggleClass('accordion-content-active',!isPanelSelected)    
        if (isPanelSelected) { currContent.slideUp(); }  else { currContent.slideDown(); }

        return false; // Cancels the default action
    }
});
Run Code Online (Sandbox Code Playgroud)

查看jsFiddle演示

  • 谢谢!这是最佳解决方案,因为您不需要在现有环境中进行任何更改. (5认同)

Rom*_*kov 19

甚至更简单?

<div class="accordion">
    <h3><a href="#">First</a></h3>
    <div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
</div>    
<div class="accordion">
    <h3><a href="#">Second</a></h3>
    <div>Phasellus mattis tincidunt nibh.</div>
</div>         
<div class="accordion">
    <h3><a href="#">Third</a></h3>
    <div>Nam dui erat, auctor a, dignissim quis.</div>
</div>
<script type="text/javascript">
    $(".accordion").accordion({ collapsible: true, active: false });
</script>
Run Code Online (Sandbox Code Playgroud)


Ana*_*awa 14

我做了一个jQuery插件,它具有与jQuery UI Accordion相同的外观,可以保持所有tabs\sections打开

你可以在这里找到它

http://anasnakawa.wordpress.com/2011/01/25/jquery-ui-multi-open-accordion/

使用相同的标记

<div id="multiOpenAccordion">
        <h3><a href="#">tab 1</a></h3>
        <div>Lorem ipsum dolor sit amet</div>
        <h3><a href="#">tab 2</a></h3>
        <div>Lorem ipsum dolor sit amet</div>
</div>
Run Code Online (Sandbox Code Playgroud)

Javascript代码

$(function(){
        $('#multiOpenAccordion').multiAccordion();
       // you can use a number or an array with active option to specify which tabs to be opened by default:
       $('#multiOpenAccordion').multiAccordion({ active: 1 });
       // OR
       $('#multiOpenAccordion').multiAccordion({ active: [1, 2, 3] });

       $('#multiOpenAccordion').multiAccordion({ active: false }); // no opened tabs
});
Run Code Online (Sandbox Code Playgroud)

更新:插件已更新为支持默认活动选项卡选项

更新:此插件现已弃用.


Gio*_*ruz 7

简单:将手风琴激活到一个类,然后用它创建 div,就像手风琴的多个实例一样。

像这样:

JS

$(function() {
    $( ".accordion" ).accordion({
        collapsible: true,
        clearStyle: true,
        active: false,
    })
});
Run Code Online (Sandbox Code Playgroud)

超文本标记语言

<div class="accordion">
    <h3>Title</h3>
    <p>lorem</p>
</div>
<div class="accordion">
    <h3>Title</h3>
    <p>lorem</p>
</div>
<div class="accordion">
    <h3>Title</h3>
    <p>lorem</p>
</div>
Run Code Online (Sandbox Code Playgroud)

https://jsfiddle.net/sparhawk_odin/pm91whz3/


Don*_*van 6

实际上是在互联网上搜索一段时间的解决方案.接受的答案给出了"按书"的答案.但我不想接受,所以我一直在寻找并发现:

http://jsbin.com/eqape/1601/edit - 实例

此示例提取适当的样式并同时添加所请求的功能,并在每次标题单击时添加自己的功能.还允许多个div位于"h3"之间.

 $("#notaccordion").addClass("ui-accordion ui-accordion-icons ui-widget ui-helper-reset")
  .find("h3")
    .addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-top ui-corner-bottom")
    .hover(function() { $(this).toggleClass("ui-state-hover"); })
    .prepend('<span class="ui-icon ui-icon-triangle-1-e"></span>')
    .click(function() {
      $(this).find("> .ui-icon").toggleClass("ui-icon-triangle-1-e ui-icon-triangle-1-s").end()


        .next().toggleClass("ui-accordion-content-active").slideToggle();
        return false;
    })
    .next()
      .addClass("ui-accordion-content  ui-helper-reset ui-widget-content ui-corner-bottom")
      .hide();
Run Code Online (Sandbox Code Playgroud)

HTML代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Toggle Panels (not accordion) using ui-accordion  styles</title>

<!-- jQuery UI  |  http://jquery.com/  http://jqueryui.com/  http://jqueryui.com/docs/Theming  -->
<style type="text/css">body{font:62.5% Verdana,Arial,sans-serif}</style>
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/themes/base/jquery-ui.css" rel="stylesheet" type="text/css" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js"></script>


</head>
<body>

<h1>Toggle Panels</h1>
<div id="notaccordion">
  <h3><a href="#">Section 1</a></h3>
  <div class="content">
    Mauris mauris  ante, blandit et, ultrices a, suscipit eget, quam. Integer
    ut neque. Vivamus  nisi metus, molestie vel, gravida in, condimentum sit
    amet, nunc. Nam a  nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut
    odio. Curabitur  malesuada. Vestibulum a velit eu ante scelerisque vulputate.
  </div>
  <h3><a href="#">Section 2</a></h3>
  <div>
    Sed non urna. Donec et ante. Phasellus eu ligula.  Vestibulum sit amet
    purus. Vivamus hendrerit, dolor at aliquet laoreet,  mauris turpis porttitor
    velit, faucibus interdum tellus libero ac justo.  Vivamus non quam. In
    suscipit faucibus urna.
  </div>
  <h3><a href="#">Section 3</a></h3>
  <div class="top">
  Top top top top
  </div>
  <div class="content">
    Nam enim risus, molestie et, porta ac, aliquam ac,  risus. Quisque lobortis.
    Phasellus pellentesque purus in massa. Aenean in pede.  Phasellus ac libero
    ac tellus pellentesque semper. Sed ac felis. Sed  commodo, magna quis
    lacinia ornare, quam ante aliquam nisi, eu iaculis leo  purus venenatis dui.
    <ul>
      <li>List item one</li>
      <li>List item two</li>
      <li>List item  three</li>
    </ul>
  </div>
  <div class="bottom">
  Bottom bottom bottom bottom
  </div>
  <h3><a href="#">Section 4</a></h3>
  <div>
    Cras dictum. Pellentesque habitant morbi tristique  senectus et netus
    et malesuada fames ac turpis egestas. Vestibulum ante  ipsum primis in
    faucibus orci luctus et ultrices posuere cubilia Curae;  Aenean lacinia
    mauris vel est.
    Suspendisse eu nisl. Nullam ut libero. Integer  dignissim consequat lectus.
    Class aptent taciti sociosqu ad litora torquent per  conubia nostra, per
    inceptos himenaeos.
  </div>
</div>

</body>
</html>`
Run Code Online (Sandbox Code Playgroud)


Spr*_*ula 5

我找到了一个棘手的解决方案.让我们调用相同的函数两次但具有不同的id.

JQuery代码

$(function() {
    $( "#accordion1" ).accordion({
        collapsible: true, active: false, heightStyle: "content"
    });
    $( "#accordion2" ).accordion({
        collapsible: true, active: false, heightStyle: "content"
    });
});
Run Code Online (Sandbox Code Playgroud)

HTML代码

<div id="accordion1">
    <h3>Section 1</h3>
    <div>Section one Text</div>
</div>
<div id="accordion2">   
    <h3>Section 2</h3>
    <div>Section two Text</div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 根据其他人的建议,您最好使用基于 `class` 的单个选择器,这意味着您**不要重复自己**([DRY](http://en.wikipedia.org/wiki/不要_重复_你自己)) (2认同)