Webデザイン

【PR】を含みます。

【HTML・CSS】アコーディオンメニューをHTMLとCSSのみで実装する方法

アコーディオンメニュー

アコーディオンメニュー(折りたたみメニュー)をJavaScriptを使用せずに、HTMLとCSSのみで実装する方法を紹介します。

アコーディオンをHTMLのみで実装する方法は以下の記事で紹介してます。

あわせて読む
HTMLのみでアコーディオンを実装する方法
【CSS不要】HTMLのみでアコーディオン(開閉ボタン)を実装する方法

もくじ【サンプル】HTMLのみでアコーディオンメニューを実装【実装コード】HTMLのみでアコーディオンメニューを実装detailsタグとsummaryタグにCSS当ててデザインを調整【サンプル】CSS ...

アコーディオンをjQueryで実装する方法は以下の記事で紹介してます。

あわせて読む
jQuery アコーディオンメニューを作成する方法
【jQuery】アコーディオン(開閉ボタン)を実装する方法

もくじjQueryを使用したアコーディオンサンプルjQueryを使用したアコーディオンコピペ用コード使用方法 Q&A動かないのですが、どうすれば良いですか?アコーディオンの追加方法は?レスポンシブに対 ...

アコーディオンをJavaScriptで実装する方法は以下の記事で紹介してます。

あわせて読む
コピペで使える!アコーディオンメニュー
【JavaScript】jQuery未使用でアコーディオン(開閉ボタン)を実装する方法

もくじJavaScriptを使用したアコーディオンサンプルJavaScriptを使用したアコーディオンコピペ用コード使用方法 Q&Aアコーディオンの追加方法は?一つ目のアコーディオンを開いた状態にする ...

【単体用】アコーディオン(折りたたみメニュー)

sample

【単体用】HTML・CSS

HTML
Copy
  1. <div class="menu-box">
  2.   <input id="check-box" type="checkbox">
  3.   <label class="menu-label-title" for="check-box">
  4.     <span class="menu-title">Q.クリック</span>
  5.     <span></span>
  6.     <span></span>
  7.   </label><!-- .menu-label-title -->
  8.   <div class="menu-text">A.テキスト</div>
  9. </div><!-- .menu-box -->
CSS
Copy
  1. .menu-box {
  2.   border: solid 1px #c0c0c0;
  3. }
  4. .menu-box .menu-label-title {
  5.   display: block;
  6.   padding: 20px 25px;
  7.   cursor: pointer;
  8.   position: relative;
  9. }
  10. .menu-box .menu-title {
  11.   display: block;
  12.   padding-right: 50px;
  13. }
  14. .menu-box .menu-label-title span:nth-child(2),
  15. .menu-box .menu-label-title span:nth-child(3) {
  16.   display: block;
  17.   width: 16px;
  18.   border-bottom: solid 1px #c0c0c0;
  19.   position: absolute;
  20.   top: 50%;
  21.   right: 25px;
  22.   transform: translateY(-50%);
  23.   -webkit-transform: translateY(-50%);
  24.   -ms-transform: translateY(-50%);
  25. }
  26. .menu-box .menu-label-title span:nth-child(2) {
  27.   transform: rotate(45deg);
  28.   right: 36px;
  29. }
  30. .menu-box .menu-label-title span:nth-child(3) {
  31.   transform: rotate(-45deg);
  32. }
  33. .menu-box .menu-text {
  34.   display: none;
  35.   padding: 20px 0;
  36.   margin: 0 25px;
  37.   border-top: dotted 1px #c0c0c0;
  38. }
  39. /* 折り畳みメニューを追加する場合 */
  40. .menu-box #check-box {
  41.   display: none;
  42. }
  43. .menu-box #check-box:checked ~ .menu-text {
  44.   display: block;
  45. }
  46. .menu-box #check-box:checked ~ .menu-label-title span:nth-child(2) {
  47.   transform: rotate(-45deg);
  48. }
  49. .menu-box #check-box:checked ~ .menu-label-title span:nth-child(3) {
  50.   transform: rotate(45deg);
  51. }
  52. /* ここまで */

