正如在jQuery UI论坛中所讨论的,您不应该使用手风琴来实现这个功能。
如果您想要一个看起来和行为像手风琴的东西,那是可以的。使用它们的类来设置样式,并实现您需要的任何功能。然后添加一个按钮来打开或关闭它们都是很简单的。示例
HTML
通过使用jquery-ui的类,我们可以使手风琴看起来就像“真正”的手风琴一样。
<div id="accordion" class="ui-accordion ui-widget ui-helper-reset">
<h3 class="accordion-header ui-accordion-header ui-helper-reset ui-state-default ui-accordion-icons ui-corner-all">
<span class="ui-accordion-header-icon ui-icon ui-icon-triangle-1-e"></span>
Section 1
</h3>
<div class="ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom">
Content 1
</div>
</div>
自己制作手风琴
通常我们只需要手风琴标题来切换其下一个兄弟元素的状态,即内容区域。我们还添加了两个自定义事件“show”和“hide”,稍后我们将会用到它们。
var headers = $('#accordion .accordion-header');
var contentAreas = $('#accordion .ui-accordion-content ').hide();
var expandLink = $('.accordion-expand-all');
headers.click(function() {
var panel = $(this).next();
var isOpen = panel.is(':visible');
panel[isOpen? 'slideUp': 'slideDown']()
.trigger(isOpen? 'hide': 'show');
return false;
});
展开/折叠全部
我们使用布尔标志isAllOpen
来标记按钮何时被更改,这也可以很容易地成为一个类或者是大型插件框架中的状态变量。
expandLink.click(function(){
var isAllOpen = $(this).data('isAllOpen');
contentAreas[isAllOpen? 'hide': 'show']()
.trigger(isAllOpen? 'hide': 'show');
});
当面板全部展开时交换按钮
由于我们使用了自定义的“show”和“hide”事件,因此我们可以监听面板变化时所需的内容。唯一的特殊情况是“它们是否全部打开”,如果是,则按钮应为“折叠全部”,否则应为“展开全部”。
contentAreas.on({
show: function(){
var isAllOpen = !contentAreas.is(':hidden');
if(isAllOpen){
expandLink.text('Collapse All')
.data('isAllOpen', true);
}
},
hide: function(){
var isAllOpen = !contentAreas.is(':hidden');
if(!isAllOpen){
expandLink.text('Expand all')
.data('isAllOpen', false);
}
}
});
编辑评论:
保持“仅打开1个面板”,除非您点击“展开全部”按钮,这实际上要简单得多。示例
.first().show()
,我更新了最终示例。 - Sinetheta