よくある質問のアコーディオンを作成!HTML・CSS・JSソースコードあり!jQueryを使用しないパターンも紹介!その2

はじめに

今回は実務経験で作成した「よくある質問セクションのアコーディオンメニュー」をご紹介します。

以前下記記事でも紹介しましたが、

よくある質問アコーディオン

よくある質問のアコーディオンメニューのHTML・CSS・JavaScriptのソースコードを紹介しています。またjQueryを使用しないパターンも紹介しています。

今回作成したものは以下の点で違っています。

・デザイン
・JavaScriptで実装している部分が以前と比べてよりslideToggle()に近いものになっている。

よくある質問アコーディオン(jQueryで実装)

よくある質問アコーディオン(jQueryで実装)動き

Q.
質問テキスト質問テキスト質問テキスト質問テキスト?
A.

回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト

Q.
質問テキスト質問テキスト質問テキスト質問テキスト?
A.

回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト

Q.
質問テキスト質問テキスト質問テキスト質問テキスト?
A.

回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト

よくある質問アコーディオン(jQueryで実装)ソースコード

PR

<div class="faq__list">
	<div class="faq__item">
		<div class="faq-q">
			<div class="faq__mark">Q.</div>
			<div class="faq-q__txt">質問テキスト質問テキスト質問テキスト質問テキスト?</div>
			<span class="icon-right"></span>
		</div>
		<div class="faq-a">
			<div class="faq__mark">A.</div>
			<div class="faq-a__txt">
				<p>回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト</p>
			</div>
		</div>
	</div>
	<div class="faq__item">
		<div class="faq-q">
			<div class="faq__mark">Q.</div>
			<div class="faq-q__txt">質問テキスト質問テキスト質問テキスト質問テキスト?</div>
			<span class="icon-right"></span>
		</div>
		<div class="faq-a">
			<div class="faq__mark">A.</div>
			<div class="faq-a__txt">
				<p>回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト</p>
			</div>
		</div>
	</div>
	<div class="faq__item">
		<div class="faq-q">
			<div class="faq__mark">Q.</div>
			<div class="faq-q__txt">質問テキスト質問テキスト質問テキスト質問テキスト?</div>
			<span class="icon-right"></span>
		</div>
		<div class="faq-a">
			<div class="faq__mark">A.</div>
			<div class="faq-a__txt">
				<p>回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト</p>
			</div>
		</div>
	</div>
</div>
.faq-q {
    position: relative;
    background-color: #ffeedd;
    cursor: pointer;
}
.faq-a {
    position: relative;
    display: none;
}
.faq__mark {
    position: absolute;
    text-align: center;
    font-weight: 700;
    border: 1px solid #094;
    border-radius: 50%;
}
.faq-q .faq__mark {
    color: #fff;
    background-color: #094;
}
.faq-q__txt {
    font-weight: 700;
}
.icon-right::before {
    content: "";
    position: absolute;
    top: 50%;
    right: 0;
    width: 30px;
    height: 30px;
    border-top: 4px solid #094;
    border-right: 4px solid #094;
    transform: translate(-65%,-50%) rotate(45deg);
}
.faq-a .faq__mark {
    color: #094;
    background-color: #fff;
}
.faq__list p {
    line-height: 2;
}
@media screen and (min-width: 768px) {
    .faq__item:nth-of-type(n+2) {
        margin-top: 30px;
    }
    .faq-q {
        padding: 20px 60px 20px 80px;
    }
    .faq-a p {
        padding: 20px 60px 0 80px;
    }
    .faq__mark {
        width: 40px;
        line-height: 40px;
        font-size: 22px;
        top: 18px;
        left: 20px;
    }
}
@media screen and (max-width: 767px) {
    .faq__item:nth-of-type(n+2) {
        margin-top: 35px;
    }
    .faq__mark {
        width: 30px;
        line-height: 30px;
        font-size: 18px;
        top: 25px;
        left: 20px;
    }
    .faq-q__txt {
        padding: 20px 50px 20px 70px;
        line-height: 1.4;
    }
    .faq-a__txt {
        padding-top: 20px;
    }
    .faq-a p {
        padding: 0 14px 0 70px;
    }
}
jQuery(".faq-q").on('click', function() {
	jQuery(this).next('.faq-a').slideToggle();
});

よくある質問アコーディオン(純粋なJavaScriptで実装)

前回作成したものよりもslideToggle()の動きに近くなっていると思います。

よくある質問アコーディオン(純粋なJavaScriptで実装)動き

Q.
質問テキスト質問テキスト質問テキスト質問テキスト?
A.

回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト

Q.
質問テキスト質問テキスト質問テキスト質問テキスト?
A.

回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト

Q.
質問テキスト質問テキスト質問テキスト質問テキスト?
A.

回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト回答テキスト

よくある質問アコーディオン(jQueryで実装)ソースコード

PR

HTMLは共通です。CSSも下記以外は共通です。

.faq-a {
    position: relative;
    height: 0;
    opacity: 0;
    visibility: hidden;
    transition: all 0.5s;
}
.faq-a.open {
    opacity: 1;
    visibility: visible;
}
const faqQElements = document.querySelectorAll(".faq-q01");
faqQElements.forEach(function(element) {
	element.addEventListener("click", function() {
		const faqA = element.nextElementSibling;
		const faqATxt = faqA.querySelector(".faq-a__txt");
		faqA.classList.toggle("open");
		if (faqA.classList.contains("open")) {
			faqATxtHeight = faqATxt.offsetHeight;
			faqA.style.height = faqATxtHeight + 'px';
		} else {
			faqATxtHeight = faqATxt.offsetHeight;
			faqA.style.height = '';
		}
	});
});

他のHTMLCSS JavaScriptソースコード紹介記事まとめ

ソースコードまとめ

実務経験で作成したレイアウトのHTML・CSS ・JavaScriptソースコードを紹介した記事まとめています。

>お問い合わせはこちら

お問い合わせはこちら