記事内にはプロモーションが含まれています

【HTML】折りたたみ(アコーディオン)メニューの作り方

【HTML】折りたたみ(アコーディオン)メニューの作り方 HTML

Webサイトでよく見かける、クリックすると隠れていた文章がパッと表示される「折りたたみ機能(アコーディオンメニュー)」。

「Q&A(よくある質問)」や「スマートフォン向けのメニュー」などで頻繁に使われるこの機能ですが、実装するために難しいJavaScriptが必要だと思っていませんか?

実は、現在のHTML標準機能を使えば、HTMLタグを書くだけで簡単に折りたたみメニューを作ることができます

この記事では、HTMLの <details><summary> タグを使った基本的な実装方法から、CSSを使ったおしゃれなデザインカスタマイズ、そして最新のCSSテクニックを使った「ふわっと開く」アニメーションの実装まで、サンプルコード付きで徹底解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はプログラミングスクールを運営
  • モットーは「利他の精神」
💻 本記事の検証環境(2026年2月確認)
  • OS:Windows 11 / macOS Sequoia
  • IDE:Visual Studio / VS Code / IntelliJ IDEA
  • その他:Chrome DevTools / 各言語最新安定版

※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。

HTMLだけで折りたたみを実装する基本の「detailsタグ」

HTML5から導入され、現在ではすべての主要ブラウザで使えるようになったのが <details>(ディテールズ)タグと <summary>(サマリー)タグです。

これらを組み合わせるだけで、開閉機能を持ったボックスを作ることができます。

基本的な書き方と仕組み

使い方は非常にシンプルです。
全体を <details> で囲み、常に表示させておきたい見出し部分を <summary> に記述します。

<details>
    <summary>クリックして詳細を表示</summary>
    <p>ここに隠されていたコンテンツが表示されます。</p>
    <p>文章だけでなく、画像や表なども入れることができます。</p>
</details>

<details> タグが折りたたみ機能の本体であり、ブラウザはこれを認識すると自動的に開閉の仕組みを提供します。

その中にある <summary> タグで囲まれた部分が「開閉ボタン(見出し)」の役割を果たします。

それ以外のコンテンツ(上記の例では <p> タグ)は、初期状態では隠されており、見出しをクリックすることで表示されます。

JavaScriptを一切書かずにここまで実装できるのが、このタグの最大のメリットです。

最初から開いた状態にする「open属性」

ページを読み込んだ時点で、最初から中身を開いておきたい場合は、<details> タグに open 属性を付与します。

<details open>
    <summary>最初から開いているメニュー</summary>
    <p>この文章は最初から表示されています。</p>
</details>

open 属性がついている <details> 要素は、ページロード時に展開された状態で表示されます。

ユーザーが手動で閉じたり開いたりすると、ブラウザが自動的にこの open 属性を付け外しして状態を管理してくれます。

CSSで矢印アイコンやデザインをカスタマイズする

デフォルトの状態では、<summary> の左側に黒い三角形(▶)が表示されますが、サイトのデザインに合わせてこれを変更したり、消したりしたい場合も多いでしょう。

CSSを使えば、これらの見た目を自由にカスタマイズ可能です。

デフォルトの矢印(マーカー)を消す方法

ブラウザが標準で表示する矢印は list-style プロパティで制御できます。

/* summaryタグのデフォルト矢印を消す */
summary {
    list-style: none; /* 多くのブラウザでこれで消える */
}

/* ChromeやSafariなどの一部ブラウザ向け(念のため) */
summary::-webkit-details-marker {
    display: none;
}

summary 要素には、箇条書きリストと同じようなマーカー(矢印)が設定されています。

list-style: none; を指定することで、このマーカーを非表示にできます。

これにより、ただのテキストだけが表示されるようになるため、後は自分で好きなアイコンを背景画像や擬似要素で追加できるようになります。

オリジナルのアイコンを付けて動きをつける

擬似要素(::after)を使って、プラス(+)マイナス(-)のアイコンや、回転する矢印を作ってみましょう。

<details class="custom-accordion">
    <summary>おしゃれなアコーディオン</summary>
    <div class="content">
        <p>中身のテキストです。</p>
    </div>
</details>

<style>
.custom-accordion {
    border: 1px solid #ccc;
    border-radius: 5px;
    padding: 10px;
}

summary {
    list-style: none;
    cursor: pointer;
    font-weight: bold;
    position: relative;
    padding-right: 30px; /* アイコンのスペース */
}