【単体用】アコーディオン(折りたたみメニュー)を複数利用する場合

sample
HTML
Copy
  1. <div class="menu-box">
  2.   <input id="check-box" type="checkbox">
  3.   <label class="menu-label-title" for="check-box">
  4.     <span class="menu-title">Q.クリック</span>
  5.     <span></span>
  6.     <span></span>
  7.   </label><!-- .menu-label-title -->
  8.   <div class="menu-text">A.テキスト</div>
  9. </div><!-- .menu-box -->

上記のコードを必要な数任意の場所に貼り付け。

貼り付けた2つ目以降のid="check-box"とfor="check-box"のcheck-boxを固有値に変更する。

sampleの例だと下記のようになります。

HTML
Copy
  1. <div class="menu-box">
  2.   <input id="check-box" type="checkbox">
  3.   <label class="menu-label-title" for="check-box">
  4.     <span class="menu-title">Q.クリック</span>
  5.     <span></span>
  6.     <span></span>
  7.   </label><!-- .menu-label-title -->
  8.   <div class="menu-text">A.テキスト</div>
  9. </div><!-- .menu-box -->
  10. <div class="menu-box">
  11.   <input id="check-box2" type="checkbox">
  12.   <label class="menu-label-title" for="check-box2">
  13.     <span class="menu-title">Q.クリック</span>
  14.     <span></span>
  15.     <span></span>
  16.   </label><!-- .menu-label-title -->
  17.   <div class="menu-text">A.テキスト</div>
  18. </div><!-- .menu-box -->

最後に、CSSの46行目「/* 折り畳みメニューを追加する場合 */」から
62行目「/* ここまで */」のセレクタを変更。

今回のサンプルの例だと下記のようになります。(1~45行目は省略)

CSS
Copy
  1. /* 折り畳みメニューを追加する場合 */
  2. .menu-box #check-box,
  3. .menu-box #check-box2 {
  4.   display: none;
  5. }
  6. .menu-box #check-box:checked ~ .menu-text,
  7. .menu-box #check-box2:checked ~ .menu-text {
  8.   display: block;
  9. }
  10. .menu-box #check-box:checked ~ .menu-label-title span:nth-child(2),
  11. .menu-box #check-box2:checked ~ .menu-label-title span:nth-child(2) {
  12.   transform: rotate(-45deg);
  13. }
  14. .menu-box #check-box:checked ~ .menu-label-title span:nth-child(3),
  15. .menu-box #check-box2:checked ~ .menu-label-title span:nth-child(3) {
  16.   transform: rotate(45deg);
  17. }
  18. /* ここまで */

【2段用】アコーディオン(折りたたみメニュー)

sample

【2段用】HTML・CSS

HTML
Copy
  1. <div class="double-menu-box">
  2.   <div class="menus-box">
  3.     <input id="double-check-box" type="checkbox">
  4.     <label class="menu-label-title" for="double-check-box">
  5.       <span class="menu-title">Q.クリック</span>
  6.       <span></span>
  7.       <span></span>
  8.     </label><!-- .menu-label-title -->
  9.     <div class="menu-text">A.テキスト</div>
  10.   </div><!-- .menus-box -->
  11.   <div class="menus-box">
  12.     <input id="double-check-box2" type="checkbox">
  13.     <label class="menu-label-title" for="double-check-box2">
  14.       <span class="menu-title">Q.クリック</span>
  15.       <span></span>
  16.       <span></span>
  17.     </label><!-- .menu-label-title -->
  18.     <div class="menu-text">A.テキスト</div>
  19.   </div><!-- .menus-box -->
  20. </div><!-- .double-menu-box -->
