Twitter bootstrapアコーディオンと折りたたみプラグインを使用してOutlookバーを模倣しようとしています。これまでのところ、折りたたみとアコーディオンは機能しましたが、現在はすべてのセクションを折りたたみ可能です。
常に1つだけが表示されるように制限したいと思います。
私が取り組んでいるものは次のとおりです。 http://jsfiddle.net/trajano/SMT9D/ そして、私はそれが
$('#accordions').on('hide', function (event) {
console.warn("HIDE TRIGGERED, check if trying to hide the active one if so stop");
})
簡単な方法は次のとおりです。
JsFiddle for Bootstrap 3。
Bootstrap= 3:のコード
_$('.panel-heading a').on('click',function(e){
if($(this).parents('.panel').children('.panel-collapse').hasClass('in')){
e.stopPropagation();
}
// You can also add preventDefault to remove the anchor behavior that makes
// the page jump
// e.preventDefault();
});
_
コードは、クリックされた要素が現在表示されている要素かどうかをチェックします(by the class "in")そして、 "in"クラスがある場合、非表示プロセスを停止します。
JsFiddle for Bootstrap 2。
Bootstrap 2:2:のコード
_$('.accordion-toggle').on('click',function(e){
if($(this).parents('.accordion-group').children('.accordion-body').hasClass('in')){
e.stopPropagation();
}
// You can also add preventDefault to remove the anchor behavior that makes
// the page jump
// e.preventDefault();
});
_
注:e.stopPropagation()
はイベントをブロックするため、アコーディオンにさらにクリックイベントを添付する場合は注意してくださいこれはチェック後に発生します。
@Hugo Dozoisの答えを正確にしたい
ページにスクロールがある場合に_#
_ HTMLアンカーのデフォルトの動作を防ぐには、e.preventDefault();
を追加する必要があります
_$('.panel-heading a').on('click',function(e){
if($(this).parents('.panel').children('.panel-collapse').hasClass('in')){
e.preventDefault();
e.stopPropagation();
}
});
_
または、次のように簡単なCSSトリックを使用できます。
/*
prevent the active panel from collapsing
*/
.panel-group [aria-expanded=true]{
/*
http://caniuse.com/#feat=pointer-events
Works for MOST modern browsers. (- Opera Mobile)
*/
pointer-events: none;
}
非アクティブなパネルリンクに適切なタグが必要です
aria-expanded="false"
2018年に更新
Bootstrap v3またはv4の両方で少なくとも開いたままにする方法は次のとおりです。つまり、オープンアコーディオンはonlyopenをもう1つ切り替えて閉じます。
ブートストラップ4
https://www.codeply.com/go/bbCcnl0jBB
// the current open accordion will not be able to close itself
$('[data-toggle="collapse"]').on('click',function(e){
if ( $(this).parents('.accordion').find('.collapse.show') ){
var idx = $(this).index('[data-toggle="collapse"]');
if (idx == $('.collapse.show').index('.collapse')) {
e.stopPropagation();
}
}
});
また、 この回答を参照 は、他のすべてが閉じられたときに開く「デフォルト」のアコーディオンを指定する方法を示しています。
ブートストラップ3
$('[data-toggle="collapse"]').on('click',function(e){
if($(this).parents('.panel').find('.collapse').hasClass('in')){
var idx = $(this).index('[data-toggle="collapse"]');
var idxShown = $('.collapse.in').index('.accordion-body');
if (idx==idxShown) {
e.stopPropagation();
}
}
});
https://www.codeply.com/go/yLw944BrgA
<div class="accordion" id="myAccordion">
<div class="panel">
<button type="button" class="btn btn-danger" data-toggle="collapse" data-target="#collapsible-1" data-parent="#myAccordion">Question 1?</button>
<div id="collapsible-1" class="collapse">
..
</div>
</div>
<div class="panel">
<button type="button" class="btn btn-danger" data-toggle="collapse" data-target="#collapsible-2" data-parent="#myAccordion">Question 2?</button>
<div id="collapsible-2" class="collapse">
..
</div>
</div>
<div class="panel">
<button type="button" class="btn btn-danger" data-toggle="collapse" data-target="#collapsible-3" data-parent="#myAccordion">Question 3?</button>
<div id="collapsible-3" class="collapse">
...
</div>
</div>
</div>
(注:panel
クラスはBootstrap 3 to アコーディオン動作を機能させる )
他のすべてのJS回答では inadvisablestopPropagation()
を使用しているため、ネイティブBootstrapイベント(Bootstrap 4)。
$('#accordionExample').on('show.bs.collapse', function () {
$(this).data('isShowing', true);
});
$('#accordionExample').on('hide.bs.collapse', function (event) {
if (!$(this).data('isShowing')) {
event.preventDefault();
}
$(this).data('isShowing', false);
});
折りたたまれた要素をクリックすると、show.bs.collapse
の後にhide.bs.collapse
が続くという事実を利用します。一方、開いている要素をクリックすると、hide.bs.collapse
になります。
私は投稿された答えに合わないシナリオを持っています:同じページ上の複数のアコーディオンとアコーディオンではない他の折りたたみ可能なコンポーネント(data-parent
属性なし)。
$("[data-toggle=collapse][data-parent]").click(function (e) {
var button = $(this);
var parent = $(button.attr("data-parent"));
var panel = parent.find(button.attr("href") || button.attr("data-target"));
if (panel.hasClass("in")) {
e.preventDefault();
e.stopPropagation()
}
});
data-parent
属性をチェックするため、このコードはアコーディオンでのみトリガーされます。また、card
(またはbootstrap 3の場合はpanel
)構造も想定していません。bootstrap apiと同じ属性を使用します。
役に立てば幸いです。
$('.card').click(function(e) {
if (
$(this)
.find('.collapse')
.hasClass('show')
) {
e.stopPropagation();
}
});
このコードブロックは、クリックされたカードが折りたたまれているかどうかを確認します(クラスcollapse
でdivを調べます)。カードが現在show
nの場合、停止します イベントの伝播 。