#コーディング
jQueryを使わないJavaScriptでのアコーディオンメニュー実装方法

Webサイトでよく使われるUIのひとつに「アコーディオンメニュー」があります。コンテンツを折りたたんで見せたいときや、FAQのように必要な部分だけ展開して表示したいときに非常に便利です。
かつてはjQueryを使って実装することが多かったですが、最近ではブラウザの標準APIが充実してきたため、わざわざjQueryを読み込まなくても純粋なJavaScriptで十分に対応できるようになりました。

この記事では、実際に動作するサンプルコードをもとに「アコーディオンメニューの仕組み」と「実装のポイント」を詳しく解説します。

今回作るアコーディオンの仕様

今回の完成イメージは下記となります。

  • 初期状態ではコンテンツが閉じている
  • ボタンをクリックするとスムーズに開閉する
  • 開いているときは「閉じる」、閉じているときは「もっと見る」とラベルが切り替わる
  • 閉じるときにはスクロール位置も自然に戻る

シンプルですが、ユーザー体験を考慮した動作になっています。

HTML構造

アコーディオンのHTMLはとてもシンプルです。

.mdAccordion__content … 折りたたまれるコンテンツ部分

.mdAccordion__btn … 開閉のトリガーとなるボタン

mdAccordion__btnText–off/on … 状態によって表示を切り替えるラベル

この構造を複数並べても、1つずつ独立して動作します。

SCSSでのスタイル定義

次にスタイルです。ここでは高さをアニメーションさせるために、max-height と transition を利用します。

ここで注目すべきは .mdAccordion__content に設定している max-height。
height だと自動調整が効かず、中身の高さが変わると対応できませんが、max-height を使えば開閉のアニメーションが滑らかになります。

JavaScriptでの実装

肝心の動きはJavaScriptで制御します。ポイントは以下の通りです。

  • ボタンをクリックしたら直前の要素(= コンテンツ部分)を取得
  • 開いているかどうかを判定
  • max-height を切り替えてアニメーション
  • 開いているときはスクロール位置を元に戻す

実際のコードは次のようになります。


 

実装の工夫ポイント

  • scrollHeight を利用
    要素の中身の高さを取得することで、どんなコンテンツ量でも対応可能です。
  • requestAnimationFrame を使ったアニメーション
    setTimeout よりも滑らかで、ブラウザに最適化された描画が行えます。
  • アニメーション中の多重クリック防止
    isAnimating フラグを使うことで、ユーザーが連打してもバグが起きません。

 

jQueryを使わないメリット

かつてはjQueryを使ってワンライナーでアコーディオンを実装していましたが、今は素のJavaScriptでも十分に短く書けます。

メリットとして下記3点が挙げられます。

  • ライブラリ不要 → ページの読み込みが軽くなる
  • モダンブラウザ対応 → 今の標準機能で快適に動く
  • 依存関係の削減 → メンテナンスが容易

特にパフォーマンスや表示速度を重視するサイトでは、無駄なライブラリを削ることは大きなメリットになります。

まとめ

今回は「jQueryを使わないアコーディオンメニュー」の作り方を解説しました。

もし既存のサイトでjQueryに依存している部分が多いなら少しずつ置き換えてみるのもおすすめです。
特にアコーディオンのような単純なUIであれば、純粋なJavaScriptの方が軽量で将来的にも安心です。

CONTACT

この度は当社へご興味お持ちいただき
ありがとうございます。
Webに関するお悩みございましたら、
是非一度お気軽にご相談ください。
平日10:00~19:00