jqueryでアコーディオンメニューを実装する
javascript

jQueryのtoggleSlideを使ってアコーディオンメニューを実装するサンプル

アバター by pranktone
サンプルコード

jQueryのtoggleSlideを使ってアコーディオンメニューを実装するサンプルを作ってみました。使い回せるように極力シンプルな構成にしたつもりです。

別記事のCSSとhtmlのcheckboxを使って高さ可変のアコーディオンメニューを実装するサンプルと、ネイティブのJavaScript(脱jQuery)でアコーディオンメニューを実装するサンプルとの比較も兼ねて作ったので、htmlは似た構成にしています。

html

<span class="accordion-trigger js-accordion-trigger is-opened">アコーディオン1</span>
<ul class="accordion-target list js-accordion-target">
  <li class="list__item"><a href="#">メニュー1</a></li>
  <li class="list__item"><a href="#">メニュー2</a></li>
  <li class="list__item"><a href="#">メニュー3</a></li>
  <li class="list__item"><a href="#">メニュー4</a></li>
  <li class="list__item"><a href="#">メニュー5</a></li>
</ul><!-- .accordion-target -->

<span class="accordion-trigger js-accordion-trigger">アコーディオン2</span>
<ul class="accordion-target list js-accordion-target">
  <li class="list__item"><a href="#">メニュー1メニュー1メニュー1メニュー1メニュー1メニュー1メニュー1メニュー1メニュー1メニュー1メニュー1メニュー1メニュー1メニュー1メニュー1メニュー1メニュー1メニュー1</a></li>
  <li class="list__item"><a href="#">長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気長いテキストも平気</a></li>
  <li class="list__item"><a href="#">メニュー3</a></li>
  <li class="list__item"><a href="#">メニュー4</a></li>
  <li class="list__item"><a href="#">メニュー5</a></li>
</ul><!-- .accordion-target -->

アコーディオンを展開させる要素(トリガーになる要素)は'.accordion-trigger'、アコーディオンの本体(展開する要素)は'.accordion-target'という構成です。

それぞれ、JavaScriptを使用して動かす要素になるので、JavaScriptでの操作のために 'js-' というプレフィックスをつけた'.js-accordion-trigger', '.js-accordion-target'というクラスをそれぞれにつけています。

CSS

.accordion-trigger { /* label */
  text-align: left;
  cursor: pointer;
  display: block;
  padding: 15px;
  padding-right: 42px; /* padding + icon width */
  border-bottom: 1px solid #ccc;
  background-color: lightblue;
  position: relative;
}

/* icon */
.accordion-trigger::before,
.accordion-trigger::after {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  right: 15px;
  margin: auto;
  height: 2px;
  width: 12px;
  background-color: #000;
  transition: all .1s ease-out;
}

.accordion-trigger::after {
  transform: rotate(90deg);
}

.accordion-trigger.is-opened::after {
  opacity: 0;
  transform: rotate(0);
}
/* /icon */


.accordion-target { /* target */
  box-sizing: border-box;
  overflow: hidden;
  display: none;
  text-align: left;
}

.accordion-target.list > .list__item { /* target-child */
  box-sizing: border-box;
  border-bottom: 1px solid #ccc;
  opacity: 1;
  padding-top: 15px;
  padding-bottom: 15px;
}

.accordion-target.list > .list__item > a {
  display: block;
  margin-top: -15px;
  margin-bottom: -15px;
  padding: 15px;
  color: #000;
  text-decoration: none;
}

CSSのポイントとしてはトリガー要素にcursor: pointerを付与。アイコンは擬似要素::before, ::afterを使って構成しています。展開する要素('.accordion-target')にtransitionの要素を書いてしまうとjQueryのアニメーションに影響が出てしまうので、要注意です。

JavaScript

jQueryで動かしているので、忘れずにjQueryを読み込みます。今回はCDNで埋め込んでいます。

<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
$(function(){
  // '.is-opened'がついている展開メニューを表示する
  $('.js-accordion-trigger.is-opened').next('.js-accordion-target').show();

  // トリガーを押した時のアクション
  $('.js-accordion-trigger').on('click', function() {
    // アコーディオントグル
    $(this).next('.js-accordion-target').slideToggle();

    // トリガーに'.is-opened' クラスをトグル
    $(this).toggleClass('is-opened');
  });
});

トリガー要素に'.is-opened'が最初から付加されていた場合は、その次に来る展開要素を開いておくように指定しています。

トリガーがクリックされたら、展開要素をslideToggleで開閉、トリガー要素は'.is-opened'クラスをtoggleClassで追加・削除を行っています。

デモ GitHub

アコーディオン実装に関する記事

コメント

まだ、コメントはありません。

トラックバックURL

https://blog.pranktone.net/web/javascript/20191030170050.html/trackback
ありきたりな日常と
それとない非日常を
紡ぐ記録
SKIP