【Labs】CSSだけでドロップダウンメニュー
こんにちは(・∀・)
CSSだけで作ってみましたシリーズです。今回はドロップダウンメニューをご紹介します。通常のドロップダウンメニューとtransitionプロパティで動きのあるドロップダウンメニューの横バージョンと縦バージョンの4タイプです。
transitionプロパティはdisplayでの制御をサポートしていないため、子孫メニューの制御はoverflowで行っております。displayでの制御も可能ですが、その場合動きはなくなり、表示している矢印も表示されなくなります。
1. 横並びドロップダウンメニュー
横並びで表示するドロップダウンメニューのサンプルです。
① 通常のドロップダウンメニュー
HTML
<ul class="nav">
<li><a href="#">Home</a>
</li>
<li><a href="#">Strategy</a>
<ul>
<li><a href="#">b1</a></li>
<li><a href="#">b1</a>
<ul>
<li><a href="#">b2</a></li>
<li><a href="#">b2</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#">About</a>
<ul>
<li><a href="#">c1</a>
<ul>
<li><a href="#">c2</a></li>
<li><a href="#">c2</a></li>
</ul>
</li>
<li><a href="#">c1</a></li>
</ul>
</li>
<li><a href="#">Works</a>
<ul>
<li><a href="#">d1</a></li>
<li><a href="#">d1</a>
<ul>
<li><a href="#">d2</a></li>
<li><a href="#">d2</a>
<ul class="left">
<li><a href="#">d3</a></li>
<li><a href="#">d3</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><a href="#">Contact</a>
<ul>
<li><a href="#">e1</a>
<ul class="left">
<li><a href="#">e2-1</a></li>
<li><a href="#">e2-1</a></li>
</ul>
</li>
<li><a href="#">e1</a>
<ul class="left">
<li><a href="#">e2-2</a></li>
<li><a href="#">e2-2</a></li>
</ul>
</li>
</ul>
</li>
<!--nav--></ul>
<div class="content">
<p>通常の横並びドロップダウンメニューです。メニュー部分にマウスオーバーするとコンテンツの上に子メニューが展開します。</p>
<p>子孫メニューの制御ははoverflowで行っております。displayでの制御も可能ですが、その場合はcontentプロパティで表示している▶矢印は見えなくなります。</p>
</div>
CSS
.nav {
width: 750px;
height: 40px;
margin: 0 auto;
padding: 0;
display: flex;
}
.nav li {
position: relative;
list-style: none;
}
.nav li a {
display: block;
width: 150px;
height: 40px;
text-align: center;
color: #fff;
font-size: 14px;
line-height: 2.8;
background: #9fb7d4;
text-decoration: none;
border-right: 1px solid #eee;
box-sizing: border-box;
}
.nav > li:hover > a {/*layer-1*/
color: orange;
background: #afc6e2;
}
.nav > li li:hover > a {/*layer-2*/
color: olive;
background: #afc6e2;
}
.nav li ul {
top: 40px;
left: -40px;
position: absolute;
}
.nav li ul li {
overflow: hidden;
height: 0;
}
.nav li ul li a {
border-top: 1px solid #eee;
}
.nav li:hover > ul > li {
overflow: visible;
height: 40px;
}
.nav li ul li ul {
top: 0;
left: 110px;
}
.nav li ul li ul:before {/*layer-2▷*/
position: absolute;
content: "";
top: 15px;
left: 30px;
border: 5px solid transparent;
border-left: 5px solid #fff;
}
.nav li ul li ul li:hover > a {/*layer-3*/
color: pink;
background: #afc6e2;
}
.nav li ul li ul.left {
top: 0;
left: -190px;
}
.nav li ul li ul.left:before,/*layer-2-left▷*/
.nav li ul li ul li ul.left:before {/*layer-3-left▷*/
position: absolute;
content: "";
top: 15px;
left: 190px;
border: 5px solid transparent;
border-right: 5px solid #fff;
}
.nav li ul li ul.left li:hover > a {/*layer-2-left*/
color: pink;
background: #afc6e2;
}
.nav li ul li ul li ul.left li:hover > a {/*layer-3-left*/
color: purple;
background: #afc6e2;
}
.content {
width: 750px;
height: 200px;
background: #eee;
margin: 0 auto;
padding: 10px;
text-align: left;
box-sizing: border-box;
}
Result
② transitionプロパティで動きのあるドロップダウンメニュー
HTML
<ul class="nav">
<li><a href="#">Home</a>
</li>
<li><a href="#">Strategy</a>
<ul>
<li><a href="#">b1</a></li>
<li><a href="#">b1</a>
<ul>
<li><a href="#">b2</a></li>
<li><a href="#">b2</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#">About</a>
<ul>
<li><a href="#">c1</a>
<ul>
<li><a href="#">c2</a></li>
<li><a href="#">c2</a></li>
</ul>
</li>
<li><a href="#">c1</a></li>
</ul>
</li>
<li><a href="#">Works</a>
<ul>
<li><a href="#">d1</a></li>
<li><a href="#">d1</a>
<ul>
<li><a href="#">d2</a></li>
<li><a href="#">d2</a>
<ul class="left">
<li><a href="#">d3</a></li>
<li><a href="#">d3</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><a href="#">Contact</a>
<ul>
<li><a href="#">e1</a>
<ul class="left">
<li><a href="#">e2-1</a></li>
<li><a href="#">e2-1</a></li>
</ul>
</li>
<li><a href="#">e1</a>
<ul class="left">
<li><a href="#">e2-2</a></li>
<li><a href="#">e2-2</a></li>
</ul>
</li>
</ul>
</li>
<!--nav--></ul>
<div class="content">
<p>transitionプロパティで動きのある横並びドロップダウンメニューです。メニュー部分にマウスオーバーするとコンテンツの上に子メニューが展開します。</p>
<p>transitionプロパティはdisplayでの制御をサポートしていないため、子孫メニューの制御はoverflowで行っております。displayでの制御も可能ですが、その場合動きはなくなります。</p>
</div>
CSS
.nav {
width: 750px;
height: 40px;
margin: 0 auto;
padding: 0;
display: flex;
}
.nav li {
position: relative;
list-style: none;
}
.nav li a {
display: block;
width: 150px;
height: 40px;
text-align: center;
color: #fff;
font-size: 14px;
line-height: 2.8;
background: #9fb7d4;
transition: 0.5s;
text-decoration: none;
border-right: 1px solid #eee;
box-sizing: border-box;
}
.nav > li:hover > a {/*layer-1*/
color: orange;
background: #afc6e2;
}
.nav > li li:hover > a {/*layer-2*/
color: olive;
background: #afc6e2;
}
.nav li ul {
top: 40px;
left: -40px;
position: absolute;
}
.nav li ul li {
overflow: hidden;
height: 0;
transition: 0.2s;
}
.nav li ul li a {
border-top: 1px solid #eee;
}
.nav li:hover > ul > li {
overflow: visible;
height: 40px;
}
.nav li ul li ul {
top: 0;
left: 110px;
}
.nav li ul li ul:before {/*layer-2▷*/
position: absolute;
content: "";
top: 15px;
left: 30px;
border: 5px solid transparent;
border-left: 5px solid #fff;
}
.nav li ul li ul li:hover > a {/*layer-3*/
color: pink;
background: #afc6e2;
}
.nav li ul li ul.left {
top: 0;
left: -190px;
}
.nav li ul li ul.left:before,/*layer-2-left▷*/
.nav li ul li ul li ul.left:before {/*layer-3-left▷*/
position: absolute;
content: "";
top: 15px;
left: 190px;
border: 5px solid transparent;
border-right: 5px solid #fff;
}
.nav li ul li ul.left li:hover > a {/*layer-2-left*/
color: pink;
background: #afc6e2;
}
.nav li ul li ul li ul.left li:hover > a {/*layer-3-left*/
color: purple;
background: #afc6e2;
}
.content {
width: 750px;
height: 200px;
background: #eee;
margin: 0 auto;
padding: 10px;
text-align: left;
box-sizing: border-box;
}
Result
2. 縦並びドロップダウンメニュー
縦並びで表示するドロップダウンメニューのサンプルです。
① 通常のドロップダウンメニュー
HTML
<div class="contents">
<ul class="nav">
<li><a href="#">Home</a></li>
<li><a href="#">Strategy</a>
<ul>
<li><a href="#">b1</a></li>
<li><a href="#">b1</a>
<ul>
<li><a href="#">b2</a></li>
<li><a href="#">b2</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#">About</a>
<ul>
<li><a href="#">c1</a></li>
<li><a href="#">c1</a></li>
</ul>
</li>
<li><a href="#">Works</a>
<ul>
<li><a href="#">d1</a></li>
<li><a href="#">d1</a>
<ul>
<li><a href="#">d2</a></li>
<li><a href="#">d2</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#">Contact</a>
<ul>
<li><a href="#">e1</a></li>
<li><a href="#">e1</a>
<ul>
<li><a href="#">e2</a></li>
<li><a href="#">e2</a></li>
</ul>
</li>
</ul>
</li>
<!--nav--></ul>
<div class="content">
<p>通常の縦並びドロップダウンメニューです。メニュー部分にマウスオーバーするとコンテンツの上に子メニューが展開します。</p>
<p>子孫メニューの制御ははoverflowで行っております。displayでの制御も可能ですが、その場合はcontentプロパティで表示している▶矢印は見えなくなります。</p>
</div>
<!--contents--></div>
CSS
.contents {
overflow: hidden;
width: 750px;
height: 300px;
margin: 0 auto;
padding: 0;
box-sizing: border-box;
display: flex;
}
.nav {
width: 150px;
margin: 0;
padding: 0;
}
.nav li {
position: relative;
width: 150px;
height: 40px;
}
.nav > li {
border-bottom: none;
}
.nav li:last-child {
border-bottom: none;
}
.nav li:hover > ul > li {
border-bottom: none;
}
.nav li > ul > li:last-child {
border-bottom: none;
}
.nav li a {
display: block;
width: 150px;
height: 40px;
color: #fff;
font-size: 14px;
line-height: 2.8;
padding: 0 5px;
background: #9fb7d4;
border-bottom: 1px solid #eee;
box-sizing: border-box;
text-decoration: none;
}
.nav > li:hover > a {/*layer-1*/
color: orange;
background: #afc6e2;
}
.nav > li li:hover > a {/*layer-2*/
color: olive;
background: #afc6e2;
}
.nav li:hover > ul > li {
overflow: visible;
top: -40px;
left: 110px;
height: 40px;
}
.nav li ul li {
overflow: hidden;
height: 0;
left: 110px;
list-style: none;
}
.nav li ul li a {
background: #9fb7d4;
}
.nav li ul:before {
position: absolute;
content: "";
top: 14px;
left: 140px;
border: 5px solid transparent;
border-left: 5px solid #fff;
}
.nav li:hover ul li ul li:hover > a {/*layer-3*/
color: pink;
background: #afc6e2;
}
.content {
width: 600px;
height: 250px;
background: #eee;
margin: 0;
padding: 10px;
text-align: left;
box-sizing: border-box;
}
Result
② transitionプロパティで動きのあるドロップダウンメニュー
HTML
<div class="contents">
<ul class="nav">
<li><a href="#">Home</a></li>
<li><a href="#">Strategy</a>
<ul>
<li><a href="#">b1</a></li>
<li><a href="#">b1</a>
<ul>
<li><a href="#">b2</a></li>
<li><a href="#">b2</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#">About</a>
<ul>
<li><a href="#">c1</a></li>
<li><a href="#">c1</a></li>
</ul>
</li>
<li><a href="#">Works</a>
<ul>
<li><a href="#">d1</a></li>
<li><a href="#">d1</a>
<ul>
<li><a href="#">d2</a></li>
<li><a href="#">d2</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#">Contact</a>
<ul>
<li><a href="#">e1</a></li>
<li><a href="#">e1</a>
<ul>
<li><a href="#">e2</a></li>
<li><a href="#">e2</a></li>
</ul>
</li>
</ul>
</li>
<!--nav--></ul>
<div class="content">
<p>transitionプロパティで動きのある縦並びドロップダウンメニューです。メニュー部分にマウスオーバーするとコンテンツの上に子メニューが展開します。</p>
<p>transitionプロパティはdisplayでの制御をサポートしていないため、子孫メニューの制御はoverflowで行っております。displayでの制御も可能ですが、その場合動きはなくなります。</p>
</div>
<!--contents--></div>
CSS
.contents {
overflow: hidden;
width: 750px;
height: 300px;
margin: 0 auto;
padding: 0;
box-sizing: border-box;
display: flex;
}
.nav {
width: 150px;
margin: 0;
padding: 0;
}
.nav li {
position: relative;
width: 150px;
height: 40px;
}
.nav > li {
border-bottom: none;
}
.nav li:last-child {
border-bottom: none;
}
.nav li:hover > ul > li {
border-bottom: none;
}
.nav li > ul > li:last-child {
border-bottom: none;
}
.nav li a {
display: block;
width: 150px;
height: 40px;
color: #fff;
font-size: 14px;
line-height: 2.8;
padding: 0 5px;
background: #9fb7d4;
border-bottom: 1px solid #eee;
box-sizing: border-box;
text-decoration: none;
transition: 0.5s;
}
.nav > li:hover > a {/*layer-1*/
color: orange;
background: #afc6e2;
transition: 0.5s;
}
.nav > li li:hover > a {/*layer-2*/
color: olive;
background: #afc6e2;
}
.nav li:hover > ul > li {
overflow: visible;
top: -40px;
left: 110px;
height: 40px;
}
.nav li ul li {
overflow: hidden;
height: 0;
left: 110px;
list-style: none;
transition: 0.2s;
}
.nav li ul li a {
background: #9fb7d4;
transition: 0.5s;
}
.nav li ul:before {
position: absolute;
content: "";
top: 14px;
left: 140px;
border: 5px solid transparent;
border-left: 5px solid #fff;
}
.nav li:hover ul li ul li:hover > a {/*layer-3*/
color: pink;
background: #afc6e2;
}
.content {
width: 600px;
height: 250px;
background: #eee;
margin: 0;
padding: 10px;
text-align: left;
box-sizing: border-box;
}
Result
関連リンク
【Labs】スマホ対応CSSだけでドロップダウンメニュー
【Labs】タブ移動もできるドロップダウンメニュー
【Labs】jQueryでドロップダウンメニュー