よくある質問ページなどで見かける、クリックでコンテンツを開閉できるアコーディオンをCSSのみで実装する方法をご紹介します。
目次
HTML
<div class="accordion">
<div class="faq">
<input type="checkbox" id="faq01" class="toggle">
<label class="question" for="faq01"><span>Q</span>質問01</label>
<div class="anser">
<div><span>A</span>質問01のA</div>
</div>
</div>
<div class="faq">
<input type="checkbox" id="faq02" class="toggle">
<label class="question" for="faq02"><span>Q</span>質問02</label>
<div class="anser">
<div><span>A</span>質問02のA</div>
</div>
</div>
<div class="faq">
<input type="checkbox" id="faq03" class="toggle">
<label class="question" for="faq03"><span>Q</span>質問03</label>
<div class="anser">
<div><span>A</span>質問03のA</div>
</div>
</div>
</div>
CSS
.accordion {
margin: 4rem auto;
max-width: 80%;
}
.toggle {
display: none;
}
.faq {
position: relative;
margin-bottom: 1rem;
}
.question,.anser {
transform: translateZ(0);
transition: all 0.3s;
}
.question {
border: solid 1px #999;
padding: 1rem 2.2rem 1rem 1rem;
display: block;
color: #333;
}
.question span,.anser span {
font-size: 160%;
padding-right: 0.6rem;
color: #c30a01;
line-height: 0;
}
.question:after,.question:before {
content: "";
position: absolute;
right: 1.25rem;
top: 0;
bottom: 0;
margin: auto;
width: 2px;
height: 0.75rem;
background-color: #999;
transition: all 0.3s;
}
.question:after {
transform: rotate(90deg);
}
.anser {
max-height: 0;
overflow: hidden;
}
.anser div {
margin: 0;
padding: 2rem 1rem 2rem;
line-height: 1.8;
}
.toggle:checked + .question + .anser {
max-height: 500px;
transition: all 1.5s;
}
.toggle:checked + .question:before {
transform: rotate(90deg) !important;
}
・labelクリックでanserの表示・非表示を切り替えます。
・checkboxは非表示にしておきます。
・.toggle:checked + .question + .anser
チェックボックスにチェックがはいった時の.anserのCSSを指定します。
・.toggle:checked + .question:before
チェックがはいった時のbefore(縦棒)を90度回転させる。
(afterの縦棒と重なった状態になっています。)
・.question:beforeのtransition: all 0.3s;は、0.3秒かけてアニメーションします。
(今回の場合、0.3秒かけて90度の回転をします。)
いかがでしょうか。
CSSのみでアコーディオンを実装してみました。
是非、使ってみてください。