CSS
Copy
  1. .double-menu-box {
  2.   border: solid 1px #c0c0c0;
  3. }
  4. .double-menu-box .menus-box {
  5.   border-top: dashed 1px #c0c0c0;
  6. }
  7. .double-menu-box .menus-box:first-child {
  8.   border-top: none;
  9. }
  10. .double-menu-box .menu-label-title {
  11.   display: block;
  12.   padding: 20px 25px;
  13.   cursor: pointer;
  14.   position: relative;
  15. }
  16. .double-menu-box .menu-title {
  17.   display: block;
  18.   padding-right: 50px;
  19. }
  20. .double-menu-box .menu-label-title span:nth-child(2),
  21. .double-menu-box .menu-label-title span:nth-child(3) {
  22.   display: block;
  23.   width: 16px;
  24.   border-bottom: solid 1px #c0c0c0;
  25.   position: absolute;
  26.   top: 50%;
  27.   right: 25px;
  28.   transform: translateY(-50%);
  29.   -webkit-transform: translateY(-50%);
  30.   -ms-transform: translateY(-50%);
  31. }
  32. .double-menu-box .menu-label-title span:nth-child(2) {
  33.   transform: rotate(45deg);
  34.   right: 36px;
  35. }
  36. .double-menu-box .menu-label-title span:nth-child(3) {
  37.   transform: rotate(-45deg);
  38. }
  39. .double-menu-box .menu-text {
  40.   display: none;
  41.   padding: 20px 0;
  42.   margin: 0 25px;
  43.   border-top: dotted 1px #c0c0c0;
  44. }
  45. .double-menu-box .menus-box #double-check-box,
  46. .double-menu-box .menus-box #double-check-box2 {
  47.   display: none;
  48. }
  49. .double-menu-box .menus-box #double-check-box:checked ~ .menu-text,
  50. .double-menu-box .menus-box #double-check-box2:checked ~ .menu-text {
  51.   display: block;
  52. }
  53. .double-menu-box .menus-box #double-check-box:checked ~ .menu-label-title span:nth-child(2),
  54. .double-menu-box .menus-box #double-check-box2:checked ~ .menu-label-title span:nth-child(2) {
  55.   transform: rotate(-45deg);
  56. }
  57. .double-menu-box .menus-box #double-check-box:checked ~ .menu-label-title span:nth-child(3),
  58. .double-menu-box .menus-box #double-check-box2:checked ~ .menu-label-title span:nth-child(3) {
  59.   transform: rotate(45deg);
  60. }

【3段以上用】アコーディオン(折りたたみメニュー)

sample

【3段以上用】HTML・CSS

HTML
Copy
  1. <div class="triple-menu-box">
  2.   <div class="menus-box">
  3.     <input id="triple-check-box" type="checkbox">
  4.     <label class="menu-label-title" for="triple-check-box">
  5.       <span class="menu-title">Q.クリック</span>
  6.       <span></span>
  7.       <span></span>
  8.     </label><!-- .menu-label-title -->
  9.     <div class="menu-text">A.テキスト</div>
  10.   </div><!-- .menus-box -->
  11.   <div class="menus-box">
  12.     <input id="triple-check-box2" type="checkbox">
  13.     <label class="menu-label-title" for="triple-check-box2">
  14.       <span class="menu-title">Q.クリック</span>
  15.       <span></span>
  16.       <span></span>
  17.     </label><!-- .menu-label-title -->
  18.     <div class="menu-text">A.テキスト</div>
  19.   </div><!-- .menus-box -->
  20.   <div class="menus-box">
  21.     <input id="triple-check-box3" type="checkbox">
  22.     <label class="menu-label-title" for="triple-check-box3">
  23.       <span class="menu-title">Q.クリック</span>
  24.       <span></span>
  25.       <span></span>
  26.     </label><!-- .menu-label-title -->
  27.     <div class="menu-text">A.テキスト</div>
  28.   </div><!-- .menus-box -->
  29.   <!-- 折り畳みメニューを追加する場合はこの下に追加 -->
  30. </div><!-- .triple-menu-box -->
