【HTML】クリックで開閉するメニューを作る方法【JS不要】

どうも、くじらいどです。

「クリックすると答えがパカッと開くFAQ」みたいなやつ、JavaScriptを書かないと作れないと思っていませんか。

実はHTMLの<details><summary>というタグだけで、クリックで開閉するメニューが作れます。この記事では、基本の書き方から見た目の調整、よくあるFAQ形式まで、コピペで使える形で紹介します。

目次

details・summaryとは?

結論から言うと、<details>は「開閉できる箱」、<summary>はその「見出し(常に見えている部分)」です。<summary>をクリックすると、中身が開いたり閉じたりします。

ブラウザに最初から備わっている機能なので、JavaScriptもライブラリも一切いりません。三角マーク(▶)も自動で付きます。

くじらいど

アコーディオンメニューって難しそうな名前ですけど、これに関しては拍子抜けするくらい簡単なんですよね。

クリックで開閉するメニューを作る方法

まずは一番シンプルな形です。<details>で全体を囲み、その一番上に<summary>で見出しを書くだけ。あとは開いたときに見せたい中身を続けて書きます。

<details>
  <summary>クリックで開く見出し</summary>
  <p>ここに隠れている本文が入ります。クリックするまでは見えません。</p>
</details>

▼ 表示例(クリックで開きます)

クリックで開く見出し

ここに隠れている本文が入ります。クリックするまでは見えません。

最初から開いた状態にしておきたいときは、<details>openを付けます。

<details open>
  <summary>最初から開いている見出し</summary>
  <p>ページを表示した時点で、すでに中身が見えています。</p>
</details>

CSSで見た目を整える

そのままだと少し素っ気ないので、CSSで枠線や背景を付けると一気にそれらしくなります。下のコードをコピペすれば、FAQでよく見るカード風の見た目になります。

/* 箱ぜんたい */
details {
  border: 1px solid #d9d9d9;
  border-radius: 8px;
  margin-bottom: 12px;
  overflow: hidden;
}

/* 見出し部分 */
summary {
  padding: 14px 18px;
  background: #f5f7fa;
  font-weight: bold;
  cursor: pointer; /* マウスを乗せると指マークに */
}

/* 開いたときの中身 */
details p {
  padding: 14px 18px;
  margin: 0;
}

▼ 表示例

CSSでカード風に整えたdetails/summaryの表示例(閉じた状態と開いた状態)

三角マークを自分で付け替える

デフォルトの三角マーク(▶)を消して、自分の好きな記号に変えることもできます。list-style: noneで元のマークを消し、::beforeで新しい記号を付けるのが定番です。

/* 元の三角マークを消す */
summary {
  list-style: none;
}
summary::-webkit-details-marker {
  display: none;
}

/* 自分でプラス記号を付ける */
summary::before {
  content: "+";
  margin-right: 8px;
  font-weight: bold;
}

/* 開いているときはマイナス記号に */
details[open] summary::before {
  content: "-";
}

▼ 表示例

+・-マークにカスタムしたdetails/summaryの表示例
Point

details[open]は「開いている状態のdetails」を指す書き方です。これを使うと、開いているときだけ見た目を変えられます。

FAQで「1つ開くと他が閉じる」ようにする

FAQをいくつも並べると、開きっぱなしで画面がごちゃつくことがあります。「1つ開いたら他は自動で閉じる」ようにしたいときは、複数の<details>に同じnameを付けます。

<details name="faq">
  <summary>質問1:送料はかかりますか?</summary>
  <p>全国どこでも送料無料です。</p>
</details>

<details name="faq">
  <summary>質問2:返品はできますか?</summary>
  <p>到着後7日以内であれば返品可能です。</p>
</details>

nameを同じ値(この例ではfaq)でそろえるのがポイントです。これだけで、どれか1つを開くと他が自動的に閉じるようになります。

▼ 表示例(1つ開くと、開いていた方が閉じます)

質問1:送料はかかりますか?

全国どこでも送料無料です。

質問2:返品はできますか?

到着後7日以内であれば返品可能です。

Point

このnameによる排他制御は比較的新しい機能です。古いブラウザでは「他が自動で閉じる」動きにならないことがありますが、その場合でも開閉自体は普通に動くので、そのまま使って問題ありません。

まとめ

  • 開閉メニューは<details><summary>だけで作れる(JavaScript不要)
  • openを付けると最初から開いた状態にできる
  • CSSで枠線・背景・記号を変えれば見た目を自由に調整できる
  • 同じnameを付ければ「1つ開くと他が閉じる」FAQになる

自分もアコーディオンメニューはずっとJavaScriptで書くものだと思い込んでいたので、これを知ったときはけっこう感動しました。まずは基本のコードをコピペして、動くのを確かめてみてください。

以上、くじらいどでした!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

アラサー社会不適合者の くじらいど です。
喘息・アトピー・鼻炎持ち。
趣味は絵を描くこと。

「失敗と後悔の海」を超えて、
自分の人生を描いています。

コメント

コメントする

目次