jQuery UI accordéon qui maintient plusieurs sections ouvertes?

Je suis peut-être un idiot, mais comment gardez-vous plusieurs sections dans l'accordéon de jQuery UI ouvert? Les démos ont tous un seul ouvert à la fois... Je suis à la recherche d'un système de type de menu collapsable.

86
demandé sur forresto 2010-08-13 21:52:12

14 réponses

CE a été discuté à l'origine dans la documentation de l'interface utilisateur jQuery pour accordéon :

Remarque: Si vous voulez plusieurs sections ouvrez immédiatement, n'utilisez pas d'accordéon

Un accordéon ne permet pas plus de un panneau de contenu à ouvrir au en même temps, et il faut beaucoup de l'effort de le faire. Si vous êtes à la recherche pour un widget qui permet plus d'un panneau de contenu pour être ouvert, ne pas utiliser ce. Habituellement, il peut être écrit avec un quelques lignes de jQuery à la place, quelque chose comme ceci:

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

Ou animé:

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

"je peux être un idiot" - vous n'êtes pas un idiot si vous ne lisez pas la documentation, mais si vous avez des problèmes, cela accélère généralement la recherche d'une solution.

91
répondu MvanGeest 2014-10-17 19:16:47

Assez simple:

<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>
111
répondu 2upmedia 2012-04-19 22:45:05

Posté dans un fil similaire, mais pensé qu'il pourrait être pertinent ici.

Atteindre cet objectif avec une seule instance de jQuery-UI Accordéon

Comme d'autres l'ont noté, le widget Accordion n'a pas D'option API pour le faire directement. Cependant, si pour une raison quelconque vous devez utiliser le widget (par exemple, vous maintenez un système existant), il est possible d'y parvenir en utilisant le beforeActivate option Gestionnaire d'événements pour subvertir et émuler la valeur par défaut comportement du widget.

Par exemple:

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

Voir a Je ne sais pas.]}

68
répondu Boaz 2015-03-09 23:20:01

Ou encore plus simple?

<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>
19
répondu Roman Gudkov 2012-11-09 20:42:08

J'ai fait un plugin jQuery qui a le même look de jQuery UI accordéon et peut garder tous les onglets\sections ouvertes

Vous pouvez le trouver ici

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

Fonctionne avec le même balisage

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

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

Mise à jour: le plugin a été mis à jour pour prendre en charge l'option onglets actifs par défaut

Mise à jour: Ce plugin est maintenant obsolète.

14
répondu Anas Nakawa 2018-06-19 13:11:49

En fait était à la recherche d'une solution sur internet pour cela pendant un certain temps. Et la réponse acceptée donne la bonne réponse "par le livre". Mais je ne voulais pas accepter cela, alors j'ai continué à chercher et trouvé ceci:

Http://jsbin.com/eqape/1601/edit - Exemple En Direct

Cet exemple extrait les styles appropriés et ajoute les fonctionnalités demandées en même temps, avec un espace pour écrire ajoutez vos propres fonctionnalités à chaque clic d'en-tête. Permet également à plusieurs divs d'être dans entre les"h3" S.

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

Code 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>`
6
répondu Donovan 2013-09-06 18:25:44

J'ai trouvé une solution délicate. Appelons la même fonction deux fois mais avec un id différent.

Code JQuery

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

code 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>
5
répondu SpritsDracula 2012-11-19 12:46:31

Simple, Créez plusieurs div accordéons représentant chacun une balise d'ancrage comme:

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

Il ajoute du balisage. Mais fonctionne comme un pro...

4
répondu Azeem 2014-08-30 11:35:15

Simple: active l'accordéon dans une classe, puis crée des divs avec ceci, comme des multiples instances d'accordéon.

Comme ceci:

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/

3
répondu Giovan Cruz 2015-06-19 13:27:37

Suffit d'appeler chaque section de l'accordéon comme son propre accordéon. actif: n sera 0 pour le premier( donc il affichera) et 1, 2, 3, 4, etc. pour le reste. Puisque chacun est son propre accordéon, ils auront tous seulement 1 section, et le reste sera réduit pour commencer.

$('.accordian').each(function(n, el) {
  $(el).accordion({
    heightStyle: 'content',
    collapsible: true,
    active: n
  });
});
2
répondu Funkodebat 2013-04-01 15:36:33

Encore plus simple, faites-le étiqueter dans l'attribut de classe de chaque balise li et demandez à jquery de parcourir chaque li pour initialiser l'accordéon.

2
répondu Mikey 2015-07-07 05:18:32

Ouvrez jquery-ui -*.js

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

Trouver _eventHandler: function( event ) { à l'intérieur

Modifier

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

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

Ajouter if (typeof(active) !== 'undefined') { et la fermeture }

Profitez

0
répondu alex 2014-12-02 09:40:07

Vous utilisez simplement la fonction jQuery each ();

$(function() {
    $( ".selector_class_name" ).each(function(){
        $( this ).accordion({
          collapsible: true, 
          active:false,
          heightStyle: "content"
        });
    });
});
0
répondu şevket Karayılan 2016-06-02 17:18:32

Sans accordéon jQuery-UI, on peut simplement faire ceci:

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

Et js

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

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

0
répondu Gayan Dasanayake 2017-05-12 03:20:40