CSS
Copy
  1. .triple-menu-box {
  2.   border: solid 1px #c0c0c0;
  3. }
  4. .triple-menu-box .menus-box {
  5.   border-top: dashed 1px #c0c0c0;
  6. }
  7. .triple-menu-box .menus-box:first-child {
  8.   border-top: none;
  9. }
  10. .triple-menu-box .menu-label-title {
  11.   display: block;
  12.   padding: 20px 25px;
  13.   cursor: pointer;
  14.   position: relative;
  15. }
  16. .triple-menu-box .menu-title {
  17.   display: block;
  18.   padding-right: 50px;
  19. }
  20. .triple-menu-box .menu-label-title span:nth-child(2),
  21. .triple-menu-box .menu-label-title span:nth-child(3) {
  22.   display: block;
  23.   width: 16px;
  24.   border-bottom: solid 1px #c0c0c0;
  25.   position: absolute;
  26.   top: 50%;
  27.   right: 25px;
  28.   transform: translateY(-50%);
  29.   -webkit-transform: translateY(-50%);
  30.   -ms-transform: translateY(-50%);
  31. }
  32. .triple-menu-box .menu-label-title span:nth-child(2) {
  33.   transform: rotate(45deg);
  34.   right: 36px;
  35. }
  36. .triple-menu-box .menu-label-title span:nth-child(3) {
  37.   transform: rotate(-45deg);
  38. }
  39. .triple-menu-box .menu-text {
  40.   display: none;
  41.   padding: 20px 0;
  42.   margin: 0 25px;
  43.   border-top: dotted 1px #c0c0c0;
  44. }
  45. /* 折り畳みメニューを追加する場合 */
  46. .triple-menu-box .menus-box #triple-check-box,
  47. .triple-menu-box .menus-box #triple-check-box2,
  48. .triple-menu-box .menus-box #triple-check-box3 {
  49.   display: none;
  50. }
  51. .triple-menu-box .menus-box #triple-check-box:checked ~ .menu-text,
  52. .triple-menu-box .menus-box #triple-check-box2:checked ~ .menu-text,
  53. .triple-menu-box .menus-box #triple-check-box3:checked ~ .menu-text {
  54.   display: block;
  55. }
  56. .triple-menu-box .menus-box #triple-check-box:checked ~ .menu-label-title span:nth-child(2),
  57. .triple-menu-box .menus-box #triple-check-box2:checked ~ .menu-label-title span:nth-child(2),
  58. .triple-menu-box .menus-box #triple-check-box3:checked ~ .menu-label-title span:nth-child(2) {
  59.   transform: rotate(-45deg);
  60. }
  61. .triple-menu-box .menus-box #triple-check-box:checked ~ .menu-label-title span:nth-child(3),
  62. .triple-menu-box .menus-box #triple-check-box2:checked ~ .menu-label-title span:nth-child(3),
  63. .triple-menu-box .menus-box #triple-check-box3:checked ~ .menu-label-title span:nth-child(3) {
  64.   transform: rotate(45deg);
  65. }
  66. /* ここまで */

【3段以上用】アコーディオン(折りたたみメニュー)を4段以上利用する場合

sample
HTML
Copy
  1. <div class="menus-box">
  2.   <input id="triple-check-box" type="checkbox">
  3.   <label class="menu-label-title" for="triple-check-box">
  4.     <span class="menu-title">Q.クリック</span>
  5.     <span></span>
  6.     <span></span>
  7.   </label><!-- .menu-label-title -->
  8.   <div class="menu-text">A.テキスト</div>
  9. </div><!-- .menus-box -->

上記のコードを必要な数29行目の「 折り畳みメニューを追加する場合はこの下に追加 」の直下に貼り付け。
貼り付けた部分のid="triple-check-box"とfor="triple-check-box"のtriple-check-boxを固有値に変更する。

sampleの例だと下記のようになります。

