《Javascript》クリックで開閉する折りたたみメニュー
公開日:2026年01月20日 最終更新日:2026年1月20日
JavaScriptとCSSを使ったクリックで開閉する折りたたみ(アコーディオン)メニューのサンプルです。
HTML/CSSの構成はどのサンプルも同じです。
Ad
個別に開閉する
クリックすると1つずつ開くことができます。
DEMO
折りたたみメニュー
折りたたみメニュー
折りたたみメニュー
HTML
<p class="title">折りたたみメニュー</p>
<div class="box">
<div class="box-inner">
この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。
</div>
</div>
<p class="title">折りたたみメニュー</p>
<div class="box">
<div class="box-inner">
この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。
</div>
</div>
<p class="title">折りたたみメニュー</p>
<div class="box">
<div class="box-inner">
この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。
</div>
</div>CSS
開閉動作をわかりやすくするための装飾です。
好きにアレンジしてください。
.boxはheight:0がはいっているので、余白など装飾する場合は、.box-innerに入れます。
.title {
border-bottom: 1px solid #999;
cursor: pointer;
}
.title:hover {
color: #999;
}
.title:after {
content: '↓';
}
.title.open:after {
content: '↑';
}
.box {
height: 0;
overflow: hidden;
transition: height .5s ease;
}
.box-inner {
background: #eee;
padding: 20px;
}JavaScript
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('.title').forEach(title => {
const box = title.nextElementSibling;
const inner = box.firstElementChild;
title.addEventListener('click', () => {
const isOpen = title.classList.toggle('open');
if (isOpen) {
box.style.height = inner.scrollHeight + 'px';
} else {
box.style.height = '0px';
}
});
});
});
最初のメニューだけ開いた状態にする
最初のメニューを開いた状態にします。
クリック後の動作は上のサンプルと同じです。
DEMO
折りたたみメニュー
折りたたみメニュー
折りたたみメニュー
HTML
<p class="title2">折りたたみメニュー</p>
<div class="box2">
<div class="box2-inner">
この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。
</div>
</div>
<p class="title2">折りたたみメニュー</p>
<div class="box2">
<div class="box2-inner">
この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。
</div>
</div>
<p class="title2">折りたたみメニュー</p>
<div class="box2">
<div class="box2-inner">
この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。
</div>
</div>CSS
開閉動作をわかりやすくするための装飾です。
好きにアレンジしてください。
.box2はheight:0がはいっているので、余白など装飾する場合は、.box2-innerに入れます。
.title2 {
border-bottom: 1px solid #999;
cursor: pointer;
}
.title2:hover {
color: #999;
}
.title2:after {
content: '↓';
}
.title2.open:after {
content: '↑';
}
.box2 {
height: 0;
overflow: hidden;
transition: height .5s ease;
}
.box2-inner {
background: #eee;
padding: 20px;
}JavaScript
document.addEventListener('DOMContentLoaded', () => {
const titles = document.querySelectorAll('.title2');
titles.forEach(title => {
const box = title.nextElementSibling;
const inner = box.firstElementChild;
title.addEventListener('click', () => {
const isOpen = title.classList.toggle('open');
if (isOpen) {
box.style.height = inner.scrollHeight + 'px';
} else {
box.style.height = '0px';
}
});
});
if (titles.length > 0) {
titles[0].click();
}
});1つだけ開いた状態にする
クリックしたメニュー以外が開いている場合は閉じるようにしています。
DEMO
折りたたみメニュー
折りたたみメニュー
折りたたみメニュー
HTML
<p class="title3">折りたたみメニュー</p>
<div class="box3">
<div class="box3-inner">
この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。
</div>
</div>
<p class="title3">折りたたみメニュー</p>
<div class="box3">
<div class="box3-inner">
この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。
</div>
</div>
<p class="title3">折りたたみメニュー</p>
<div class="box3">
<div class="box3-inner">
この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。
</div>
</div>CSS
開閉動作をわかりやすくするための装飾です。
好きにアレンジしてください。
.box3はheight:0がはいっているので、余白など装飾する場合は、.box3-innerに入れます。
.title3 {
border-bottom: 1px solid #999;
cursor: pointer;
}
.title3:hover {
color: #999;
}
.title3:after {
content: '↓';
}
.title3.open:after {
content: '↑';
}
.box3 {
height: 0;
overflow: hidden;
transition: height .5s ease;
}
.box3-inner {
background: #eee;
padding: 20px;
}JavaScript
document.addEventListener('DOMContentLoaded', () => {
const titles = document.querySelectorAll('.title3');
titles.forEach(title => {
const box = title.nextElementSibling;
const inner = box.firstElementChild;
title.addEventListener('click', () => {
titles.forEach(t => {
const b = t.nextElementSibling;
if (t !== title) {
b.style.height = '0px';
t.classList.remove('open');
}
});
const isOpen = title.classList.toggle('open');
if (isOpen) {
box.style.height = inner.scrollHeight + 'px';
} else {
box.style.height = '0px';
}
});
});
});
jQuery版
jQueryでの実装方法については、以前の記事でまとめています。
