複数のセクションを開いたままにするjQuery UIアコーディオン?


93

私はばかかもしれませんが、jQuery UIのアコーディオンの複数のセクションを開いたままにするにはどうすればよいですか?デモはすべて一度に1つしか開いていません...折りたたみ可能なメニュータイプシステムを探しています。



さて、あなたのプラグインは完璧です!本当にありがとう、おい!
SexyBeast

回答:


94

これは当初、Accordionの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();
});

「私は馬鹿かもしれません」-ドキュメントを読まなければ馬鹿ではありませんが、問題がある場合は通常、解決策を見つけるまでの時間が短縮されます。


9
このソリューションは、アコーディオンスタイルの設定を行いません。
forresto 2012年

12
さらに、これは問題の解決策にはなりません。アコーディオンのドキュメントとオプション、イベントなどのリストは不十分です。そして、ユーザーに「オプションがない場合は使用しないでください-使用しないでください!」彼らは、「そのためのオプションはまだありませんが、素晴らしいプラグインに機能を追加する貢献者を歓迎します」と言ってください
artgrohe

私が引用したテキストはドキュメントから削除されました。アーカイブ版へのリンクを追加しました。
MvanGeest 2014年

1
jQuery UI Accordionは実際のアコーディオン効果を作成する以上のことを覚えておいてください。また、スクリーンリーダーのアクセシビリティマークアップも多数追加されています。
ブライアン

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

2
驚くばかり。よかったです。:)私は物事をできるだけ単純にしたいです。
2upmedia '07 / 07/12

7
jquery-ui 1.10ではcreate: function(event) { $(event.target).accordion( "activate", false ); }、オプションを設定する代わりに、折りたたみを開始し ます:{active: false}
damko

16
(facepalm)ブロックごとに別々のアコーディオン。
Paul Annekov 2013年

2
これは私がjsfiddle.net/txo8rx3q/1をテストするために使用したjsFiddleです。また、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

1
アクティブクラスが変更されたと思いますui-accordion-header-active
Tim Vermaelen

リファクタリングの最小量:-)
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>

これはいいね。簡単な解決策で、アコーディオンアイテムの大きなセットのパフォーマンスで抱えていた問題を解決しました。驚くべきことに、多数のアコーディオンの初期化はうまく機能します。ありがとう!
Code Novitiate 2013

14

私はjQuery UIアコーディオンの外観と同じで、すべてのタブ\セクションを開いたままにできるjQueryプラグインを作成しました

あなたはここでそれを見つけることができます

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 2016

6

実際、しばらくの間、この問題の解決策をインターネットで探していました。そして、受け入れられた答えは、「本ごと」の良い答えを与えます。しかし、私はそれを受け入れたくなかったので、検索を続け、これを見つけました。

http://jsbin.com/eqape/1601/edit-実例

この例では、適切なスタイルを取得し、同時に要求された機能を追加します。各ヘッダークリックで独自の機能を追加するためのスペースが追加されています。また、「h3」の間に複数のdivを置くことができます。

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

私はトリッキーな解決策を見つけました。同じ関数を2回呼び出しますが、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

4

シンプルで、それぞれが次のような1つのアンカータグを表す複数のaccordian 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

アコーディオンの各セクションを独自のアコーディオンと呼ぶだけです。アクティブ:nは、最初のものは0(表示されるため)、残りは1、2、3、4などになります。それぞれが独自のアコーディオンなので、すべてのセクションが1つだけになり、残りは折りたたんで開始されます。

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


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"
        });
    });
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.