CSSで作るドロップダウンメニュー

WEBサイトにを見ているとグローバルナビゲーションにマウスカーソルを乗せるとニューっとサブメニューが現れる「ドロップダウンメニュー」というのを見かけることがあります。

ドロップダウンメニューを一見すると何か複雑な仕掛けがありそうな気がしますが、実は割と簡単にCSSだけで実装することが出来ます。

今日はCSSを使ってロップダウンメニューを作りたいと思います。

基本的なドロップダウンメニュー

とても基本的なドロップダウンメニューを作成したいと思います。

作成するサブメニューは

  • 初期状態では隠しておく
  • マウスカーソルがメインメニューの上に乗ったらサブメニューが現れるようにする
  • サブメニューの開始位置はメインメニューの直下

というものです。

<body>
  <!-- /#header-nav -->
  <nav id="header-nav">
    <ul class="header-list">
     
      <li class="menu-item a">
        <a href="">メニューA</a>
        <ul class="sub-menu">
          <li class="sub-menu-item a">
            <a href="">サブメニュー1</a>
          </li>
          <li class="sub-menu-item a">
            <a href="">サブメニュー2</a>
          </li>
        </ul><!-- /.sub-menu -->
      </li><!-- /.menu-item a -->
      
      <li class="menu-item b">
        <a href="">メニューB</a>
        <ul class="sub-menu">
          <li class="sub-menu-item b">
            <a href="">サブメニュー1</a>
          </li>
          <li class="sub-menu-item b">
            <a href="">サブメニュー2</a>
          </li>
        </ul><!-- /.sub-menu -->
      </li><!-- /.menu-item b -->
      
      <li class="menu-item c">
        <a href="">メニューC</a>
        <ul class="sub-menu">
          <li class="sub-menu-item c">
            <a href="">サブメニュー1</a>
          </li>
          <li class="sub-menu-item c">
            <a href="">サブメニュー2</a>
          </li>
        </ul><!-- /.sub-menu -->
      </li><!-- /.menu-item c-->
      
      <li class="menu-item d">
        <a href="">メニューD</a>
        <ul class="sub-menu">
          <li class="sub-menu-item d">
            <a href="">サブメニュー1</a>
          </li>
          <li class="sub-menu-item d">
            <a href="">サブメニュー2</a>
          </li>
        </ul><!-- /.sub-menu -->
      </li><!-- /.menu-item d -->
    
    </ul><!-- /.header-nav-list -->
  </nav><!-- /#header-nav -->
</body>
/* 基礎部分 */
*,
*::before,
*::after {
  -webkit-box-sizing: border-box;
          box-sizing: border-box;
}

ul {
  margin: 0;
  padding: 0;
  list-style: none;
}

li {
  margin: 0;
  padding: 0;
}

a {
  text-decoration: none;
}

a,
a:visited {
  color: inherit;
}

/* メニューの色 */
.a {
  background: blue;
}

.b {
  background: red;
}

.c {
  background: green;
}

.d {
  background: black;
}

/* ナビゲーションの大きさ */
#header-nav {
  width: 900px;
  margin: auto;
}

/* カラム落ちの防止 */
.header-list {
  font-size: 0;
}

/* メインメニュー */
.menu-item {
  display: inline-block;
  width: 25%;
  position: relative;
}

.menu-item a {
  display: block;
  width: 100%;
  height: 50px;
  line-height: 50px;
  font-size: 16px;
  font-weight: 700;
  text-align: center;
  color: white;
}

/* サブメニュー */
.sub-menu {
  position: absolute;
  width: 100%;
  top: 50px;
}

.sub-menu-item {
  overflow: hidden;
  opacity: 0;
  height: 0;
  /* サブメニューが出現する速度の調整 */
  -webkit-transition: 0.3s;
  transition: 0.3s;
}

/* メインメニューマウスカーソルが乗ったらサブメニューを出現させる */
.menu-item:hover > .sub-menu > .sub-menu-item {
  overflow: visible;
  opacity: 1;
  height: 50px;
}

下記のリンク先にデモを用意しましたので、もしよかったら実際にマウスカーソルを乗せて確認してみてください。

基本的なドロップダウンメニュー