HTML
Copy
  1. <div class="triple-menu-box">
  2.   <div class="menus-box">
  3.     <input id="triple-check-box" type="checkbox">
  4.     <label class="menu-label-title" for="triple-check-box">
  5.       <span class="menu-title">Q.クリック</span>
  6.       <span></span>
  7.       <span></span>
  8.     </label><!-- .menu-label-title -->
  9.     <div class="menu-text">A.テキスト</div>
  10.   </div><!-- .menus-box -->
  11.   <div class="menus-box">
  12.     <input id="triple-check-box2" type="checkbox">
  13.     <label class="menu-label-title" for="triple-check-box2">
  14.       <span class="menu-title">Q.クリック</span>
  15.       <span></span>
  16.       <span></span>
  17.     </label><!-- .menu-label-title -->
  18.     <div class="menu-text">A.テキスト</div>
  19.   </div><!-- .menus-box -->
  20.   <div class="menus-box">
  21.     <input id="triple-check-box3" type="checkbox">
  22.     <label class="menu-label-title" for="triple-check-box3">
  23.       <span class="menu-title">Q.クリック</span>
  24.       <span></span>
  25.       <span></span>
  26.     </label><!-- .menu-label-title -->
  27.     <div class="menu-text">A.テキスト</div>
  28.   </div><!-- .menus-box -->
  29.   <!-- 折り畳みメニューを追加する場合はこの下に追加 -->
  30.   <div class="menus-box">
  31.     <input id="triple-check-box4" type="checkbox">
  32.     <label class="menu-label-title" for="triple-check-box4">
  33.       <span class="menu-title">Q.クリック</span>
  34.       <span></span>
  35.       <span></span>
  36.     </label><!-- .menu-label-title -->
  37.     <div class="menu-text">A.テキスト</div>
  38.   </div><!-- .menus-box -->
  39. </div><!-- .triple-menu-box -->

最後に、CSSの54行目「/* 折り畳みメニューを追加する場合 */」から
78行目「/* ここまで */」のセレクタを変更。

今回のサンプルの例だと下記のようになります。(1~53行目は省略)

CSS
Copy
  1. /* 折り畳みメニューを追加する場合 */
  2. .triple-menu-box .menus-box #triple-check-box,
  3. .triple-menu-box .menus-box #triple-check-box2,
  4. .triple-menu-box .menus-box #triple-check-box3,
  5. .triple-menu-box .menus-box #triple-check-box4 {
  6.   display: none;
  7. }
  8. .triple-menu-box .menus-box #triple-check-box:checked ~ .menu-text,
  9. .triple-menu-box .menus-box #triple-check-box2:checked ~ .menu-text,
  10. .triple-menu-box .menus-box #triple-check-box3:checked ~ .menu-text,
  11. .triple-menu-box .menus-box #triple-check-box4:checked ~ .menu-text {
  12.   display: block;
  13. }
  14. .triple-menu-box .menus-box #triple-check-box:checked ~ .menu-label-title span:nth-child(2),
  15. .triple-menu-box .menus-box #triple-check-box2:checked ~ .menu-label-title span:nth-child(2),
  16. .triple-menu-box .menus-box #triple-check-box3:checked ~ .menu-label-title span:nth-child(2),
  17. .triple-menu-box .menus-box #triple-check-box4:checked ~ .menu-label-title span:nth-child(2) {
  18.   transform: rotate(-45deg);
  19. }
  20. .triple-menu-box .menus-box #triple-check-box:checked ~ .menu-label-title span:nth-child(3),
  21. .triple-menu-box .menus-box #triple-check-box2:checked ~ .menu-label-title span:nth-child(3),
  22. .triple-menu-box .menus-box #triple-check-box3:checked ~ .menu-label-title span:nth-child(3),
  23. .triple-menu-box .menus-box #triple-check-box4:checked ~ .menu-label-title span:nth-child(3) {
  24.   transform: rotate(45deg);
  25. }
  26. /* ここまで */

ボタンを「+」と「-」に変更する方法

sample
HTML
Copy
  1. <div class="menu-box">
  2.   <input id="check-box" type="checkbox">
  3.   <label class="menu-label-title" for="check-box">
  4.     <span class="menu-title">Q.クリック</span>
  5.     <span></span>
  6.     <span></span>
  7.   </label><!-- .menu-label-title -->
  8.   <div class="menu-text">A.テキスト</div>
  9. </div><!-- .menu-box -->
