個人サイトでも、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が競合してデザインが崩れてしまう場合があります。その場合はご自分で修正していただきますようよろしくお願いします。
ボーダー付きボックス
.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: "-";
}