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


Answers:


94

原本是讨论的手风琴jQuery用户界面文档

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

手风琴不允许同时打开一个以上的内容面板,为此需要付出很多努力。如果您正在寻找一种可以打开多个内容面板的小部件,请不要使用它。通常,它可以用几行jQuery代替,如下所示:

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

或动画:

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

“我可能是个白痴”-如果您不阅读文档,那么您不是白痴,但是如果遇到问题,通常可以加快找到解决方案的速度。


9
此解决方案不执行任何手风琴样式。
forresto 2012年

12
此外,这根本解决不了这个问题。手风琴文档和选项,事件等列表很差。并且不要告诉用户“如果我们没有适合您的选项,请不要使用它!” 他们应该说“对不起,目前还没有选择,但是我们欢迎任何为我们的出色插件添加功能的贡献者”
artgrohe 2013年

我引用的文本已从文档中删除。我添加了指向存档版本的链接。
MvanGeest,2014年

1
请记住,jQuery UI手风琴的作用不只是创建实际的手风琴效果。它还为屏幕阅读器添加了许多辅助功能标记。
布赖恩

2
这没有任何意义。如果音乐家的手臂相距很远,则手风琴可以打开所有的褶,如果乐器的两半在一起,则可以关闭所有的褶,或者介于两者之间。如果单词意味着什么,那么手风琴软件的UI控件应允许打开和关闭面板的任意组合。
birdus

119

很简单:

<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>

1
很棒。我添加 create: function(event) { $(event.target).accordion( "activate", false ); }开始崩溃了。
forresto 2012年

2
太棒了 很高兴为您解决。:)我喜欢使事情尽可能简单。
2upmedia

7
在jquery-ui 1.10中,要开始折叠,而不是 create: function(event) { $(event.target).accordion( "activate", false ); }设置以下选项:{active: false}
damko

16
(facepalm)每个块都有单独的手风琴。
Paul Annekov,

2
这是我用来测试它的jsFiddle jsfiddle.net/txo8rx3q/1我还添加了一些CSS来停止打开的手风琴部分,使其在展开时看起来处于选中状态
Matthew Lock

77

在类似的主题中发布此内容,但认为在这里也可能与此相关。

使用jQuery-UI手风琴的单个实例来实现

正如其他人指出的那样,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
    }
});

观看jsFiddle演示


6
谢谢!这是最好的解决方案,因为您无需在所有现有环境中进行更改。
artgrohe 2013年

它需要jQuery UI 1.9.0+(Drupal 7卡在1.8.7中)
Capi Etheriel 2014年

1
我相信上课的人已经改变了ui-accordion-header-active
Tim Vermaelen 2014年

对我来说非常有效,最少的重构:-)
Darkloki

好的解决方案,唯一的问题是此解决方案不会采用图标选项:-)
Tachyons,2015年

20

或更简单?

<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>

这真是我的宝贝。简单的解决方案,它解决了我在处理大量手风琴项目时遇到的问题。令人惊讶的是,设置大量的手风琴效果很好。谢谢!
代码Novitiate

14

我已经完成了一个jQuery插件,其外观与jQuery UI Accordion相同,并且可以使所有选项卡\部分保持打开状态

你可以在这里找到它

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>

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
});

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

更新:此插件现已弃用。


伟大的解决方案。
Trimantra软件解决方案,2016年

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();

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>`

5

我找到了一个棘手的解决方案。让我们两次调用相同的函数,但使用不同的ID。

jQuery代码

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

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>

2
您最好根据class其他人的建议使用基于单个选择器的选择器,这意味着您不要重复自己DRY
Scotty.NET 2013年

4

很简单,创建多个Accordian div,每个div代表一个锚标记,例如:

<div>
<div class="accordion">
<a href = "#">First heading</a>
</div>
<div class="accordion">
<a href = "#">First heading</a>
</div>
</div>

它加了一些标记。但是像专业...


4

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

像这样:

JS

$(function() {
    $( ".accordion" ).accordion({
        collapsible: true,
        clearStyle: true,
        active: false,
    })
});

的HTML

<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>

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


1
我尝试了线程中的所有答案,并且效果最佳。使用最新的jquery和jqueryUI,现在其他解决方案存在很多样式问题。这是2017年更新jsfiddle.net/rambutan2000/eqbbgb7g
Geordie

@Geordie我很高兴这有所帮助。
Giovan Cruz

2

只需将手风琴的每个部分称为自己的手风琴即可。active:第一个为n(因此将显示)为n,其余为1,2,3,4,etc。由于每个都是自己的手风琴,所以它们都只有一个部分,其余部分将折叠起来开始。

$('.accordian').each(function(n, el) {
  $(el).accordion({
    heightStyle: 'content',
    collapsible: true,
    active: n
  });
});

请注意,以下2upmedia的答案
Boaz

2

更简单的是,在每个li标签的class属性中标记它,并让jquery遍历每个li来初始化手风琴。


1

没有jQuery-UI手风琴,人们可以简单地做到这一点:

<div class="section">
  <div class="section-title">
    Section 1
  </div>
  <div class="section-content">
    Section 1 Content: Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.
  </div>
</div>

<div class="section">
  <div class="section-title">
    Section 2
  </div>
  <div class="section-content">
    Section 2 Content: Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.
  </div>
</div>

和js

$( ".section-title" ).click(function() {
    $(this).parent().find( ".section-content" ).slideToggle();
});

https://jsfiddle.net/gayan_dasanayake/6ogxL7nm/


0

打开jquery-ui-*。js

$.widget( "ui.accordion", {

_eventHandler: function( event ) {里面找到

更改

var options = this.options,             active = this.active,           clicked = $( event.currentTarget ),             clickedIsActive = clicked[ 0 ] === active[ 0 ],             collapsing = clickedIsActive && options.collapsible,            toShow = collapsing ? $() : clicked.next(),             toHide = active.next(),             eventData = {
                oldHeader: active,
                oldPanel: toHide,
                newHeader: collapsing ? $() : clicked,
                newPanel: toShow            };

var options = this.options,
    clicked = $( event.currentTarget),
    clickedIsActive = clicked.next().attr('aria-expanded') == 'true',
    collapsing = clickedIsActive && options.collapsible;

    if (clickedIsActive == true) {
        var toShow = $();
        var toHide = clicked.next();
    } else {
        var toShow = clicked.next();
        var toHide = $();

    }
    eventData = {
        oldHeader: $(),
        oldPanel: toHide,
        newHeader: clicked,
        newPanel: toShow
    };

之前 active.removeClass( "ui-accordion-header-active ui-state-active" );

添加if (typeof(active) !== 'undefined') {和关闭}

请享用


-1

您只需使用jquery each()函数;

$(function() {
    $( ".selector_class_name" ).each(function(){
        $( this ).accordion({
          collapsible: true, 
          active:false,
          heightStyle: "content"
        });
    });
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.