自分のウェブサイトテンプレートのドキュメントを作成しましたが、ドロップダウンメニューを作成しようとしています。アイデアは簡単です:リンクの名前の横にあるキャレットをクリックすると、もう一度クリックするとそのサブメニューが開き、閉じなければなりません。さらに、他のサブメニューが開いている場合は、それらを閉じて、一度に1つのサブメニューしか開くことはできません。なぜforループがjQueryのtoggleClassの動作を変更しているのですか
私の解決策:私はtoggleClassとforループを使用しました。
私の問題は次のとおりです。一度に1つのサブメニューのみを開くように2つのforループを追加した後、私のtoggleClassは機能しなくなりました。つまり、キャレットをクリックすると、サブメニューが開きますが、キャレットを再びクリックすると、サブメニューが閉じず、開いたままになります。
jQuery(document).ready(function(){
$(".indicator").on("click", showLinks);
function showLinks(){
var allMenus = $("#ab-menu, #str-menu, #ht-menu");
var allCarets = $("#ab-caret, #str-caret, #ht-caret");
for(i = 0; i < allMenus.length; i++){
$(allMenus).eq(i).removeClass("show");
}
for(i = 0; i < allCarets.length; i++){
$(allCarets).eq(i).removeClass("caret-rotate");
}
var linkId = $(this).attr("data-menu");
var caretId = $(this).attr("data-caret");
$(linkId).toggleClass("show");
$(caretId).toggleClass("caret-rotate");
};
});
#ab-menu,
#str-menu,
#ht-menu {
background-color: #1d3557;
max-height: 0;
margin: 0.2em 0;
opacity: 0.5;
overflow: hidden;
transition: 0.4s ease-in-out;
}
#ab-menu.show,
#str-menu.show,
#ht-menu.show {
max-height: 500px;
opacity: 1;
}
.fa .fa-caret-down {
display: block;
color: #fff;
}
.caret-rotate {
transition: 0.4s ease-in-out;
}
.fa-caret-down.caret-rotate {
color: #a8dadc;
transform: rotate(-90deg);
}
<nav>
<ul class="nav-links">
<li class="about-panel">About <span class="fa fa-caret-down indicator" id="ab-caret" data-menu="#ab-menu" data-caret="#ab-caret"></span>
<ul class="sub-menu about-sub-menu" id="ab-menu">
<li class="about-links"><a href="#about">Main Features</a></li>
<li class="about-links"><a href="#getting-started">Getting Started</a></li>
</ul>
</li>
</ul>
<ul class="nav-links">
<li class="structure-panel">Structure <span class="fa fa-caret-down indicator" id="str-caret" data-menu="#str-menu" data-caret="#str-caret"></span>
<ul class="sub-menu structure-sub-menu" id="str-menu">
<li class="structure-links"><a href="#sections">Sections</a></li>
<li class="structure-links"><a href="#grid">Bootstrap-grid</a></li>
<li class="structure-links"><a href="#carousel">Bootstrap Carousel</a></li>
</ul>
</li>
</ul>
<ul class="nav-links">
<li class="how-to-panel">How-to <span class="fa fa-caret-down indicator" id="ht-caret" data-menu="#ht-menu" data-caret="#ht-caret"></span>
<ul class="sub-menu how-sub-menu" id="ht-menu">
<li class="how-to-links"><a href="#nav">Navigation</a></li>
<li class="how-to-links"><a href="#images">Images</a></li>
<li class="how-to-links"><a href="#headers">Headers</a></li>
<li class="how-to-links"><a href="#icons">Icons</a></li>
<li class="how-to-links"><a href="#colors">Colors</a></li>
<li class="how-to-links"><a href="#fonts">Fonts</a></li>
<li class="how-to-links"><a href="#buttons">Buttons</a></li>
<li class="how-to-links"><a href="#portfolio">Portfolio</a></li>
<li class="how-to-links"><a href="#map">Map</a></li>
</ul>
</li>
</ul>
<ul class="nav-links">
<li class="credits"><a href="#credits">Credits</a></li>
</ul>
</nav>
あなたの助けをありがとう、あなたは正しいです、forループなしで動作しますが、キャレットをクリックしたときに開いたサブメニューを閉じることができないという問題は解決しません。 – TheMalni
あなたはほとんどそれを正しく行いました。私はちょうど.not($(linkId))から変更しました。removeClass( "caret-rotate"); .not($(caretId))。removeClass( "キャレット回転");それは私がそれをしたいのと同じように動作します:)ありがとう! – TheMalni
あなたは正しいです - 私はテストで表示されているキャレットを持っていなかったので、そのバグに気付かなかった、申し訳ありません。あなたはそれを働いてうれしい! :-) –