アコーディオンメニューは、よくある質問ページ(Q&A)などに良くありますね。
実務でも使う機会は非常に多いので、この記事をブクマしていつでも見返せるようにしておくのをおすすめします。
また、アコーディオンメニューといっても色々種類があるので、今回はよく使うタイプをご紹介していきたいと思います。
(有料になっていたらすいません🙇♂️)
アコーディオンメニューとは?
アコーディオンメニューは、クリックやタップによって開閉する形式のメニューで、動作がアコーディオンの蛇腹部分に似ていることから名付けられています。
このメニューは、限られたスペースに複数のメニュー項目をコンパクトに収納できるため、特にスマートフォンなどの小さな画面やFAQでの利用に適しています。
動作
アコーディオンメニューは、通常、複数の項目で構成されています。各項目には、タイトルとコンテンツが関連付けられています。
- 初期状態では、コンテンツは非表示になっています。
- ユーザーがタイトルをクリックまたはタップすると、対応するコンテンツが表示されます。
- 同じタイトルを再度クリックまたはタップすると、コンテンツが非表示に戻ります。
アコーディオンメニューのメリット
- インタラクティブな体験: ユーザーが自分の興味に応じて情報を展開できるため、よりインタラクティブなウェブサイト体験を提供します。
- スペースの効率的な利用: アコーディオンメニューは必要な情報を隠した状態で保持できるため、画面がすっきりとし、ユーザーが必要な情報にアクセスしやすくなります。
- 情報の整理: 多くのメニュー項目を一つのセクションにまとめることで、ユーザーが探している情報を見つけやすくします。
アコーディオンメニューのデメリット
- クリックの手間: ユーザーはメニューをクリックまたはタップしなければ詳細を確認できないため、特に多くの情報を求めるユーザーには負担になる場合があります。
- コンテンツの見逃し: ユーザーがアコーディオンメニューが開閉可能であることに気付かないリスクがあります。これを防ぐためには、「+」や「▼」などの視覚的なマークを付けることが推奨されます。
jQueryで矢印付きアコーディオンメニューを作る方法
まずは、jQueryを使用するので、jQuery本体を読み込みましょう。
jQueryを使ったことがない人は、jQueryの使い方を参照下さい。
【初心者向け】jQueryとは?CDNを使った本体の読み込み方も分かりやすく解説
続きを見る
基本となるアコーディオンメニューのサンプル(デモ)
それでは、最初に基本となるアコーディオンメニューを見てみます。
この基本形では、全てのメニューを開く事が出来ます。
See the Pen
アコーディオンメニュー(基本形) by junpei (@junpei-sugiyama)
on CodePen.
HTMLとCSSは、この記事で出てくる全てのアコーディオンメニュー共通となっています(矢印のCSSは別です)。
タイトルの.accordion-title
をクリックすると、.accordion-content
が開きます。
これからコードの解説をしていきますが、重要なポイント以外は省略している場合があるので、全部のコードを見たい場合はサンプル(デモ)の左上にある『HTML / CSS / JS』をクリックしてください。
CSSのコード
CSSの書き方ですが、基本的な箇所は省きますが注意するのはこちらです。
.accordion-content {
display: none;
}
これはコンテンツ部分で、アコーディオンメニューを開く前は非表示にしていて、表示する時はjQueryを使って表示させます。
jQueryのコード
jQueryの書き方はこちら。
$(function () {
$(".js-accordion-title").on("click", function () {
$(this).next().slideToggle(300);
$(this).toggleClass("open", 300);
});
});
ここで使われているイベントやメソッドについては、以下になります。
on(click)
"クリックしたら処理を行う"というクリックイベント
next()
指定した要素の次の兄弟要素を対象にする
slideToggle()
slideUp()とslideDown()を併せ持つメソッド
要素が非表示の場合はslideDown()を実行
要素が表示されてる場合はslideUp()を実行
slideDown()
要素を上から下へスライドさせながら表示させる
slideUp()
要素を下から上へスライドさせながら非表示させる
toggleClass()
指定したclassを付け外し出来る
以上です(slideDown()
とslideUp()
は、slideToggle()
の説明のため記載)。
つまり、このアコーディオンメニューはこのようになります。
$(function () {
// タイトルをクリックすると
$(".js-accordion-title").on("click", function () {
// クリックした次の要素(コンテンツ)を開閉
$(this).next().slideToggle(300);
// タイトルにopenクラスを付け外しして矢印の向きを変更
$(this).toggleClass("open", 300);
});
});
先ほど、コンテンツを表示する時はjQueryを使って表示させますと書きましたが、これは$(this).next().slideToggle(300);
の所になりますね。
これにより、CSSでdisplay: none;
だったのが、display: block;
に変わります(検証モードで見ると分かります)。
また、コードの中に300という数字がありますが、これはアニメーションの時間になります。
単位はミリ秒なので、300の場合は0.3秒となります。
また、数字の他に'slow'、'normal'、'fast'と指定する事も出来るので、色々試してみて下さい。
矢印のCSSアニメーションのコード
矢印のアニメーションですが、CSSの書き方はこちらになります。
.accordion-title {
position: relative;
}
.accordion-title::after {
border-right: solid 2px #fff; // 矢印の色
border-top: solid 2px #fff; // 矢印の色
content: "";
display: block;
height: 8px;
position: absolute;
right: 25px;
top: 38%;
transform: rotate(135deg); // 最初の矢印は下向き
transition: transform .3s ease-in-out, top .3s ease-in-out;
width: 8px;
}
.accordion-title.open::after {
top: 45%; // 矢印の位置を少し変える
transform: rotate(-45deg); // 矢印を上向きに変える
}
最後の.open
は、jQueryのtoggleClass()
で付けたclassで、タイトルがクリックされたら付与されます。
そして、.open
が付いたら矢印の向きと位置を変えます。
位置は少し調整しないと中央からズレて見えるので、ここで調整しています。
注意ポイント
【CSS】transitionにプロパティを複数指定する書き方
続きを見る
アコーディオンメニュー(コンテンツを1つ開けると他は閉じる)
先ほどは全てのメニューを開くことが出来ましたが、今度は1つしか開けないようにします。
See the Pen
アコーディオンメニュー(1つ開くと他は閉じる) by junpei (@junpei-sugiyama)
on CodePen.
+-のアニメーション
+-のアニメーションですが、CSSの書き方はこちらになります。
.accordion-title {
position: relative;
}
/* 縦線 */
.accordion-title::before {
background: #fff; /* 線の色 */
content: "";
height: 2px; /* 線の太さ */
position: absolute;
right: 25px;
top: 50%; /* 線の位置を縦中央に */
transform: rotate(90deg); /* 線を縦に */
transition: transform .3s ease-in-out;
width: 15px; /* 線の幅 */
}
/* 横線 */
.accordion-title::after {
background: #fff; /* 線の色 */
content: "";
height: 2px; /* 線の太さ */
position: absolute;
right: 25px;
top: 50%; /* 線の位置を縦中央に */
transition: opacity .3s ease-in-out;
width: 15px; /* 線の幅 */
}
/* 縦線(クリック後) */
.accordion-title.open::before {
transform: rotate(180deg);
}
/* 横線(クリック後) */
.accordion-title.open::after {
opacity: 0;
}
最後の.open
で縦線は横線になり、横線はopacity: 0;
なので、透明になり見えなくなります。
これにより、縦線が横にパタッと倒れるような動きになります。
サンプル(デモ)はこちら。
See the Pen
Untitled by junpei (@junpei-sugiyama)
on CodePen.
jQueryのコード
先ほどと、jQueryのコードが少し変わっています。
$(function () {
$(".js-accordion-title").on("click", function () {
$(".js-accordion-title").not(this).removeClass("open");
$(".js-accordion-title").not(this).next().slideUp(300);
$(this).toggleClass("open");
$(this).next().slideToggle(300);
});
});
先ほどなかったメソッドについては、以下になります。
not()
()内に除外したい要素を指定
removeClass()
()内に外したいclass名を指定
ここではnot()
で除外したい要素はthis
なので、クリックしたタイトルの事になります。
また、今回は矢印ではなく+-にしてあります。
実務では矢印と+-のどちらかである事が大半ですが、個人的には+-の方が多い印象です。
新しく出てきたjQueryのメソッドの説明を加えると、このようになります。
$(function () {
// タイトルをクリックすると
$(".js-accordion-title").on("click", function () {
// クリックしたタイトル以外のopenクラスを外す(-から+にする)
$(".js-accordion-title").not(this).removeClass("open");
// クリックしたタイトル以外のコンテンツを閉じる
$(".js-accordion-title").not(this).next().slideUp(300);
// クリックしたタイトルにopenクラスを付け外しして+と-を切り替える
$(this).toggleClass("open");
// クリックしたタイトルの次の要素(コンテンツ)を開閉
$(this).next().slideToggle(300);
});
});
先ほどはタイトルをクリックしたらコンテンツが開きっぱなしでしたが、今回はクリックした箇所以外のコンテンツを.slideUp()
で閉じ、.removeClass("open")
で-を+と閉じた状態にしています。
アコーディオンメニュー(最初のコンテンツは開いておく)
ここまでは全て閉じている状態でしたが、今回は最初のコンテンツだけ開いた状態にします。
『全て開くことが可能』と『1つ開けると他は閉じる』の、2パターンを見てみます(右下のRerunをクリックすると初期状態に戻ります)。
全て開くことが可能
See the Pen
アコーディオンメニュー(最初のコンテンツは開く) by junpei (@junpei-sugiyama)
on CodePen.
jQueryのコード
jQueryの書き方はこちら。
$(function () {
$(".accordion-item:first-of-type .accordion-content").css("display", "block");
$(".accordion-item:first-of-type .js-accordion-title").addClass("open");
$(".js-accordion-title").on("click", function () {
$(this).next().slideToggle(300);
$(this).toggleClass("open", 300);
});
});
これは、2行目と3行目のコードが、1番目のアコーディオンメニューのコードに追加された形です。
今回新しく登場したメソッドはこちらです。
css()
.css( プロパティ, 値 )という形でcssプロパティを指定
addClass()
()内に付与したいclass名を指定
これを踏まえると、以下のような意味になります。
$(function () {
// 最初のコンテンツは表示
$(".accordion-item:first-of-type .accordion-content").css("display", "block");
// 最初の矢印は開いた時の状態に
$(".accordion-item:first-of-type .js-accordion-title").addClass("open");
// タイトルをクリックすると
$(".js-accordion-title").on("click", function () {
// クリックした次の要素を開閉
$(this).next().slideToggle(300);
// タイトルにopenクラスを付け外しして矢印の向きを変更
$(this).toggleClass("open", 300);
});
});
今回追加された2行のコードが最初のコンテンツを表示させて、最初のコンテンツの矢印を開いた時の状態にするという事ですね。
1つ開くと他は閉じる
これも先ほどと同じ要領なので、特に説明不要かと思います。
See the Pen
アコーディオンメニュー(最初のコンテンツは開く:1つ開くと他は閉じる) by junpei (@junpei-sugiyama)
on CodePen.
2つ目のアコーディオンメニューのjQueryに、先ほど追加した2行のコードを追加するだけです。
まとめ
今回は、jQueryで矢印付きアコーディオンメニューを作る方法を解説しました。
アコーディオンメニューは実務でも非常によくある実装なので、ブクマしていつでもコピペ出来るようにしておくと便利かと思います。
以上になります。