folderデザインしたい

クリックで内容を展開するアコーディオンメニューをCSSだけで実装する方法

クリックで内容を展開するアコーディオンメニューをCSSだけで実装する方法

クリックで内容を展開するアコーディオンメニューをCSSだけで実装する方法 - https://do.gt-gt.org/how-to-make-accordionmenu/

個人サイトでも、HTMLとCSSをコピペするだけでカンタンに実装できる、アコーディオンメニューを紹介します。

アコーディオンメニューとは

アコーディオンメニューとは、クリック・タップでコンテンツが開閉するボックスのことです。以下に実際のアコーディオンメニューを設置したので、クリックしてみてください。

ここをクリックで展開

ここに内容

「ここをクリックで展開」と書かれた文字をクリック・タップすると詳細な内容が下に出現します。企業サイトのQ&Aなどでよく見かけるものですね。個人サイトにおいても、ネタバレ回避のワンクッションとして使ったり、長くなってしまったコンテンツをしまっておいたり、いろんな用途に使えそうです。また、クリックで見えるようになる本文には、HTMLタグを使用することもできます。

実はこのアコーディオンメニュー、HTMLだけで実現できるんです

<details>
<summary>ここをクリックで展開</summary>
ここに内容
</details>

シンプルなHTMLで表現できて、とても使いやすいですね。ただ、これだけでは味気ないので、CSSでデザインとアニメーションを調整したものを次項から紹介します。HTMLとCSSをコピペするだけなので、実装はとってもカンタンです。

HTMLコードサンプル

HTMLコードは、以下のように記述してください、

<details class="accordion">
  <summary class="accordion_title">ここをクリックすると展開します。</summary>
  <div class="accordion_contents">
    <p>詳細なテキストが入ります。</p>
  </div>
</details>

CSSコードサンプル

CSSは、3種のデザインを用意しました。いずれもクリックするとアニメーションしながらコンテンツが展開します。お好みのデザインのもののCSSをコピーしてご利用ください。

またお使いのテンプレートによっては、元のCSSが競合してデザインが崩れてしまう場合があります。その場合はご自分で修正していただきますようよろしくお願いします。

ブラウザや環境によってはアニメーションが適用されない場合があります。ご了承下さい。またHTML・CSSのカスタマイズは自由です。

ボーダー付きボックス

.accordion  {
  margin: 30px auto;
}

.accordion_title {
  position: relative;
  border: none;
  display: block;
  list-style: none;
  width: 100%;
  cursor: pointer;
  background: #ffffff;
  border: 2px solid #d8d8d8;
  padding: 1.4em 1.6em 1.4em;
  line-height: 1.6em;
}

summary.accordion_title::-webkit-details-marker {
  display:none;
}

.accordion_title:after {
  content: "+";
  position: absolute;
  top: calc(50% - 0.5em);
  right: 20px;
  line-height: 1;
  padding: 0;
  pointer-events: none;
}

.accordion::details-content {
  opacity: 0;
  block-size: 0;
  transition: .3s;
  transition-property: display, opacity, block-size, padding;
  transition-behavior: allow-discrete;
  line-height: 1.6em;
}

.accordion .accordion_content {
  padding: 0 2em 0 3em;
}

.accordion .accordion_content > *:first-of-type {
  margin-top: 0;
}

.accordion .accordion_content > *:last-of-type {
  margin-bottom: 0;
}

.accordion[open]::details-content {
  opacity: 1;
  block-size: auto;
  block-size: calc-size(auto, size);
}

.accordion[open] .accordion_content {
  padding: 1.4em 2em 1.4em 3em;
}

.accordion[open] .accordion_title:after {
  content: "-";
}

ボーダーなしボックス

.accordion  {
  margin: 30px auto;
}

.accordion_title {
  position: relative;
  border: none;
  display: block;
  list-style: none;
  width: 100%;
  cursor: pointer;
  background: #d2d2d2;
  padding: 1.4em 1.6em 1.4em;
  line-height: 1.6em;
}

