正如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');
// open or close as necessary
panel[isOpen? 'slideUp': 'slideDown']()
// trigger the correct custom event
.trigger(isOpen? 'hide': 'show');
// stop the link from causing a pagescroll
return false;
});
展开/折叠全部
我们使用布尔isAllOpen
标志来标记按钮何时被更改,这可以很容易地成为一个类,或者一个更大的插件框架上的状态变量。
expandLink.click(function(){
var isAllOpen = $(this).data('isAllOpen');
contentAreas[isAllOpen? 'hide': 'show']()
.trigger(isAllOpen? 'hide': 'show');
});
“全开”时交换按钮
多亏了我们自定义的“显示”和“隐藏”事件,我们可以在面板发生变化时进行监听。唯一的特殊情况是“它们都打开了吗”,如果是,按钮应该是“全部折叠”,如果不是,它应该是“全部展开”。
contentAreas.on({
// whenever we open a panel, check to see if they're all open
// if all open, swap the button to collapser
show: function(){
var isAllOpen = !contentAreas.is(':hidden');
if(isAllOpen){
expandLink.text('Collapse All')
.data('isAllOpen', true);
}
},
// whenever we close a panel, check to see if they're all open
// if not all open, swap the button to expander
hide: function(){
var isAllOpen = !contentAreas.is(':hidden');
if(!isAllOpen){
expandLink.text('Expand all')
.data('isAllOpen', false);
}
}
});
编辑评论:
除非您点击“全部展开”按钮,否则保持“仅打开 1 个面板”实际上要容易得多。例子