jQuery UI Akkordeon, das mehrere Abschnitte offen hält?

93

Ich mag ein Idiot sein, aber wie hält man mehrere Abschnitte im Akkordeon der jQuery-Benutzeroberfläche offen? Die Demos haben jeweils nur eine geöffnet ... Ich suche ein zusammenklappbares Menüsystem.

Gehhilfe
quelle
18
Schauen Sie sich diese jsfiddle.net/DkHyd
Supersuphot
Nun, dein Plugin ist einfach perfekt! Vielen Dank, Alter!
SexyBeast

Antworten:

94

Dies wurde ursprünglich in der jQuery-UI-Dokumentation für Akkordeon erläutert :

HINWEIS: Wenn Sie mehrere Abschnitte gleichzeitig öffnen möchten, verwenden Sie kein Akkordeon

Ein Akkordeon erlaubt nicht, dass mehr als ein Inhaltsfenster gleichzeitig geöffnet ist, und dies erfordert viel Aufwand. Wenn Sie nach einem Widget suchen, mit dem mehr als ein Inhaltsfenster geöffnet werden kann, verwenden Sie dieses nicht. Normalerweise kann es stattdessen mit ein paar Zeilen jQuery geschrieben werden, ungefähr so:

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

Oder animiert:

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

"Ich bin vielleicht ein Idiot" - Sie sind kein Idiot, wenn Sie die Dokumentation nicht lesen, aber wenn Sie Probleme haben, beschleunigt dies normalerweise die Suche nach einer Lösung.

MvanGeest
quelle
9
Diese Lösung übernimmt kein Akkordeon-Styling.
Forresto
12
Darüber hinaus ist dies überhaupt keine Lösung für die Frage. Das Akkordeon-Dokument und die Liste der Optionen, Ereignisse usw. sind nur schlecht. Und anstatt dem Benutzer zu sagen, "wenn wir nicht die Optionen für Sie haben - verwenden Sie sie nicht!" Sie sollten sagen "Entschuldigung, dass es noch keine Option dafür gibt, aber wir begrüßen alle Mitwirkenden, die unserem großartigen Plugin Funktionalität hinzufügen"
artgrohe
Der von mir zitierte Text wurde aus der Dokumentation entfernt. Ich habe einen Link zu einer archivierten Version hinzugefügt.
MvanGeest
1
Beachten Sie, dass jQuery UI Accordion mehr als nur den eigentlichen Akkordeoneffekt erzeugt. Es fügt auch viele Barrierefreiheits-Markups für Bildschirmleser hinzu.
Brian
2
Das macht keinen Sinn. Ein Akkordeon kann alle Falten offen haben, wenn die Arme des Musikers weit voneinander entfernt sind, alle Falten geschlossen, wenn die Instrumentenhälften zusammen sind, oder etwas dazwischen. Wenn Wörter etwas bedeuten, sollte die Benutzeroberfläche der Akkordeonsoftware eine beliebige Kombination von offenen und geschlossenen Bedienfeldern zulassen.
Birdus
119

Ziemlich einfach:

<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>
2upmedia
quelle
1
Hat super funktioniert. Ich fügte hinzu create: function(event) { $(event.target).accordion( "activate", false ); }, um zusammengebrochen zu beginnen.
Forresto
2
Genial. Ich bin froh, dass es für dich geklappt hat. :) Ich mag es, die Dinge so einfach wie möglich zu halten.
2upmedia
7
in jquery-ui 1.10, um zusammengebrochen zu starten, anstatt create: function(event) { $(event.target).accordion( "activate", false ); }Sie die Option zu setzen:{active: false}
damko
16
(Gesichtspalme) separates Akkordeon für jeden Block.
Paul Annekov
2
Hier ist die jsFiddle, mit der ich sie getestet habe. Jsfiddle.net/txo8rx3q/1 Ich habe auch CSS hinzugefügt, um zu verhindern, dass ein geöffneter Akkordeonabschnitt ausgewählt
Matthew Lock
77

Hat dies in einem ähnlichen Thread gepostet, dachte aber, dass es auch hier relevant sein könnte.

Dies wird mit einer einzigen Instanz von jQuery-UI Accordion erreicht

Wie andere angemerkt haben, verfügt das AccordionWidget nicht über eine API-Option, um dies direkt zu tun. Wenn aus irgendeinem Grunde aber Sie müssen das Widget nutzen (zB Sie ein vorhandenes System sind die Aufrechterhaltung) ist es möglich , dies zu erreichen , indem die Verwendung von beforeActivateEvent - Handler - Option zu unterminieren und das Standardverhalten des Widgets zu emulieren.

Beispielsweise:

$('#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
    }
});

Sehen Sie sich eine jsFiddle-Demo an