サブメニューを作る場合はメインメニューとなるli要素の中にul要素を入れ子にして作っていくのがポイントです。

そしてCSSでサブメニューの各項目を初期状態では「overflow: hidden;」「height: 0」にして現れないようにしておき、疑似クラスのhoverを使いマウスカーソルが乗った時に高さなどを与えて表れるようにします。

サブメニューの要素にtransitionを設定することで、サブメニューが現れる速度を調節することが出来ます。

以上が基本的なドロップダウンメニューです。

サブメニューを横に広げる

先程のサブメニューはメインメニューと同じ幅でした。

でも、サブメニューをメインメニューの幅一杯に広げたい場合もあるかもしれません。

この場合はサブメニューの位置の基準となる要素について少し変更を行います。

先程の場合、サブメニューの位置を決定するための基準となる要素はメインメニューの各項目でした。

そのためメインメニューの各項目(.menu-item)に「position:relative」をつけてサブメニューの基準としました。

この基準を各項目ではなくメニュー全体にしてあげれば、サブメニューの幅はメインメニュー全体に広がります。

具体的には以下のようなCSSにすると良いかもしれません。

/* 基礎部分 */
*,
*::before,
*::after {
  -webkit-box-sizing: border-box;
          box-sizing: border-box;
}

ul {
  margin: 0;
  padding: 0;
  list-style: none;
}

li {
  margin: 0;
  padding: 0;
}

a {
  text-decoration: none;
}

a,
a:visited {
  color: inherit;
}

/* メニューの色 */
.a {
  background: blue;
}

.b {
  background: red;
}

.c {
  background: green;
}

.d {
  background: black;
}

/* ナビゲーションの大きさ */
#header-nav {
  width: 900px;
  margin: auto;
  
  /* 変更部分:サブメニューの基準を変更 */
  position: relative;
}

/* カラム落ちの防止 */
.header-list {
  font-size: 0;
}

/* メインメニュー */
.menu-item {
  display: inline-block;
  width: 25%;
}

.menu-item a {
  display: block;
  width: 100%;
  height: 50px;
  line-height: 50px;
  font-size: 16px;
  font-weight: 700;
  text-align: center;
  color: white;
}

/* サブメニュー */
.sub-menu {
  position: absolute;
  width: 100%;
  top: 50px;
  
  /* 変更部分:左端を基点にする */
  left: 0;
}

.sub-menu-item {
  overflow: hidden;
  opacity: 0;
  height: 0;
  /* サブメニューが出現する速度の調整 */
  -webkit-transition: 0.3s;
  transition: 0.3s;
}

/* メインメニューマウスカーソルが乗ったらサブメニューを出現させる */
.menu-item:hover > .sub-menu > .sub-menu-item {
  overflow: visible;
  opacity: 1;
  height: 50px;
}

変更箇所がちょっとわかりにくいかもしれませんが、先ほどのCSSから変更した箇所は2ヵ所だけ。

1つ目の変更はメインメニューの各項目である「.menu-item」に設定していた「position:relative」を「#header-nav」 というメニュー全体を包む要素に移動させるということ。

2つ目の変更はサブメニューをメインメニューの左端に合わせるために「.sub-menu」に「left: 0」を追加したことです。

下記のリンク先にデモを用意しましたので、もしよかったら確認してください。

メインメニュー全体の幅に広がるサブメニュー

サブメニューがメインメニュー全体の幅に広がっていることと思います。

この考え方を使えば、画面いっぱいにサブメニューを広げることも簡単に出来ます。

下記のリンク先に画面幅一杯にサブメニューが広がるデモを用意しましたので、もしよかったら確認してみてください。

画面幅一杯に広がるサブメニュー

まとめ

CSSでの簡単なドロップダウンメニューの作り方について見てきました。

ポイントは

  • サブメニューとなるul要素をメインメニューのli要素の入れ子にする
  • positionで位置をあわせる
  • 初期状態では「overflow: hiddenとheight: 0」で消しておいて、疑似クラスのhoverにより「overflow: visibleとheight: xx」により出現させる

という3点だと思います。

以上がjQueryを使わずに手軽に作れるドロップダウンメニューのご紹介でした。

ゆんつ
それでは、またー