8192.jp

クリックで開閉するシンプルなアコーディオン(jQuery)

2023/09/04 2023/09/04

よくあるアコーディオンを実装するためのコードです。

目次

    仕様

    • 見た目はリスト風
    • 項目名をクリックすると、その下のコンテンツが開閉する
    • 別の項目をクリックした際に、既に開いているコンテンツは閉じる

    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.