Boas
quelle
6
Vielen Dank! Dies ist die beste Lösung, da Sie in Ihrer gesamten vorhandenen Umgebung keine Änderungen benötigen.
Artgrohe
Es erfordert jQuery UI 1.9.0+ (Drupal 7 steckt mit 1.8.7 fest)
Capi Etheriel
1
Ich glaube, die aktive Klasse hat sich geändertui-accordion-header-active
Tim Vermaelen
hat
super
Gute Lösung, das einzige Problem ist, dass diese Lösung keine Symboloption
akzeptiert
20

Oder noch einfacher?

<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>
Roman Gudkov
quelle
Das ist schön imho. Einfache Lösung und es löste Probleme, die ich mit der Leistung großer Sätze von Akkordeonartikeln hatte. Überraschenderweise funktioniert die Initialisierung einer großen Anzahl von Akkordeons gut. Vielen Dank!
Code Novitiate
14

Ich habe ein jQuery-Plugin erstellt, das das gleiche Aussehen wie jQuery UI Accordion hat und alle Registerkarten \ Abschnitte offen halten kann

Sie finden es hier

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

funktioniert mit dem gleichen Markup

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

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

UPDATE: Das Plugin wurde aktualisiert, um die Standardoption für aktive Registerkarten zu unterstützen

UPDATE: Dieses Plugin ist jetzt veraltet.

Anas Nakawa
quelle
Tolle Lösung.
Trimantra Software Solution
6

Eigentlich suchte ich eine Weile im Internet nach einer Lösung dafür. Und die akzeptierte Antwort gibt die gute Antwort "nach dem Buch". Aber ich wollte das nicht akzeptieren, also suchte ich weiter und fand Folgendes:

http://jsbin.com/eqape/1601/edit - Live-Beispiel

In diesem Beispiel werden die richtigen Stile verwendet und gleichzeitig die angeforderte Funktionalität hinzugefügt. Der Platz zum Schreiben wird hinzugefügt. Fügen Sie bei jedem Header-Klick Ihre eigene Funktionalität hinzu. Ermöglicht auch, dass mehrere Divs zwischen den "h3" liegen.

 $("#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 Quelltext:

<!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>`
Donovan
quelle
5

Ich habe eine schwierige Lösung gefunden. Rufen wir dieselbe Funktion zweimal auf, jedoch mit unterschiedlicher ID.

JQuery-Code

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

HTML Quelltext

<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>
SpritsDracula
quelle
2
Sie sind besser dran, classwenn Sie einen einzelnen Selektor verwenden, der auf dem von anderen vorgeschlagenen basiert. Dies bedeutet dann, dass Sie sich nicht wiederholen ( DRY )
Scotty.NET
4

Erstellen Sie einfach mehrere Akkordeon-Divs, die jeweils ein Ankertag darstellen, wie:

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

Es summiert sich etwas Markup. Aber funktioniert wie ein Profi ...

Azeem
quelle
4

Einfach: Aktivieren Sie das Akkordeon für eine Klasse und erstellen Sie damit Divs, wie bei mehreren Akkordeoninstanzen.

So was:

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/

Giovan Cruz
quelle
1
Ich habe alle Antworten im Thread ausprobiert und das funktioniert am besten. Mit der neuesten jquery und jqueryUI gibt es jetzt viele Styling-Probleme mit anderen Lösungen. Hier ist das 2017 Update jsfiddle.net/rambutan2000/eqbbgb7g
Geordie
@Geordie Ich bin froh, dass das geholfen hat.
Giovan Cruz
2

Nennen Sie einfach jeden Abschnitt des Akkordeons als sein eigenes Akkordeon. aktiv: n ist 0 für das erste (so wird es angezeigt) und 1, 2, 3, 4 usw. für den Rest. Da es sich bei jedem um ein eigenes Akkordeon handelt, haben alle nur einen Abschnitt, und der Rest wird zum Starten zusammengeklappt.

$('.accordian').each(function(n, el) {
  $(el).accordion({
    heightStyle: 'content',
    collapsible: true,
    active: n
  });
});
Funkodebat
quelle
Beachten Sie, dass dies bereits in der Antwort von 2upmedia unten vorgeschlagen wurde
Boaz
2

Noch einfacher ist es, wenn es im Klassenattribut jedes Li-Tags beschriftet ist und Sie eine Abfrage haben, um jedes Li zu durchlaufen und das Akkordeon zu initialisieren.

Mikey
quelle
1

Ohne jQuery-UI-Akkordeon kann man dies einfach tun:

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

Und js

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

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

Gayan Dasanayake
quelle
0

öffne jquery-ui - *. js

finden $.widget( "ui.accordion", {

finden _eventHandler: function( event ) {drinnen

Veränderung

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

zu

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

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

hinzufügen if (typeof(active) !== 'undefined') {und schließen}

genießen

Alex
quelle
-1

Sie verwenden einfach die Funktion jquery each ().

$(function() {
    $( ".selector_class_name" ).each(function(){
        $( this ).accordion({
          collapsible: true, 
          active:false,
          heightStyle: "content"
        });
    });
});
schwarze Mamba
quelle