Аккордеон jQuery UI, который сохраняет открытыми несколько разделов?

93

Я могу быть идиотом, но как сохранить открытыми несколько разделов в аккордеоне jQuery UI? Все демонстрации имеют только одну открытую за раз ... Я ищу свертываемую систему типов меню.

Уокер
источник
18
Посмотрите на jsfiddle.net/DkHyd
supersuphot
Что ж, ваш плагин просто идеален! Большое спасибо, чувак!
SexyBeast 06

Ответы:

94

Это был первоначально обсуждался в документации JQuery UI для аккордеона :

ПРИМЕЧАНИЕ. Если вы хотите, чтобы одновременно открывались несколько разделов, не используйте аккордеон.

Аккордеон не позволяет одновременно открывать более одной панели содержимого, и для этого требуется много усилий. Если вы ищете виджет, который позволяет открывать более одной панели содержимого, не используйте его. Обычно вместо этого можно написать несколько строк 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();
});

«Я могу быть идиотом» - вы не идиот, если не читаете документацию, но если у вас возникают проблемы, это обычно ускоряет поиск решения.

MvanGeest
источник
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>
2upmedia
источник
1
Сработало отлично. Я добавил create: function(event) { $(event.target).accordion( "activate", false ); }для начала развалился.
forresto
2
Потрясающие. Рад, что у тебя получилось. :) Мне нравится, чтобы все было как можно проще.
2upmedia 07
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, чтобы открытая секция аккордеона не выглядела выбранной, когда она развернута
Мэтью Лок
78

Разместил это в аналогичной ветке, но подумал, что это может быть актуально и здесь.

Достижение этого с помощью одного экземпляра 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
    }
});

См. Демонстрацию jsFiddle

Вооз
источник
6
Благодарность! Это лучшее решение, поскольку вам не нужно менять всю существующую среду.
artgrohe
Требуется jQuery UI 1.9.0+ (Drupal 7 застрял с 1.8.7)
Capi Etheriel
1
Я считаю, что активный класс изменилсяui-accordion-header-active
Тим Вермален
отлично поработал у меня, минимальный рефакторинг :-)
Darkloki
хорошее решение, единственная проблема в том, что в этом решении не будет значков :-)
Тахионы
21

Или еще проще?

<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>
Роман Гудков
источник
Это мило, имхо. Простое решение, и оно решило проблемы, которые у меня возникали при работе с большими наборами элементов аккордеона. Удивительно, но инициализация большого набора аккордеонов работает хорошо. Благодарность!
Code 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 Software Solution
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

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

Код 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
выбрать
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
Джорди
@ Джорджи Я рад, что это помогло.
Джован Крус
2

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

$('.accordian').each(function(n, el) {
  $(el).accordion({
    heightStyle: 'content',
    collapsible: true,
    active: n
  });
});
Funkodebat
источник
Обратите внимание, что это уже было предложено в ответе 2upmedia ниже
Боаз
2

Еще проще: пометить его в атрибуте class каждого тега 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"
        });
    });
});
Черная мамба
источник