MENU

【jQuery】クリックしたら開閉するアコーディオンを作成する方法

クリックしたら開いたり閉じたりするアコーディオンを作成する方法

クリックしたら開いたり閉じたりするQ&Aを作成したい!!

というわけで今回はクリックしたらアコーディオンが開いたり閉じたりする実装をご紹介します。
今回は「jQuery」での実装を見てみましょう!!

目次

アコーディオンでQ&Aを作成する

これはよくある実装かと思います。
「Q」をクリックすると「A」がアコーディオンで表示される実装。
まずは、HTML、CSSをさらっと紹介します。

HTML、CSS

まずはさらっとHTMLCSSを共有いたします。
まあ、ここは特別なことはしてないのでさらっと。

【HTML】

      <div class="p-qa__box c-qa" id="training">
              <h2 class="c-qa__title">研修・制度について</h2>
              <div class="c-qa__box">
                <div class="c-qa__content">
                  <p class="c-qa__question"><span>評価制度・給与制度について教えてください。</span></p>
                  <p class="c-qa__answer is-active"><span>回答が入ります。回答が入ります。</span></p>
                </div>
                <div class="c-qa__content">
                  <p class="c-qa__question"><span>研修制度について教えてください</span></p>
                  <p class="c-qa__answer"><span>回答が入ります。回答が入ります。回答が入ります。</span></p>
                </div>
                <div class="c-qa__content">
                  <p class="c-qa__question"><span>社内異動制度はありますか</span></p>
                  <p class="c-qa__answer"><span>回答が入ります。回答が入ります。回答が入ります。</span></p>
                </div>
              </div>
            </div>
【CSS】

.c-qa__title {
  font-size: myrem(22);
  line-height: 1.7;

  @include mq('md') {
    font-size: myrem(28);
  }
}

.c-qa__box {
  margin-top: myrem(12);
  padding: myrem(16) myrem(12) myrem(16);
  background-color: $light_grey;

  @include mq('md') {
    margin-top: myrem(24);
    padding: myrem(32) myrem(24) myrem(32);
  }
}

.c-qa__content:not(:first-child) {
  margin-top: myrem(22);

  @include mq('md') {
    margin-top: myrem(43);
  }
}

.c-qa__question {
  background-color: $white;
  padding: myrem(10) myrem(12);

  @include mq('md') {
    padding: myrem(20) myrem(24);
  }
}

.c-qa__question:hover {
  @include mq('md') {
    cursor: pointer;
  }
}

.c-qa__question span {
  display: block;
  font-weight: $Medium;
  font-size: myrem(14);
  padding-left: myrem(35);
  padding-right: myrem(25);
  position: relative;

  @include mq('md') {
    font-size: myrem(16);
    padding-left: myrem(55);
    padding-right: myrem(25);
  }
}

.c-qa__question span::before {
  position: absolute;
  content: "Q.";
  font-family: $font-en;
  font-weight: bold;
  font-size: myrem(20);
  color: $grey_logo;
  top: myrem(-4);
  left: 0;

  @include mq('md') {
    font-size: myrem(24);
    top: myrem(-5);
  }
}

.c-qa__question span::after {
  position: absolute;
  content: "";
  width: myrem(8);
  height: myrem(8);
  border-right: 1px solid $grey_logo;
  border-bottom: 1px solid $grey_logo;
  top: myrem(5);
  transform: rotate(45deg);
  right: myrem(4);
}

.c-qa__answer {
  padding: myrem(10) myrem(12) 0;

  @include mq('md') {
    padding: myrem(23) myrem(25) 0;
  }
}

.c-qa__answer.is-active {
  display: block;
}

.c-qa__answer span {
  display: block;
  font-weight: $Regular;
  font-size: myrem(14);
  line-height: 1.8;
  letter-spacing: 0.04em;
  padding-left: myrem(35);
  position: relative;

  @include mq('md') {
    padding-left: myrem(51);
  }
}

