
アコーディオン(レスポンシブ対応) | HTML/CSS/JS
HTML
<div class="acordion">
<div class="title">アコーディオンのタイトル</div>
<div class="content">
<p>
アコーディオンの本文<br />
アコーディオンの本文<br />
</p>
</div>
</div>
・.acordionで要素の幅設定
・.titleをクリックすると、.contentが開く
CSS
.acordion {
width: 500px;
}
.title {
max-width: 100%;
background: #333;
border-radius: 4px;
text-align: left;
font-size: 16px;
line-height: 1.5;
color: #fff;
padding: 12px 16px;
display: flex;
opacity: 0.9;
align-items: center;
justify-content: space-between;
transition: 0.7s; /* 全てのプロパティに有効 */
gap: 20px;
}
.title:hover {
cursor: pointer;
opacity: 1;
}
.title::after {
content: "+";
display: block;
margin-left: 20px;
font-size: 24px;
line-height: 1;
margin-left: auto;
transition: 0.7s;
}
.title.is-open::after {
transform: rotate(45deg);
transition: 0.3s;
}
.content {
box-sizing: border-box;
background-color: #faf7ec;
text-align: center;
width: 100%;
padding: 0 10%;
line-height: 1.5;
border: 0px solid #333333; /* border必須 */
transition: border 0.3s ease-out;
}
.content.is-open {
border: 3px solid #333333;
padding: 20px 10%;
transition: border 0.3s ease-out;
}
.content p {
text-align: left;
line-height: 0;
opacity: 0;
visibility: hidden;
transition: line-height 0.3s ease-out, opacity 0.1s linear,
visibility 0.1s linear;
}
.content.is-open > p {
line-height: 1.5;
opacity: 1;
visibility: visible;
transition: line-height 0.3s ease-out, opacity 0.1s linear 0.1s,
visibility 0.1s linear 0.1s;
}
@media (maxwidth: 768px) {
.acordion {
margin: 0 auto;
}
.content {
padding: 0 16px;
}
}
・基本は閉じている状態のCSS
・is-openが開いている状態
・開く時、閉じる時それぞれのtransitionを設定
JS
document.addEventListener("DOMContentLoaded", function () {
document.querySelector(".title").addEventListener("click", function () {
document.querySelector(".content").classList.toggle("is-open");
document.querySelector(".title").classList.toggle("is-open");
});
});
・.titleにクリックイベントつけるよ
・クリックしたら、.contentと.titleにis-openを付与するイベントだよ