動きを実現する仕組み
Javascriptでアコーディオンの質問コンテンツ作成
STEP1 通常の質問アコーディオンのHTMLコード
<section class="accordion_section">
<div class="section_inner">
<h2 class="section_title">アコーディオン</h2>
<h3>よくある質問(通常開閉バージョン)</h3>
<div class="accordion">
<div class="accordion-item">
<button class="accordion-question">質問1</button>
<div class="accordion-answer">回答1の内容が入ります。</div>
</div>
<div class="accordion-item">
<button class="accordion-question">質問2</button>
<div class="accordion-answer">回答2の内容が入ります。</div>
</div>
<div class="accordion-item">
<button class="accordion-question">質問3</button>
<div class="accordion-answer">回答3の内容が入ります。</div>
</div>
<div class="accordion-item">
<button class="accordion-question">質問4</button>
<div class="accordion-answer">回答4の内容が入ります。</div>
</div>
<div class="accordion-item">
<button class="accordion-question">質問5</button>
<div class="accordion-answer">回答5の内容が入ります。</div>
</div>
</div>
</div>
</section>CSSでコーディング
STEP2 通常の質問アコーディオンのcssコード
/*---------------accordionの設定-------------------------------*/
/* アコーディオンセクション全体のスタイル */
.accordion_section {
width: 100%;
margin-block: 100px;
/* 必要に応じてmin-heightを調整 */
}
.section_inner {
width: 100%;
max-width: 1200px;
margin: 0 auto;
}
.section_title {
position: relative;
font-size: min(2.78vw, 40px);
font-weight: bold;
color: var(--text-color);
text-align: left;
margin-bottom: min(1.39vw, 20px);
padding-left: 15px;
}
.section_title::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 5px;
height: 100%;
background-color: var(--black--);
}
h3 {
font-size: min(1.3888888888888888vw, 20px);
font-weight: bold;
color: var(--text-color);
text-align: left;
margin-block: 20px;
padding-left: 15px;
}
/*---------------accordionの詳細設定--------------------*/
/* アコーディオン全体の余白 */
.accordion {
width: 100%;
margin: 40px auto;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
background: #fff;
}
/* 各アコーディオン項目 */
.accordion-item {
border-bottom: 1px solid #e0e0e0;
}
/* 質問部分 */
.accordion-question {
width: 100%;
text-align: left;
background: none;
border: none;
outline: none;
font-size: min(1.3888888888888888vw, 20px);
padding: 16px 48px 16px 16px; /* 右に余白追加 */
cursor: pointer;
transition: background 0.2s;
font-weight: bold;
position: relative;
}
.accordion-question:hover {
background: #f5f5f5;
}
/* 質問の右端に矢印アイコン */
.accordion-question::after {
content: "";
position: absolute;
right: 20px;
top: 50%;
transform: translateY(-50%) rotate(0deg);
border: solid #888;
border-width: 0 3px 3px 0;
display: inline-block;
padding: 6px;
margin-left: 8px;
transition: transform 0.3s;
/* 下向き矢印 */
width: 10px;
height: 10px;
box-sizing: border-box;
}
/* アクティブ時は上向き矢印 */
.accordion-item.active .accordion-question::after {
transform: translateY(-50%) rotate(-135deg);
}
/* 通常時は下向き矢印 */
.accordion-question::after {
transform: translateY(-50%) rotate(45deg);
}
/* 回答部分(初期は非表示) */
.accordion-answer {
max-height: 0;
overflow: hidden;
background: #fafafa;
transition: max-height 0.3s cubic-bezier(0.4, 0, 0.2, 1), padding 0.3s;
padding: 0 16px;
font-size: min(1.1111111111111112vw, 16px);
}
/* アクティブ時の回答表示 */
.accordion-item.active .accordion-answer {
max-height: 200px;
padding: 16px;
}
@media screen and (max-width: 768px) {
h3 {
font-size: min(2.083333333333333vw, 16px) !important;
}
.accordion {
width: 100%;
margin: 20px auto;
}
.accordion-question {
font-size: min(2.083333333333333vw, 16px);
}
.accordion-answer {
font-size: min(1.8229166666666667vw, 14px);
}
}
@media screen and (max-width: 450px) {
h3 {
font-size: min(3.111111111111111vw, 14px) !important;
}
.accordion-question {
font-size: min(3.111111111111111vw, 14px);
}
.accordion-answer {
font-size: min(2.666666666666667vw, 12px);
}
}JSを実装
STEP3 通常の質問アコーディオンのjsコード
// アコーディオンの開閉動作
document.addEventListener("DOMContentLoaded", function () {
const items = document.querySelectorAll(".accordion-item");
items.forEach((item) => {
const question = item.querySelector(".accordion-question");
question.addEventListener("click", function () {
// 他のアコーディオンを閉じる場合は下記を有効化
// items.forEach(i => i.classList.remove('active'));
// item.classList.toggle('active');
// 複数開閉可の場合はこちら
item.classList.toggle("active");
});
});
});
2つめのアコーディオン・1つ開けたら1つ閉じるバージョン
STEP1 1つ開けたら1つ閉じるバージョンのアコーディオンのHTMLコード
<section class="accordion_section">
<div class="section_inner">
<h3>よくある質問(1つ開いたら1つ閉じるバージョン)</h3>
<div class="accordion-single">
<div class="accordion-item-single">
<button class="accordion-question-single">質問1</button>
<div class="accordion-answer-single">回答1の内容が入ります。</div>
</div>
<div class="accordion-item-single">
<button class="accordion-question-single">質問2</button>
<div class="accordion-answer-single">回答2の内容が入ります。</div>
</div>
<div class="accordion-item-single">
<button class="accordion-question-single">質問3</button>
<div class="accordion-answer-single">回答3の内容が入ります。</div>
</div>
<div class="accordion-item-single">
<button class="accordion-question-single">質問4</button>
<div class="accordion-answer-single">回答4の内容が入ります。</div>
</div>
<div class="accordion-item-single">
<button class="accordion-question-single">質問5</button>
<div class="accordion-answer-single">回答5の内容が入ります。</div>
</div>
</div>
</div>
</section>CSSでコーディング
STEP2 1つ開けたら1つ閉じるバージョンのcssコード
/*---------------accordionの設定-------------------------------*/
/* アコーディオンセクション全体のスタイル */
.accordion_section {
width: 100%;
margin-block: 100px;
/* 必要に応じてmin-heightを調整 */
}
.section_inner {
width: 100%;
max-width: 1200px;
margin: 0 auto;
}
.section_title {
position: relative;
font-size: min(2.78vw, 40px);
font-weight: bold;
color: var(--text-color);
text-align: left;
margin-bottom: min(1.39vw, 20px);
padding-left: 15px;
}
.section_title::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 5px;
height: 100%;
background-color: var(--black--);
}
h3 {
font-size: min(1.3888888888888888vw, 20px);
font-weight: bold;
color: var(--text-color);
text-align: left;
margin-block: 20px;
padding-left: 15px;
}
/*-----------1つ開けたら1つ閉じるバージョン------------- */
/* アコーディオン全体の余白 */
.accordion-single {
width: 100%;
margin: 40px auto;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
background: #fff;
}
/* 各アコーディオン項目 */
.accordion-item-single {
border-bottom: 1px solid #e0e0e0;
}
/* 質問部分 */
.accordion-question-single {
width: 100%;
text-align: left;
background: none;
border: none;
outline: none;
font-size: min(1.3888888888888888vw, 20px);
padding: 16px 48px 16px 16px; /* 右に余白追加 */
cursor: pointer;
transition: background 0.2s;
font-weight: bold;
position: relative;
}
.accordion-question-single:hover {
background: #f5f5f5;
}
/* 質問の右端に矢印アイコン */
.accordion-question-single::after {
content: "";
position: absolute;
right: 20px;
top: 50%;
transform: translateY(-50%) rotate(0deg);
border: solid #888;
border-width: 0 3px 3px 0;
display: inline-block;
padding: 6px;
margin-left: 8px;
transition: transform 0.3s;
/* 下向き矢印 */
width: 10px;
height: 10px;
box-sizing: border-box;
}
/* アクティブ時は上向き矢印 */
.accordion-item-single.active .accordion-question-single::after {
transform: translateY(-50%) rotate(-135deg);
}
/* 通常時は下向き矢印 */
.accordion-question-single::after {
transform: translateY(-50%) rotate(45deg);
}
/* 回答部分(初期は非表示) */
.accordion-answer-single {
max-height: 0;
overflow: hidden;
background: #fafafa;
transition: max-height 0.3s cubic-bezier(0.4, 0, 0.2, 1), padding 0.3s;
padding: 0 16px;
font-size: min(1.1111111111111112vw, 16px);
}
/* アクティブ時の回答表示 */
.accordion-item-single.active .accordion-answer-single {
max-height: 200px;
padding: 16px;
}
@media screen and (max-width: 768px) {
.accordion-single {
width: 100%;
margin: 20px auto;
}
.accordion-question-single {
font-size: min(2.083333333333333vw, 16px);
}
.accordion-answer-single {
font-size: min(1.8229166666666667vw, 14px);
}
}
@media screen and (max-width: 450px) {
.accordion-question-single {
font-size: min(3.111111111111111vw, 14px);
}
.accordion-answer-single {
font-size: min(2.666666666666667vw, 12px);
}
}JSを実装
STEP3 1つ開けたら1つ閉じるバージョンのjsコード
// 1つ開けたら1つ閉じるバージョン-(.accordion-single用)
document.addEventListener("DOMContentLoaded", function () {
const accordions = document.querySelectorAll(".accordion-single");
accordions.forEach((accordion) => {
const items = accordion.querySelectorAll(".accordion-item-single");
items.forEach((item) => {
const question = item.querySelector(".accordion-question-single");
question.addEventListener("click", function () {
if (item.classList.contains("active")) {
// すでに開いている場合は閉じる
item.classList.remove("active");
} else {
// 他を閉じて自分だけ開く
items.forEach((i) => i.classList.remove("active"));
item.classList.add("active");
}
});
});
});
});ローディング後に1つ空いていて1つ開けたら1つ閉じるバージョン
STEP1 ローディング後に1つ空いていて1つ開けたら1つ閉じるバージョンのアコーディオンのHTMLコード
<section class="accordion_section">
<div class="section_inner">
<h3>
よくある質問(最初から1つ開いていて、1つ開いたら1つ閉じるバージョン)
</h3>
<div class="accordion-single-open">
<div class="accordion-item-single-open">
<button class="accordion-question-single-open">質問1</button>
<div class="accordion-answer-single-open">
回答1の内容が入ります。
</div>
</div>
<div class="accordion-item-single-open">
<button class="accordion-question-single-open">質問2</button>
<div class="accordion-answer-single-open">
回答2の内容が入ります。
</div>
</div>
<div class="accordion-item-single-open">
<button class="accordion-question-single-open">質問3</button>
<div class="accordion-answer-single-open">
回答3の内容が入ります。
</div>
</div>
<div class="accordion-item-single-open">
<button class="accordion-question-single-open">質問4</button>
<div class="accordion-answer-single-open">
回答4の内容が入ります。
</div>
</div>
<div class="accordion-item-single-open">
<button class="accordion-question-single-open">質問5</button>
<div class="accordion-answer-single-open">
回答5の内容が入ります。
</div>
</div>
</div>
</div>
</section>CSSでコーディング
STEP2 最初から1つ開いていて、1つ開いたら1つ閉じるバージョンのcssコード
/*---------------accordionの設定-------------------------------*/
/* アコーディオンセクション全体のスタイル */
.accordion_section {
width: 100%;
margin-block: 100px;
/* 必要に応じてmin-heightを調整 */
}
.section_inner {
width: 100%;
max-width: 1200px;
margin: 0 auto;
}
.section_title {
position: relative;
font-size: min(2.78vw, 40px);
font-weight: bold;
color: var(--text-color);
text-align: left;
margin-bottom: min(1.39vw, 20px);
padding-left: 15px;
}
.section_title::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 5px;
height: 100%;
background-color: var(--black--);
}
h3 {
font-size: min(1.3888888888888888vw, 20px);
font-weight: bold;
color: var(--text-color);
text-align: left;
margin-block: 20px;
padding-left: 15px;
}
/*----------- ローディング後に1つ空いていて1つ開けたら1つ閉じるバージョン------------- */
/* アコーディオン全体の余白 */
.accordion-single-open {
width: 100%;
margin: 40px auto;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
background: #fff;
}
/* 各アコーディオン項目 */
.accordion-item-single-open {
border-bottom: 1px solid #e0e0e0;
}
/* 質問部分 */
.accordion-question-single-open {
width: 100%;
text-align: left;
background: none;
border: none;
outline: none;
font-size: min(1.3888888888888888vw, 20px);
padding: 16px 48px 16px 16px; /* 右に余白追加 */
cursor: pointer;
transition: background 0.2s;
font-weight: bold;
position: relative;
}
.accordion-question-single-open:hover {
background: #f5f5f5;
}
/* 質問の右端に矢印アイコン */
.accordion-question-single-open::after {
content: "";
position: absolute;
right: 20px;
top: 50%;
transform: translateY(-50%) rotate(0deg);
border: solid #888;
border-width: 0 3px 3px 0;
display: inline-block;
padding: 6px;
margin-left: 8px;
transition: transform 0.3s;
/* 下向き矢印 */
width: 10px;
height: 10px;
box-sizing: border-box;
}
/* アクティブ時は上向き矢印 */
.accordion-item-single-open.active .accordion-question-single-open::after {
transform: translateY(-50%) rotate(-135deg);
}
/* 通常時は下向き矢印 */
.accordion-question-single-open::after {
transform: translateY(-50%) rotate(45deg);
}
/* 回答部分(初期は非表示) */
.accordion-answer-single-open {
max-height: 0;
overflow: hidden;
background: #fafafa;
transition: max-height 0.3s cubic-bezier(0.4, 0, 0.2, 1), padding 0.3s;
padding: 0 16px;
font-size: min(1.1111111111111112vw, 16px);
}
/* アクティブ時の回答表示 */
.accordion-item-single-open.active .accordion-answer-single-open {
max-height: 200px;
padding: 16px;
}
@media screen and (max-width: 768px) {
.accordion-single-open {
width: 100%;
margin: 20px auto;
}
.accordion-question-single-open {
font-size: min(2.083333333333333vw, 16px);
}
.accordion-answer-single-open {
font-size: min(1.8229166666666667vw, 14px);
}
}
@media screen and (max-width: 450px) {
.accordion-question-single-open {
font-size: min(3.111111111111111vw, 14px);
}
.accordion-answer-single-open {
font-size: min(2.666666666666667vw, 12px);
}
}JSを実装
STEP3 最初から1つ開いていて、1つ開いたら1つ閉じるバージョンのjsコード
// 最初から1つ開いていて、1つ開いたら1つ閉じるバージョン(.accordion-single-open用)
document.addEventListener("DOMContentLoaded", function () {
const accordions = document.querySelectorAll(".accordion-single-open");
accordions.forEach((accordion) => {
const items = accordion.querySelectorAll(".accordion-item-single-open");
// 最初の1つ目をopen
if (items.length > 0) {
items[0].classList.add("active");
}
items.forEach((item) => {
const question = item.querySelector(".accordion-question-single-open");
question.addEventListener("click", function () {
if (item.classList.contains("active")) {
// すでに開いている場合は閉じる
item.classList.remove("active");
} else {
// 他を閉じて自分だけ開く
items.forEach((i) => i.classList.remove("active"));
item.classList.add("active");
}
});
});
});
});コチラのサイトはコチラから
