Site icon Tips Note by TAM

CSSでプルダウンメニューを作ってみる

JavaScriptを使用せずに、CSSのみでスマホ向けのプルダウンメニューを実装してみました。
デモページはこちらになります。

■HTML

<div id="page">
 <header id="header">
        <p class="nav-open"><a href="#gNav">MENU</a></p>
        <nav id="gNav">
         <ul>
              <li><a href="">メニュー</a></li>
              <li><a href="">メニュー</a></li>
              <li><a href="">メニュー</a></li>
              <li><a href="">メニュー</a></li>
              <li><a href="">メニュー</a></li>
              <li><a href="">メニュー</a></li>
          </ul>
         <div class="nav-close"><a href="#page">CLOSE</a></div>
      </nav>
    </header>
 <div id="contents">
     <p>コンテンツ内容</p>
      <p>コンテンツ内容</p>
      <p>コンテンツ内容</p>
  </div>
</div>

■CSS
必要箇所のみ抜粋しています。

#header {
    height: 30px;
}
#header #nav-open {
   position: absolute;
 width: 100%;
    height: 30px;
   z-index: 200;
   margin: 0;
  background: #000;
}
#header #nav-open a {
 position: absolute;
 top: 5px;
   right: 10px;
}
#gNav {
    width: 100%;
    position: absolute;
 top: -180px;
    z-index: 100;
   transition: top 1s;
 -webkit-transition: top 1s;
 -moz-transition: top 1s;
    text-align: center;
 background:#1a1a1a;
}
#gNav:target {
  top: 30px;
}

ざっくり説明すると、メニュー部分を画面上部に隠しておいて、#gNavのtopの数値を変更して
表示・非表示を切り替える仕組みです。(#gNav の top: -180px; と #gNav:target の top: 30px;)
この数値は固定なので、メニュー・ヘッダーの高さが変わる場合は、数値を変更する必要があります。
 

プルダウンのアニメーションは、CSS3のtransitionと:targetを使用して、#gNavにターゲットが当たった時に表示され、ターゲットが外れた時に隠れるようにしています。
 

あと、プルダウンメニューをヘッダーの下から出てくるようにしたかったので、
①#headerの子要素に#nav-openと#gNavを置いて、重なり順を#nav-openが上にくるようにする。
②#nav-openを#headerと同じサイズに指定して、#nav-openに対してヘッダーの背景色をつける。
といった形にしています。