CSS
Copy
  1. .menu-box {
  2.   border: solid 1px #c0c0c0;
  3. }
  4. .menu-box .menu-label-title {
  5.   display: block;
  6.   padding: 20px 25px;
  7.   cursor: pointer;
  8.   position: relative;
  9. }
  10. .menu-box .menu-title {
  11.   display: block;
  12.   padding-right: 50px;
  13. }
  14. .menu-box .menu-label-title span:nth-child(2),
  15. .menu-box .menu-label-title span:nth-child(3) {
  16.   display: block;
  17.   width: 16px;
  18.   border-bottom: solid 1px #c0c0c0;
  19.   position: absolute;
  20.   top: 50%;
  21.   right: 25px;
  22.   transform: translateY(-50%);
  23.   -webkit-transform: translateY(-50%);
  24.   -ms-transform: translateY(-50%);
  25. }
  26. .menu-box .menu-label-title span:nth-child(2) {
  27.   transform: rotate(45deg);
  28.   right: 36px;
  29. }
  30. .menu-box .menu-label-title span:nth-child(3) {
  31.   transform: rotate(-45deg);
  32. }
  33. .menu-box .menu-text {
  34.   display: none;
  35.   padding: 20px 0;
  36.   margin: 0 25px;
  37.   border-top: dotted 1px #c0c0c0;
  38. }
  39. /* 折り畳みメニューを追加する場合 */
  40. .menu-box #check-box {
  41.   display: none;
  42. }
  43. .menu-box #check-box:checked ~ .menu-text {
  44.   display: block;
  45. }
  46. .menu-box #check-box:checked ~ .menu-label-title span:nth-child(2) {
  47.   transform: rotate(-45deg);
  48. }
  49. .menu-box #check-box:checked ~ .menu-label-title span:nth-child(3) {
  50.   transform: rotate(45deg);
  51. }
  52. /* ここまで */

上記のCSSの
30~33行目
35~37行目
55~57行目
59~61行目の4箇所を下記のように変更。

CSS
Copy
  1. .menu-box .menu-label-title span:nth-child(2) {
  2.   transform: rotate(90deg) !important;
  3.   right: 25px !important;
  4. }
  5. .menu-box .menu-label-title span:nth-child(3) {
  6.   transform: rotate(0deg) !important;
  7. }
  8. .menu-box #check-box:checked ~ .menu-label-title span:nth-child(2) {
  9.   display: none;
  10. }
  11. .menu-box #check-box:checked ~ .menu-label-title span:nth-child(3) {
  12.   transform: rotate(0deg);
  13. }

HTML・CSS入門におすすめの1冊

アイコン画像

もみじ

Web製作未経験でも読みやすい構成で、初学者でも安心して学習することができます。

実践的な内容を学ぶことができ解説も丁寧で分かりやすく、基礎的な内容はこの1冊で学ぶことができます。

アコーディオンをHTMLのみで実装する方法は以下の記事で紹介してます。

あわせて読む
HTMLのみでアコーディオンを実装する方法
【CSS不要】HTMLのみでアコーディオン(開閉ボタン)を実装する方法

もくじ【サンプル】HTMLのみでアコーディオンメニューを実装【実装コード】HTMLのみでアコーディオンメニューを実装detailsタグとsummaryタグにCSS当ててデザインを調整【サンプル】CSS ...

アコーディオンをjQueryで実装する方法は以下の記事で紹介してます。

あわせて読む
jQuery アコーディオンメニューを作成する方法
【jQuery】アコーディオン(開閉ボタン)を実装する方法

もくじjQueryを使用したアコーディオンサンプルjQueryを使用したアコーディオンコピペ用コード使用方法 Q&A動かないのですが、どうすれば良いですか?アコーディオンの追加方法は?レスポンシブに対 ...

アコーディオンをJavaScriptで実装する方法は以下の記事で紹介してます。

あわせて読む
コピペで使える!アコーディオンメニュー
【JavaScript】jQuery未使用でアコーディオン(開閉ボタン)を実装する方法

もくじJavaScriptを使用したアコーディオンサンプルJavaScriptを使用したアコーディオンコピペ用コード使用方法 Q&Aアコーディオンの追加方法は?一つ目のアコーディオンを開いた状態にする ...

-Webデザイン
-,