jQuery UI 手风琴可以保持多个部分打开?

问题描述 投票:0回答:15

我可能是个白痴,但是如何保持 jQuery UI 手风琴中的多个部分打开? 这些演示一次只能打开一个...我正在寻找一种可折叠的菜单类型系统。

javascript jquery html jquery-ui
15个回答
126
投票

非常简单:

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

97
投票

最初在 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(); });


“我可能是个白痴” - 如果你不阅读文档,你就不是白痴,但如果你遇到问题,它通常会加快找到解决方案的速度。


85
投票
在类似的帖子中发布了此内容,但认为它也可能与此处相关。

使用 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 演示


22
投票
或者更简单?

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

更新: 该插件已更新以支持默认的活动选项卡选项

更新: 该插件现已弃用。


7
投票
简单:将手风琴激活到一个类,然后用它创建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/


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
投票
我找到了一个棘手的解决方案。让我们用不同的 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>
    

4
投票
简单,创建多个手风琴 div,每个代表一个锚标记,例如:

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

它增加了一些标记。但工作起来就像专业人士一样...


2
投票
只需将手风琴的每个部分称为自己的手风琴即可。 活动:第一个 n 将为 0(因此它将显示),其余为 1、2、3、4 等。 由于每个都是自己的手风琴,因此它们都只有 1 部分,其余部分将折叠起来开始。

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

2
投票
更简单,将其标记在每个 li 标签的 class 属性中,并让 jquery 循环遍历每个 li 来初始化手风琴。


2
投票
如果没有 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') {

 并关闭 
}


享受


0
投票
我知道这个问题特别要求 jQuery UI。

我总是发现自己在探索 jQuery UI Accordion,然后记住我可以使用本机详细信息和摘要元素(IE11 除外)来实现本质上相同类型的功能:

https://developer.mozilla.org/en- US/docs/Web/HTML/Element/details

只是提醒一下,以防你像我一样经常忘记。


0
投票
Github 上有一个插件。

https://github.com/asleepwalker/jquery-ui.accordion.multiple

© www.soinside.com 2019 - 2024. All rights reserved.