CSSだけで作るアコーディオンメニュー (アニメーションでアイコン切り替え)

こんにちは!トレイです。
今回はjavascriptを使用せず、CSSだけでアコーディオンメニューを実装してみました。

デモ

codepenで書いてみました。

See the Pen QWwLPWv by tray (@tray_codepen) on CodePen.


アコーディオンメニューとは上のように開閉可能なメニューのことです。

情報量が多いメニューでもすっきり見せることができますね。

ソースコード

HTML

<div class="wrapper">
  <input type="checkbox" name="" id="aco-input01" class="aco-input">
  <label for="aco-input01" class="aco-title">
  <p>★見出し★</p>
  <div class="title-icon"><span></span><span></span></div>
  </label>
  <ul class="acordion">
    <li class="acordion-item">★中身★</li>
    <li class="acordion-item">★中身★</li>
    <li class="acordion-item">★中身★</li>
  </ul>
</div>
<div class="wrapper">
  <input type="checkbox" name="" id="aco-input02" class="aco-input">
  <label for="aco-input02" class="aco-title">
  <p>★見出し★</p>
  <div class="title-icon"><span></span><span></span></div>
  </label>
  <ul class="acordion">
    <li class="acordion-item">★中身★</li>
    <li class="acordion-item">★中身★</li>
    <li class="acordion-item">★中身★</li>
  </ul>
</div>

CSS(リセットCSS の読み込み必須)

/*初期設定*/
html {
  font-size: 62.5%;
}
* {
  box-sizing: border-box;
}
body {
  line-height: 1.5;
}
.aco-input {
  display: none;/*最初に隠したい要素を非表示*/
}
/*全体*/
.wrapper {
  min-width: 300px;/*最低幅を調整*/
  width: 80%;
  margin: 10px auto 0;
  box-shadow: 0 3px 6px rgba(0,0,0,0.15), 0 3px 6px rgba(0,0,0,0.2);/*影をつける*/
}
/*見出し*/
.aco-title {
  font-size: 1.8rem;
  display: flex;/*見出しとアイコンを横ならびに*/
  justify-content: space-between;/*見出しとアイコンを左右両端に*/
  align-items: center;/*見出しとアイコンを上下中央に*/
  background-color: #5ABCBC;
  color: #fff;
  padding: 11px 16px 11px 12px;
  transition: .5s;/*動きを滑らかに*/
}
/*アイコン*/
.title-icon {
  position: relative;
  background-color: #FFAB5D;
  display: block;
  width: 30px;
  height: 30px;
}
/*アイコンを構成している棒*/
.title-icon span {
  position: absolute;/*.title-iconを起点にする*/
  display: inline-block;
  background-color: #fff;
  width: 12px;
  height: 2px;
  transition: .5s;/*動きを滑らかに*/
}
/*アイコンを構成している横棒*/
.title-icon span:nth-of-type(1) {
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}
/*アイコンを構成している縦棒*/
.title-icon span:nth-of-type(2) {
  left: 9px;
  top: 14px;
  transform: rotate(90deg);
}
/*クリックしたときの横棒*/
.aco-input:checked ~ .aco-title span:nth-of-type(1) {
  opacity: 0;
}
/*クリックしたときの縦棒*/
.aco-input:checked ~ .aco-title span:nth-of-type(2) {
  transform: rotate(180deg);/*縦棒から横棒に*/
}
/*隠しておく中身*/
.acordion {
  max-height: 0;
  overflow: hidden;
  opacity: 0;
  transition: .5s;
}
/*チェックしたときに表示*/
.aco-input:checked ~ .acordion {
  max-height: 160px;/*表示させたい高さ(要調整)*/
  opacity: 1;
}
.acordion-item {
  color: #333;
  font-size: 1.2rem;
  border-bottom: 1px solid #dadada;
  padding: 11px 34px 10px 12px;
}

簡単な説明

inputタグとlabelタグの連動

ポイントはinputタグとlabelタグです。

inputタグのid属性とlabelタグのfor属性を合わせることで連動させることができます。 今回だと <input id=”aco-input”>、<label for=”aco-input”> ですね。

連動させるとlabelタグの要素をクリックしたときでもinputタグをクリックしたことと同じ扱いになります。

inputタグにチェックが入るとinputタグにはchecked属性が付与されます。
この checked 属性を利用してスタイルを適用させることでCSSだけでクリック機能を実現できます。