文系エンジニアのブログ

文系20代後半からWEB系エンジニアを目指す

【HTML/CSS】CSSだけでドロップダウンメニューを作る

今回はドロップダウンメニューをCSSだけで作成したいと思います。

ドロップダウンメニューとは

リストなどをクリックしたり、マウスカーソルを合わせた時にさらにリストが降りてくるようなメニューの表示のことを言います。
↓こんな感じのメニューです。
f:id:Mchinta:20190115111325g:plain

完成系

HAMLCSSはこんな感じです。(HAMLはhtmlをRails特有に書きやすくしたものですがhtmlでも動作します)

HAML

<li>
  トップ
   <ul class="sub-list">
      <li class="sub">プロフィール</li>
      <li class="sub">プロダクト</li>
   </ul>
</li>

CSS

li {
  line-height: 50px;
  margin-left: 30px;
  &:hover ul.sub-list{
    display: block;
  }
}
ul.sub-list {
  position: absolute;
  top: 50px;
  left: 0;
  z-index: 1;
  display: none;
  background-color: #fafafa;
  width: 200px;
  height: 100px;
  li {
    margin-left: 0;
    &:hover {
      background-color: red;
    }
  }
}

手順

まずはホバーさせた時に表示されるメニューを作成します

ポイントは以下の部分です。
position: absolute; #強制的にメニューの位置を固定します
z-index: 1; #メニューが背景画像などの下にくぐってしまわないようにします
display: none; #ホバーした時に表示されてほしいので、一旦このメニューを隠します。

ul.sub-list {
  position: absolute;
  top: 50px;
  z-index: 1;
  display: none;
  background-color: #fafafa;
  width: 200px;
  height: 100px;
  li {
    margin-left: 0;
    }
  }
}

ホバーした時に隠していたメニューを表示するようにします。

ここでのポイントは擬似要素のhoverを使うことです。
仕組みとしてはliを&:hoverした時にul.sub-listをdisplay: block(隠していたものを表示)するよ、ということになる。
&:hover ul.sub-list{
display: block;
}

li {
  line-height: 50px;
  margin-left: 30px;
  &:hover ul.sub-list{
    display: block;
  }
}

最後にホバーした時のリストもカーソルを合わせた時に背景色が変化するようにします。

ここも擬似要素のhoverを使うことで、liをhoverした時にbackground-color: red;にするよ、ということになる。

li {
  margin-left: 0;
  &:hover {
    background-color: red;
  }


擬似要素を使いこなせるといろんなことがCSSだけでできて面白そう