アコーディオン

アコーディオンは、クリックで内容を表示・非表示にするインタラクティブなUI要素です。

アコーディオン
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>JavaScriptアコーディオンについて</title>
    <link rel="stylesheet" href="./main.css" />
  </head>
  <body>
    <div id="accordion">
      <div class="accordion-item">
        <div class="accordion-header">セクション1</div>
        <div class="accordion-content">
          <p>ここにセクション1の内容が入ります。</p>
          <p>追加のコンテンツ1-1。</p>
          <p>追加のコンテンツ1-2。</p>
        </div>
      </div>
      <div class="accordion-item">
        <div class="accordion-header">セクション2</div>
        <div class="accordion-content">
          <p>ここにセクション2の内容が入ります。</p>
          <p>追加のコンテンツ2-1。</p>
          <p>追加のコンテンツ2-2。</p>
        </div>
      </div>
      <div class="accordion-item">
        <div class="accordion-header">セクション3</div>
        <div class="accordion-content">
          <p>ここにセクション3の内容が入ります。</p>
          <p>追加のコンテンツ3-1。</p>
          <p>追加のコンテンツ3-2。</p>
        </div>
      </div>
    </div>
    <script src="./main.js"></script>
  </body>
</html>
// ページの読み込みが完了
document.addEventListener("DOMContentLoaded", function () {
  const accordionHeaders = document.querySelectorAll(".accordion-header");

  accordionHeaders.forEach((header) => {
    header.addEventListener("click", function () {
      const content = this.nextElementSibling;

      // 現在の高さを取得
      const currentHeight = content.style.maxHeight;

      // すべてのアコーディオンを閉じる
      document.querySelectorAll(".accordion-content").forEach((item) => {
        item.style.maxHeight = null;
        item.previousElementSibling.classList.remove("active");
      });

      // クリックしたアコーディオンを開閉
      if (currentHeight) {
        content.style.maxHeight = null;
        this.classList.remove("active");
      } else {
        content.style.maxHeight = content.scrollHeight + "px";
        this.classList.add("active");
      }
    });
  });
});
#accordion {
  width: 80%;
  margin: auto;
  font-family: "Arial", sans-serif;
}

.accordion-item {
  border: 1px solid #ddd;
  margin-bottom: 10px;
  border-radius: 5px;
  overflow: hidden;
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
}

.accordion-header {
  background-color: #f7f7f7;
  padding: 15px;
  cursor: pointer;
  position: relative;
  font-weight: bold;
  transition: background-color 0.3s ease;
}

.accordion-header:hover {
  background-color: #e2e2e2;
}

.accordion-header::after {
  content: "\25bc"; /* 下向きの矢印 */
  position: absolute;
  right: 15px;
  transition: transform 0.5s ease;
}

.accordion-header.active::after {
  transform: rotate(180deg); /* 矢印を回転させる */
}

.accordion-content {
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.5s ease-out, padding 0.5s ease-out;
  padding: 0 15px;
  border-top: 1px solid #ddd;
  background-color: #fafafa;
}

.accordion-content p {
  margin: 15px 0;
}
出力結果
セクション1

ここにセクション1の内容が入ります。

追加のコンテンツ1-1。

追加のコンテンツ1-2。

セクション2

ここにセクション2の内容が入ります。

追加のコンテンツ2-1。

追加のコンテンツ2-2。

セクション3

ここにセクション3の内容が入ります。

追加のコンテンツ3-1。

追加のコンテンツ3-2。