HOME > JavaScript > JavaScriptで動くアコーディオンの作り方【コピペで1分】

JavaScriptで動くアコーディオンの作り方【コピペで1分】

JavaScriptで動くアコーディオンのDEMO
DEMOページ

JavaScriptで動くアコーディオンの作り方解説

JavaScriptを使用してアコーディオンの見出しとコンテンツが連動して動くように実装。

  • 1.扱いやすくするためにHTMLは親要素と見出し、子要素のリスト(dl・dt・dd)要素で構成する
  • 2.コンテンツ要素にdisplay:none;をかけて非表示にしておく
  • 3.cssの擬似要素で開閉の「+」「-」を設定。cursor:pointerを見出しに設定してクリックが分かるように指定
  • 4.JavaScriptを使用して見出しをクリックされたら、紐づいたコンテンツがdiplay:blockになるように設定
  • 5.正しく動作していれば完成です。
HTML記述

HTMLをbody内の表示位置に記載します。

<dl class="accordion">
    <dt class="accordion-title">Q1.見出し1</dt>
    <dd class="accordion-content">A.コンテンツ1</dd>
    <dt class="accordion-title">Q2.見出し2</dt>
    <dd class="accordion-content">A.コンテンツ2</dd>
    <!-- dt/ddをコピーしたらアコーディオンを追加できます -->
</dl>
css記述

cssを<style>~</style>または自作cssの中に記述します。

<style>
/* リストのスタイルをリセット */
dl,dt,dd{
    margin: 0;
    list-style: none;
}

/* アコーディオン共通指定 */
.accordion-title,
.accordion-content{
    padding: 18px 20px 18px 20px;
    border-bottom: 1px solid #fff;
}

/* アコーディオン見出し */
.accordion-title{
    color: #fff;
    background-color: rgb(80,113,191);
    cursor: pointer;
    position: relative;
}
.accordion-title::before {
    content: '+ ';
    position: absolute;
    top: 50%;
    right: 5%;
    transform: translateY(-50%);
}
.accordion-title.open::before {
    content: '- ';
}
/* アコーディオンコンテンツ */
.accordion-content{
    display: none;
    background-color: rgb(218,226,240);   
}
</style>
Javascript記述

javascriptを<script>~</script>または自作jsの中に記述します。

<script>
// ドキュメントの読み込みが完了した時に実行する関数
document.addEventListener("DOMContentLoaded", () => {
  // アコーディオンタイトルをクリックした際の動作
  const titles = document.querySelectorAll('.accordion-title');
  titles.forEach((title) => {
    title.addEventListener("click", () => {
      // クリックされたアコーディオンタイトルのコンテンツを取得
      const content = title.nextElementSibling;

      // アコーディオンの開閉を切り替える
      const isHidden = window.getComputedStyle(content).display === "none";
      if (isHidden) {
        content.style.display = "block";
        title.classList.add("open"); // openを追加
      } else {
        content.style.display = "none";
        title.classList.remove("open"); // openを削除
      }
    });
  });
});
</script> 
関連アニメーション

その他javascriptアニメーション