見出し画像

アコーディオン(レスポンシブ対応) | HTML/CSS/JS

HTML

    <div class="acordion">
      <div class="title">アコーディオンのタイトル</div>
      <div class="content">
        <p>
          アコーディオンの本文<br />
          アコーディオンの本文<br />
        </p>
      </div>
    </div>

・.acordionで要素の幅設定
・.titleをクリックすると、.contentが開く

CSS

 .acordion {
        width: 500px;
      }

      .title {
        max-width: 100%;
        background: #333;
        border-radius: 4px;
        text-align: left;
        font-size: 16px;
        line-height: 1.5;
        color: #fff;
        padding: 12px 16px;
        display: flex;
        opacity: 0.9;
        align-items: center;
        justify-content: space-between;
        transition: 0.7s; /* 全てのプロパティに有効 */
        gap: 20px;
      }

      .title:hover {
        cursor: pointer;
        opacity: 1;
      }

      .title::after {
        content: "+";
        display: block;
        margin-left: 20px;
        font-size: 24px;
        line-height: 1;
        margin-left: auto;
        transition: 0.7s;
      }

      .title.is-open::after {
        transform: rotate(45deg);
        transition: 0.3s;
      }

      .content {
        box-sizing: border-box;
        background-color: #faf7ec;
        text-align: center;
        width: 100%;
        padding: 0 10%;
        line-height: 1.5;
        border: 0px solid #333333; /* border必須 */
        transition: border 0.3s ease-out;
      }

      .content.is-open {
        border: 3px solid #333333;
        padding: 20px 10%;
        transition: border 0.3s ease-out;
      }

      .content p {
        text-align: left;
        line-height: 0;
        opacity: 0;
        visibility: hidden;
        transition: line-height 0.3s ease-out, opacity 0.1s linear,
          visibility 0.1s linear;
      }

      .content.is-open > p {
        line-height: 1.5;
        opacity: 1;
        visibility: visible;
        transition: line-height 0.3s ease-out, opacity 0.1s linear 0.1s,
          visibility 0.1s linear 0.1s;
      }

      @media (maxwidth: 768px) {
        .acordion {
          margin: 0 auto;
        }

        .content {
          padding: 0 16px;
        }
      }

・基本は閉じている状態のCSS
・is-openが開いている状態
・開く時、閉じる時それぞれのtransitionを設定

JS

document.addEventListener("DOMContentLoaded", function () {
  document.querySelector(".title").addEventListener("click", function () {
    document.querySelector(".content").classList.toggle("is-open");
    document.querySelector(".title").classList.toggle("is-open");
  });
});

・.titleにクリックイベントつけるよ
・クリックしたら、.contentと.titleにis-openを付与するイベントだよ

いいなと思ったら応援しよう!