.c-qa__answer span::before {
  position: absolute;
  content: "A.";
  font-family: $font-en;
  font-size: myrem(20);
  font-weight: bold;
  top: myrem(-4);
  left: 0;

  @include mq('md') {
    font-size: myrem(24);
    top: myrem(-5);
  }
}

CSSに関しては、Sass使ってますので「$○○○」で表記されているのは変数です。
また、フォントサイズなどは自作関数(myrem)を使用しております。
ご自身の環境で使われる際はお気を付けください。

HTMLでは、ページを開いた際に一番上のアコーディオンは開けときたいので
「.c-qa__answer」には「is-active」を付けております。

JQueryのコード

続いてjQueryのコードを紹介します。

jQuery(function ($) {

 $('.c-qa__answer').hide();
  $('.c-qa__answer.is-active').show();
  $('.c-qa__content').on('click', function() {
    if($('.c-qa__answer',this).hasClass('is-active')){
      
    }else{
      $('.c-qa__answer').removeClass('is-active');
      $('.c-qa__answer').slideUp();
      $('.c-qa__answer',this).toggleClass('is-active');
      $('.c-qa__answer',this).slideDown();
    }
    
  });
});

ではコードを解説していきます。

まずは最初の2行、「$(‘.c-qa__answer’).hide();」、「$(‘.c-qa__answer.is-active’).show();」ですが、


「$(‘.c-qa__answer’).hide();」 ⇒ 「.c-qa__answer」のクラスがついた要素を非表示に。
「$(‘.c-qa__answer.is-active’).show();」 ⇒ 「.c-qa__answer.is-active」のクラスがついた要素を表示。

順番も大事です!先に「hide」を設定しておかないと思ったような挙動になりません。
「hide」で非表示にしてから「show」「is-active」のついた要素、つまりページを開いた際に
表示させたい最初の「A」アコーディオンを開いている状態にしています。

続いて次の行、

$(‘.c-qa__content’).on(‘click’, function()  ⇒ 「.c-qa__content」のクラスがついた要素をクリックした場合

そしてここから「if else」を使って条件分岐しています。

if($(‘.c-qa__answer’,this).hasClass(‘is-active’)){
}else{
$(‘.c-qa__answer’).removeClass(‘is-active’);
$(‘.c-qa__answer’).slideUp();
$(‘.c-qa__answer’,this).toggleClass(‘is-active’);
$(‘.c-qa__answer’,this).slideDown();
}

まずは、条件分岐が真のとき、
if($(‘.c-qa__answer’,this).hasClass(‘is-active’)){ } ⇒ クリックした.c-qa__answerのクラスがついた要素が
「is-active」のクラスを持っているときは、何もしないとしています。

そして、それ以外の場合(偽のとき)は、

$(‘.c-qa__answer’).removeClass(‘is-active’); ⇒ 「.c-qa__answer」のクラスから「is-active」を取り除き
$(‘.c-qa__answer’).slideUp(); ⇒ 「.c-qa__answer」のクラスがついた要素をスライドで非表示にする

$(‘.c-qa__answer’,this).toggleClass(‘is-active’); ⇒ クリックした「.c-qa__answer」のクラスがついた要素から「is-active」クラスを付け外しする
$(‘.c-qa__answer’,this).slideDown(); ⇒ クリックした「.c-qa__answer」のクラスがついた要素をスライドで表示にする

としています。

ここでポイントとなるのは「this」の使い方ですね。
ここでは「クリックする動作」「this」としていて、特定のクラスと合わせることで
「クリックしたクラスの要素」と指定することができます。

まとめ

というわけで今回はクリックしたらアコーディオンが開いたり閉じたりする実装をご紹紹介しました。
実案件でも頻出ですのでぜひとも覚えておきましょー。

よかったらフォローしてね!!
  • URLをコピーしました!
  • URLをコピーしました!
目次