[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での実装例。

このページをシェアする

Related Articles

近年のWeb開発においてjQueryの利用をやめるべき理由

jQuery の功績と功罪 / 現代の Web 開発と jQuery / jQuery をやめるメリット / jQuery の代替手段 / おわり / Footnotes

[ESLint] 特定のimportにおいてパスの末尾スラッシュを禁止する方法

背景 / やりたいこと / @typescript-eslint/no-restricted-imports を利用した / 余談(末尾のスラッシュ自体を禁止にする)

`<input type="range">`のstepを可変にする方法

仕様 / 完成デモ / 実装 / 参考

[Vite] CSSだけをビルドする方法

背景 / Vite をインストール / 仕様

CSS in JSとは何か

想定読者 / そもそも JS フレームワーク(React、Vue.js)を採用する理由とは何か / 「命令的 UI」 と 「宣言的 UI」 / 「命令的 UI」 VS 「宣言的 UI」 / CSS in JS とは / CSS in JS ライブラリ / Emotion の使い方 / 利用するメリット / 利用するデメリット / 関連 / Footnotes