初心者さん向けに「jQuery」でアコーディオンメニューの作り方を紹介します。CodePenでアニメーションの動作も確認できますし、コピペすれば簡単に真似できます。
jQueryのアコーディオンにはバリエーションが幾つかあるのですが、今回はその中で良く使われている基本パターン4種類を紹介します。
しかし、最近はアコーディオンを使わない方がユーザビリティの点で優れているという意見も制作者の間で見られます。
ちなみにデザインに定評のあるAppleの公式サイトでもアコーディオンはほぼ使われてないし、他の有名企業でもあまり見なくなりました。
ただし、下請けでWeb制作している場合、デザインカンプで指示された通りにコーディングしないといけませんので早速コードを紹介していきます。
矢印回転タイプのアコーディオン
まずは最もオーソドックスな矢印が回転するタイプのアコーディオンから紹介するね。
- このアコーディオンが使われているサイト:グノシー
アコーディオンの動きとコードの概要
下のCodePenでコードとアニメーション動作を確認してみて下さい。
See the Pen jQuery-Accordion-No.1-arrow by Satoru Shimizu (@sat-simizu) on CodePen.
HTML構造
アコーディオンのHTMLは、最低限「タイトル」と「内容」が入るタグだけ作れば、とりあえずは動作します。
下のHTML例では、「タイトル」と「内容」をdlタグで囲って、dt、dtタグを使っていますが、dlタグはliタグでも構いませんし、dt・ddタグはdivタグで代用してもアコーディオンは動作します。
<div class="accordion_wrapper">
<!-- アコーディオン1 -->
<dl class="accordion">
<dt class="accordion_header">タイトル</dt>
<dd class="accordion_content">
内容:ここに内容が入りますここに内容が入りますここに内容が入ります
</dd>
</dl>
<!-- アコーディオン2 -->
<dl class="accordion">
<dt class="accordion_header">タイトル</dt>
<dd class="accordion_content">
内容:ここに内容が入りますここに内容が入りますここに内容が入ります
</dd>
</dl>
</div>
CSS
アコーディオンのCSSのポイントは、jQueryを使って「タイトル」が入るタグにClass=”open“を脱着して、動きを付けている点 です。
ポイントを整理すると下のようになります。
- 通常の内容タグが隠れている(タイトル部分にClass=”open“が付いていない)状態では、内容部分はdisplay: none; で非表示
- タイトル部分右横の回転矢印は、疑似要素(::after)で作る
- タイトル部分右横の矢印の回転動作も、タイトル部分のClass=”open“の有無でつける
このアコーディオンのCSSは下のとおり。
/* アコーディオンリスト全体を囲うタグ */
.accordion_wrapper{
margin-top: 50px;
}
/* 個々のアコーディオンリストを囲うタグ */
.accordion{
font-size: 20px;
width: 80%;
margin: 0 auto;
}
/* アコーディオンのタイトル・内容共通 */
.accordion_header,
.accordion_content{
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
width: 100%;
font-weight: 400;
}
/* アコーディオンのタイトル */
.accordion_header {
cursor: pointer;
background-color: #000;
color: #fff;
position: relative;
}
.accordion_header:nth-child(n + 1) {
margin-top: 20px;
}
/* アコーディオンの内容 */
.accordion_content {
display: none;
background-color: #eee;
color: #333;
}
/* アコーディオン横の回転する矢印 */
.accordion_header::after{
position: absolute;
display: block;
content: '';
top: 35%;
right: 20px;
width: 10px;
height: 10px;
border-top: 1px solid #fff;
border-right: 1px solid #fff;
transform: rotate(135deg);
transform: rotate(135deg);
transition: all .3s ease-in-out;
}
/* アコーディオンが開いたとき */
.accordion_header.open::after {
transform: rotate(-45deg);
top: 45%;
}
jQuery
jQueryもコードも幾つか種類がありますが、ここで紹介するのはChatGPTが教えてくれたコードを改良したものです。
- click操作で動作スタート
- click操作に連動して slideToggleでアコーディオンを開閉
- click操作に連動して toggleClassでclass=”open“を脱着
- ()の中の数字はアニメーションのスペード(ミリ秒)
$(document).ready(function() {
// タイトルをクリックした場合
$('.accordion_header').click(function() {
// アコーディオン(内容)の開閉
$(this).next('.accordion_content').slideToggle(200);
// タイトルにopenクラスを付与または削除して矢印回転
$(this).toggleClass("open",200);
});
});
プラス・マイナス可変タイプのアコーディオン
これはアコーディオン開閉と連動して、プラスマークがマイナスに可変するタイプのアコーディオンです。
- このアコーディオンが使われているサイト:UZABASE
アコーディオンの動きとコードの概要
このアコーディオンのコードと動きは下のCodePenでご確認下さい。
See the Pen jQuery-Accordion-No.2-± by Satoru Shimizu (@sat-simizu) on CodePen.
HTML構造
この記事で紹介するアコーディオンのHTML構造はすべて共通ですので、説明は省略します。
CSS
このアコーディオンのCSSも作りは基本的に前のタイプと同じです。大きな違いは疑似要素を::afterに加えて、::beforeも使っていることです。
- アコーディオンの開閉と連動して形状変化するプラス・マイナスマークですが、この例ではプラスの縦棒を::beforeで、マイナスを::afterで作っています。
- アコーディオンのタイトル部分にclass=”open”付与されると、プラスの縦棒(::before)が90度回転し、同時にプラスの横棒(::after)が消える仕組みです。
/* アコーディオンリスト全体を囲うタグ */
.accordion_wrapper{
margin-top: 50px;
}
/* 個々のアコーディオンリストを囲うタグ */
.accordion{
font-size: 20px;
width: 80%;
margin: 0 auto;
}
/* アコーディオンのタイトル・内容共通 */
.accordion_header,
.accordion_content{
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
width: 100%;
font-weight: 400;
}
/* アコーディオンのタイトル */
.accordion_header {
cursor: pointer;
background-color: #000;
color: #fff;
position: relative;
}
/* アコーディオンの内容 */
.accordion_content {
display: none;
background-color: #eee;
color: #333;
}
.accordion_header:nth-child(n + 1) {
margin-top: 20px;
}
/* タイトル横のプラスマーク縦線 */
.accordion_header::before{
position: absolute;
content: '';
top: 50%;
right: 25px;
width: 20px;
height: 1px;
background-color:#fff;
transform: rotate(90deg);
transition: all .3s ease-in-out;
}
/* タイトル横のプラスマーク横線 */
.accordion_header::after{
position: absolute;
content: '';
top: 50%;
right: 25px;
width: 20px;
height: 1px;
background-color:#fff;
transition: all .3s ease-in-out;
}
/* アコーディオンが開いたとき縦線の変化 */
.accordion_header.open::before {
transform: rotate(180deg);
}
/* アコーディオンが開いたとき横線の変化 */
.accordion_header.open::after {
opacity:0;
}
jQuery
このアコーディオンのjQueryは最初に紹介した矢印アコーディオンと全く同じですので、説明は省略します。
一つ開けたら他が閉じるタイプのアコーディオン
アニメーション動作としては、アコーディオンを一つ開くと他が自動的に閉じてしまい、全部開きっぱなしできないタイプです。
アコーディオンの動きとコードの概要
下のCodePenでこのアコーディオンのコードとアニメーション動作を確認できます。
See the Pen Untitled by Satoru Shimizu (@sat-simizu) on CodePen.
HTML構造とCSS
プラス・マイナス型アコーディオンの基本形とまったく同じです。
jQuery
仕組みについては下のコードの中に書いてある説明(コメントアウト)をご覧下さい。
- click操作で、clickしていない他のアコーディオンタイトルからclass=”open“を剥奪(removeClass)
- 同時に他のアコーディオンタイトルをslideUpで閉じる
- click操作でタイトルからopenクラスを脱着してプラス・マイナスマークを可変(toggleClass)
- click操作でタイトルからopenクラスを脱着してアコーディオンを開閉(slideToggle)
$(document).ready(function() {
// タイトルをクリックした場合
$('.accordion_header').click(function() {
// クリックしていない他のタイトルにopenがついていたら剥奪
$(".accordion_header").not(this).removeClass("open");
// クリックしていない他のタイトルアコーディオンを閉じる
$(".accordion_header").not(this).next().slideUp(200);
// タイトルにopenクラスを付与または剥奪してプラスマイナス可変
$(this).toggleClass("open");
$(this).next().slideToggle(200);
});
});
最初は開いておくタイプのアコーディオン
アニメーション動作としては、最初の一つだけアコーディオンを開いておくタイプです。
アコーディオンの動きとコードの概要
このアコーディオンのアニメーション動作とコードは下のCodePenで確認できます。
See the Pen jQuery-Accordion-No.3-±-1st-open by Satoru Shimizu (@sat-simizu) on CodePen.
HTML構造とCSS
このアコーディオンのHTML構造とCSSはプラス・マイナスマーク型アコーディオンと同一です。
jQuery
最初のアコーディオンだけ開いておくという設定が加わるだけで、基本構造は同じですね。
コードのポイントを整理すると下のようになります。
- はじめのアコーディオンをdisplay:block
- はじめのアコーディオンにclass=”open“を付与(addClass)して開いておく
- アコーディオンタイトルをclickすると、アコーディオンを開閉(slideToggle)
- アコーディオンタイトルをclickすると、class=”open“を脱着してプラス・マイナスマークを可変(toggleClass)
$(document).ready(function() {
//はじめのアコーディオンにdisplay:block
$(".accordion:first-of-type .accordion_content").css("display", "block");
// はじめのアコーディオンを開いておく
$(".accordion:first-of-type .accordion_header").addClass("open");
// タイトルをクリックするとopenを付与または剥奪してアコーディオンを開閉
$(".accordion_header").on("click", function () {
$(this).next().slideToggle(200);
$(this).toggleClass("open", 200);
});
});
まとめ
以上、簡単ですが、代表的なjQueryアコーディオンを紹介しました。
今回は4種類紹介していますが、使用頻度が高そうなのはオーソドックスな1番目か2番目のタイプだと思います。