クリックで開閉するシンプルなアコーディオン(jQuery)
よくあるアコーディオンを実装するためのコードです。
目次
仕様
- 見た目はリスト風
- 項目名をクリックすると、その下のコンテンツが開閉する
- 別の項目をクリックした際に、既に開いているコンテンツは閉じる
HTML
<div class="acc_wrap"> <div class="acc_title">コンテンツ 1</div> <ul class="acc_content"> <li>コンテンツ 1-1</li> <li>コンテンツ 1-2</a></li> <li>コンテンツ 1-3</a></li> <li>コンテンツ 1-4</a></li> </ul> <div class="acc_title">コンテンツ 2</div> <ul class="acc_content"> <li>コンテンツ 2-1</li> <li>コンテンツ 2-2</a></li> <li>コンテンツ 2-3</a></li> <li>コンテンツ 2-4</a></li> </ul> <div class="acc_title">コンテンツ 3</div> <ul class="acc_content"> <li>コンテンツ 3-1</li> <li>コンテンツ 3-2</a></li> <li>コンテンツ 3-3</a></li> <li>コンテンツ 3-4</a></li> </ul> <div class="acc_title">コンテンツ 4</div> <ul class="acc_content"> <li>コンテンツ 4-1</li> <li>コンテンツ 4-2</a></li> <li>コンテンツ 4-3</a></li> <li>コンテンツ 4-4</a></li> </ul> </div>
.acc_wrap | アコーディオン全体を囲うラッパー |
.acc_title | 各項目のタイトル(押すと下の.acc_content が開閉する) |
.acc_content | アコーディオンに格納するコンテンツ |
CSS
.acc_wrap{ display: flex; flex-direction: column; justify-content: center; align-items: flex-start; width: 300px; margin: 20px auto 0; border: 1px solid #333; } .acc_title{ display: flex; justify-content: flex-start; align-items: center; box-sizing: border-box; width: 100%; height: 50px; padding: 0 10px; border-top: 1px solid #333; background: #fff; cursor: pointer; } .acc_title:first-of-type{ border: none; } .acc_content{ display: none; width: 100%; margin: 0; padding: 0; list-style: none; } .acc_content li{ box-sizing: border-box; width: 100%; padding: 10px; border-top: 1px solid #333; background: #ddd; } .acc_content li:not(:first-of-type){ margin-top: -1px; }
ラッパー、タイトル、コンテンツの各ボーダーが並んで幅がおかしくならないように、割と細かく制御しています。
また、横幅は300pxにしていますが、サイズや色はサイトに合わせて適宜変更してください。
jQuery
$(".acc_title").click(function() { $(".acc_title.open").not(this).removeClass("open"); $(".acc_content:visible").not($(this).next(".acc_content")).slideUp(); $(this).toggleClass("open"); const content = $(this).next(".acc_content"); if (content.is(':visible')) { content.slideUp(); } else { content.slideDown(); } });
実際の動作
See the Pen Untitled by Leo_8192 (@Leo_8192) on CodePen.