summary.accordion_title::-webkit-details-marker {
  display:none;
}

.accordion_title:after {
  content: "+";
  position: absolute;
  top: calc(50% - 0.5em);
  right: 20px;
  line-height: 1;
  padding: 0;
  pointer-events: none;
}

.accordion::details-content {
  opacity: 0;
  block-size: 0;
  transition: .3s;
  transition-property: display, opacity, block-size, padding;
  transition-behavior: allow-discrete;
  line-height: 1.6em;
  background: #ffffff;
}

.accordion .accordion_content {
  padding: 0 1.4em;
}

.accordion .accordion_content > *:first-of-type {
  margin-top: 0;
}

.accordion .accordion_content > *:last-of-type {
  margin-bottom: 0;
}

.accordion[open]::details-content {
  opacity: 1;
  block-size: auto;
  block-size: calc-size(auto, size);
}

.accordion[open] .accordion_content {
  padding: 1.4em;
}

.accordion[open] .accordion_title:after {
  content: "-";
}

下線ボックス

.accordion  {
  margin-inline: 0;
  border-bottom:1px solid #a9a9a9
}

.accordion_title {
  position: relative;
  border: none;
  display: block;
  list-style: none;
  width: 100%;
  cursor: pointer;
  padding: 1.4em 2em 1.4em 1.4em;
  line-height: 1.6em;
}

summary.accordion_title::-webkit-details-marker {
  display:none;
}

.accordion_title:after {
  content: "+";
  position: absolute;
  top: calc(50% - 0.5em);
  right: 20px;
  line-height: 1;
  padding: 0;
  pointer-events: none;
}

.accordion::details-content {
  opacity: 0;
  block-size: 0;
  transition: .3s;
  transition-property: display, opacity, block-size, padding;
  transition-behavior: allow-discrete;
  line-height: 1.6em;
}

.accordion .accordion_content {
  padding: 0 2em 0 3em;
}

.accordion .accordion_content > *:first-of-type {
  margin-top: 0;
}

.accordion .accordion_content > *:last-of-type {
  margin-bottom: 0;
}

.accordion[open]::details-content {
  opacity: 1;
  block-size: auto;
  block-size: calc-size(auto, size);
}

.accordion[open] .accordion_content {
  padding: 0 2em 1.4em 3em;
}

.accordion[open] .accordion_title:after {
  content: "-";
}

この記事を書いた人

ガタガタ

このサイトと、このサイトの掲載記事のほとんどと、このサイトで配布しているプログラムやテンプレートのすべてを作った人。絵を描いたり、文章を書いたりして暮らしています。

関連記事

Googleカレンダーをサイトにキレイに埋め込むFullCalendarの使い方
folderデザインしたい favorite 24

Googleカレンダーをサイトにキレイに埋め込むFullCalendarの使い方

HTMLテンプレートを自前カスタマイズしてもダサくならないためのデザインの考え方
folderデザインしたい favorite 58

HTMLテンプレートを自前カスタマイズしてもダサくならないためのデザインの考え方

SNSでサイトをシェアしたときにアイキャッチ画像を表示させる設定方法【OGP】
folderデザインしたい favorite 22

SNSでサイトをシェアしたときにアイキャッチ画像を表示させる設定方法【OGP】

サイト更新ごとにCSSファイルを新しく読み込ませてキャッシュ問題を回避する方法
folderデザインしたい favorite 27

サイト更新ごとにCSSファイルを新しく読み込ませてキャッシュ問題を回避する方法

コピペでOK!オシャレなフォントが無料で使えるGoogle Fontsの導入方法
folderデザインしたい favorite 34

コピペでOK!オシャレなフォントが無料で使えるGoogle Fontsの導入方法

ファビコンの設定方法!サイト独自のアイコンを作ってオリジナリティアップ
folderデザインしたい favorite 27

ファビコンの設定方法!サイト独自のアイコンを作ってオリジナリティアップ