[JavaScript/jQuery] アコーディオンメニューを実装する方法
2 min read
久々にアコーディオンメニューを実装する機会があったのでメモ。
実装
HTML
<div class="accordion-container">
<dt class="title">タイトル1</dt>
<dd class="contents">コンテンツ1</dd>
<dt class="title">タイトル2</dt>
<dd class="contents">コンテンツ2</dd>
<dt class="title">タイトル3</dt>
<dd class="contents">コンテンツ3</dd>
<dt class="title">タイトル4</dt>
<dd class="contents">コンテンツ4</dd>
</div>
定義リスト(<dl>
,<dt>
,<dd>
)で実装を行う。
CSS
.accordion-container .contents {
display: none;
}
- 初期状態では
display:none
で非表示にしておく.slideToggle()
でdisplay:block
で表示状態になる
jQuery
$(".accordion-container")
.find("dt")
.on("click", function () {
var $self = $(this);
$self.toggleClass("active");
$self.next("dd").stop(true, false).slideToggle();
});
togleClass('active')
で.active
クラスを追加し、"開いている状態"を表す
開いている場合に矢印の状態を変える… などのスタイル定義があれば使うnext('dd')
は「次の要素である- 」に対して
.slideToggle()
する- 」に対して
stop(true, false)
で連続クリックされても、開き閉じをクリック回数分させないようにする連動してクリックした以外を連動して閉じる場合は、
siblings('dd').slideDown()
を使う
JavaScript
const accordionContainers = document.querySelectorAll(".accordion-container");
accordionContainers.forEach((container) => {
const dts = container.querySelectorAll("dt");
dts.forEach((dt) => {
dt.addEventListener("click", () => {
dt.classList.toggle("active");
const dd = dt.nextElementSibling;
dd.style.display =
window.getComputedStyle(dd).display === "none" ? "block" : "none";
});
});
});
デモ
JavaScriptでの実装例。