/* 独自の矢印アイコンを作成 */
summary::after {
    content: "▼";
    position: absolute;
    right: 0;
    top: 0;
    transition: transform 0.3s; /* 回転アニメーション */
}

/* 開いている状態(detailsにopen属性がある時)のデザイン */
details[open] summary::after {
    transform: rotate(180deg); /* 180度回転 */
}
</style>

details[open] というセレクタを使うと、「開いている状態」の時だけにCSSを適用できます。

ここでは、通常時は下向きの矢印(▼)を表示し、開いている時(open属性がある時)は transform: rotate(180deg); で矢印を上向きに回転させています。

transition を設定しているため、クリックするとクルッと回るアニメーションになります。

最新CSSで「ふわっと」開閉するアニメーションを実装

これまで、<details> タグの開閉をCSSだけでアニメーションさせるのは非常に困難でした(高さが auto だと transition が効かないため)。

しかし、近年のWeb標準の進化により、CSSだけでスムーズな開閉アニメーションが可能になっています。

interpolate-size または grid を使ったアニメーション

ここでは、比較的対応ブラウザが多い grid を使ったテクニックを紹介します。

<details class="animated-details">
    <summary>アニメーション付きメニュー</summary>
    <div class="details-inner">
        <div class="inner-content">
            <p>ふんわりと開閉するコンテンツです。<br>
            CSS Gridを使うことで、高さが不明でもアニメーションできます。</p>
        </div>
    </div>
</details>

<style>
.animated-details .details-inner {
    display: grid;
    grid-template-rows: 0fr; /* 高さを0にする */
    transition: grid-template-rows 0.3s ease-out;
    overflow: hidden;
}

.animated-details .inner-content {
    min-height: 0;
}

/* 開いている時は高さを1fr(中身の分だけ)にする */
.animated-details[open] .details-inner {
    grid-template-rows: 1fr;
}
</style>

CSS Gridの grid-template-rows プロパティはアニメーション可能です。

通常時は 0fr(高さゼロ)にしておき、open 属性がついた時に 1fr(中身の高さ)に変化させることで、高さがわからないコンテンツでもヌルっと開くアニメーションを実現しています。

JavaScriptを使わずにリッチな動きを作れるため、非常におすすめの手法です。

【応用】name属性でアコーディオンの連動(排他制御)を行う

「Aを開いたら、開いていたBを勝手に閉じる」という、いわゆるアコーディオンメニューの動作。
以前はJavaScriptが必須でしたが、現在は name 属性 を使うだけで実装可能です。

1つしか開けないアコーディオンの実装

<details name="faq-group">
    <summary>質問1:料金はいくらですか?</summary>
    <p>基本プランは月額980円です。</p>
</details>

<details name="faq-group">
    <summary>質問2:解約はいつでもできますか?</summary>
    <p>はい、マイページからいつでも解約可能です。</p>
</details>

<details name="faq-group">
    <summary>質問3:サポートはありますか?</summary>
    <p>24時間体制でメールサポートを受け付けています。</p>
</details>

複数の <details> タグに、同じ値の name 属性(ここでは faq-group)を付与しています。

これだけでブラウザは「これらはグループである」と認識し、グループ内のどれか一つを開くと、自動的に他の項目を閉じるようになります。

Q&Aページやスマホのドロワーメニューなどで非常に便利な機能です。

HTML/CSSのスキルを活かして年収を上げる方法

以上、HTML/CSSでの折りたたみ(アコーディオン)の作り方について解説してきました。

なお、HTMLやCSSのスキルがある場合には、「副業で稼いで年収を上げる」といったことが可能です。
HTML/CSSのスキルを持つ人は多いものの、その分案件数も多く、副業エージェントやフリーランスエージェントを利用することで予想外の高単価案件が見つかることもあります。
エージェントサービスは、登録も利用もすべて完全無料なので、どんな求人や案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
エンジニアのキャリア・スキルアップ相談窓口
当ブログの読者に選ばれている、実績豊富な転職エージェントを厳選しました。
【転職】年収・環境を改善したい
年収アップにこだわりたい方 (平均アップ額138万円の実績)
未経験・経験者問わず幅広く探したい方
業界に精通した担当者に相談したい方
ゲーム業界への転職を志望する方
エンジニア未経験からキャリアを築く方
【独立】フリーランスとして稼ぎたい
国内最大級のフリーランス案件数から比較したい方
週1〜3日など柔軟な働き方を希望する方
【学習】スキルに不安のある方向け(格安スクール「デイトラ」)