акордеон jQuery UI, який тримає кілька розділів відкритими?


93

Я можу бути ідіотом, але як ви тримаєте кілька розділів у акордеоні інтерфейсу jQuery UI відкритими? У демонстраційних версіях за один раз відкрито лише одне ... Я шукаю розбірну систему типу меню.


18
Подивіться на це jsfiddle.net/DkHyd
supersuphot

Ну, ваш плагін просто ідеальний! Велике спасибі, чувак!
SexyBeast

Відповіді:


94

Це спочатку обговорювалося в документації інтерфейсу jQuery для Accordion :

ПРИМІТКА. Якщо ви хочете, щоб одразу було відкрито кілька розділів, не використовуйте гармошку

Акордеон не дозволяє одночасно відкривати більше однієї панелі вмісту, і для цього потрібно докласти багато зусиль. Якщо ви шукаєте віджет, який дозволяє відкривати більше однієї панелі вмісту, не використовуйте це. Зазвичай замість цього його можна записати кількома рядками 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

12
Крім того, це взагалі не вирішення питання. Документи на акордеони та перелік варіантів, подій тощо просто поганий. І замість того, щоб говорити користувачеві "якщо у нас немає варіантів для вас - не використовуйте його!" вони повинні сказати "вибачте, що поки що немає можливості для цього, але ми вітаємо всіх учасників, які додають функціональність нашого чудового плагіна"
artgrohe

Текст, який я цитував, вилучено з документації. Я додав посилання на заархівовану версію.
MvanGeest

1
Майте на увазі, що jQuery UI Accordion робить більше, ніж створює власне ефект гармошки. Це також додає велику розмітку доступності для зчитувачів з екрану.
Брайан

2
Це не має жодного сенсу. На акордеоні можуть бути відкриті всі складки, якщо руки музиканта розташовані далеко один від одного, всі складки закриті, якщо половинки інструменту з’єднані або щось середнє. Якщо слова щось значать, тоді інтерфейс програмного забезпечення для акордеонів повинен дозволяти будь-яку комбінацію відкритих та закритих панелей.
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

2
Приголомшливо Радий, що у вас це вийшло. :) Я люблю робити речі максимально простими.
2upmedia

7
в jquery-ui 1.10, щоб почати згортати, замість create: function(event) { $(event.target).accordion( "activate", false ); }вас встановіть опцію:{active: false}
damko

16
(facepalm) окремий акордеон для кожного блоку.
Пол Аннеков,

2
Ось jsFiddle я використовував , щоб перевірити це jsfiddle.net/txo8rx3q/1 я також додав трохи CSS , щоб зупинити відкриту секцію акордеона шукає обраний , коли він розширений
Метью Замок

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

Для цього потрібен jQuery UI 1.9.0+ (Drupal 7 застряг у
версії

1
Я вважаю, що активний клас змінивсяui-accordion-header-active
Тім Вермален

у мене спрацювало чудово, мінімальна кількість рефакторингу :-)
Darkloki

хороше рішення, проблема лише в тому, що це рішення не буде використовувати іконку :-)
Тахіони

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>

Це приємно імхо. Просте рішення і вирішення проблем, які виникали у мене з виконанням великих наборів предметів для акордеону. Дивно, інтуалізуючи великий набір акордеонів, виступає добре. Дякую!
Новіціація кодексу

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

6

Насправді якийсь час шукав рішення в Інтернеті. І прийнята відповідь дає добру відповідь "по книзі". Але я не хотів прийняти це, тому продовжував шукати і виявив таке:

http://jsbin.com/eqape/1601/edit - прямий приклад

Цей приклад включає відповідні стилі та одночасно додає запитувану функціональність, а також простір для написання, додає власну функціональність при кожному клацанні заголовка. Також дозволяє декілька div, щоб бути між "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();

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

Я знайшов хитре рішення. Давайте викличемо одну і ту ж функцію двічі, але з різним ідентифікатором.

Код 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запропонованих іншими, це означає, що ви не повторюєтеся ( СУХИЙ )
Scotty.NET

4

Просто, створіть декілька відповідних 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 Я рада, що це допомогло.
Джован Круз,

2

Просто назвіть кожен розділ баяна як свій акордеон. активний: n буде першим 0 (таким чином він відображатиметься), а решта 1, 2, 3, 4 тощо. Оскільки кожен з них - це свій акордеон, у них буде лише 1 секція, а решта для початку буде згорнута.

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

Зауважте, це вже було запропоновано у відповіді 2upmedia нижче
Боаз,

2

Ще простіше, якщо він позначений в атрибуті класу кожного тегу li і має 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"
        });
    });
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.