レスポンシブサイトなどでよく使われる、メニューボタンをクリックするとページの端からニョロっと表示されるメニューをドロワーメニューといいます。
jQueryなどで実装することが多いですが、HTMLとCSSだけで実装することもできます。
簡単に実装できるので、最近はHTMLとCSSのみでドロワーメニューを実装することが多いです。
それでは、HTMLとCSSを使ったドロワーメニューの実装方法を解説します。
HTMLとCSSで実装したドロワーメニューの基本形
まずは、HTMLとCSSで実装したドロワーメニューの基本形を解説します。装飾は一切施していない最低限のソースコードです。
ドロワーメニューのHTMLは以下のようになります。
<input type="checkbox" id="menu-toggle" class="menu-checkbox">
<label for="menu-toggle" class="menu-button">メニューボタン</label>
<div class="drawer-menu">
<ul>
<li><a href="#">メニュー1</a></li>
<li><a href="#">メニュー2</a></li>
<li><a href="#">メニュー3</a></li>
<li><a href="#">メニュー4</a></li>
<li><a href="#">メニュー5</a></li>
</ul>
<label for="menu-toggle" class="menu-close">閉じる</label>
</div>
.menu-buttom
クリックすると.menu-checkbox
にチェックが入ったり外れたりします。.menu-checkbox
にチェックが入っているときだけ.drawer-menu
が表示されるようにCSSを指定することでドロワーメニューの開閉を実装します。
ドロワーメニューのCSSは以下のようになります。
.menu-checkbox {
display: none;
}
.drawer-menu {
position: fixed;
top: 0;
left: 0;
height: 100%;
width: 200px;
transform: translateX(-100%);
transition: .5s;
background-color: #cccccc;
}
.menu-checkbox:checked ~ .drawer-menu {
transform: translateX(0);
}
.menu-checkboxはページに表示する必要が無いので非表示にします。
次に.drawer-menu
の閉じた状態のCSSを指定しています。
ポジションや背景色を指定し、transform: translateX(-100%);
でメニューを左端に隠します。
最後に.menu-checkbox:checked ~ .drawer-menu
でメニューが開いた状態のCSSを指定します。「:checked
」はチェックボックスにチェックが入った状態を指します。「~
」は同階層の要素を指定することができます。
つまり、「.menu-checkbox
にチェックが入った状態の同階層の.drawer-menu
」に対してCSSを指定することができます。
transform: translateX(0);
を指定することで左端に隠れていたメニューがスライドしながら表示されます。
あとは自分好みにCSSで装飾していくだけです。
ドロワーメニューを装飾する
ドロワーメニューをCSSで装飾していきます。主な変更点は以下の通りです。
- メニューボタンをハンバーガーメニューに変更
- メニューボタンに開閉アニメーションを追加
- 閉じるボタンを削除
- ドロワーメニューの背景をクリックするとメニューが閉じる機能を追加
変更後のHTMLは以下のようになります。
<input type="checkbox" id="menu-toggle" class="menu-checkbox">
<label for="menu-toggle" class="menu-button"><span></span></label>
<div class="drawer-menu">
<ul>
<li><a href="#">メニュー1</a></li>
<li><a href="#">メニュー2</a></li>
<li><a href="#">メニュー3</a></li>
<li><a href="#">メニュー4</a></li>
<li><a href="#">メニュー5</a></li>
</ul>
</div>
<label for="menu-toggle" class="menu-background"></label>
.menu-buttonを少し変更したのと、.menu-backgroundを追加したくらいです。
CSSは以下のように変更しました。
/* チェックボックスを非表示 */
.menu-checkbox {
display: none;
}
/* メニューボタンの装飾 */
.menu-button {
display: block;
position: fixed;
top: 20px;
right: 20px;
z-index: 200;
height: 30px;
width: 40px;
cursor: pointer;
}
.menu-button::before,
.menu-button::after {
content: '';
transition: .3s;
}
.menu-button::before,
.menu-button::after,
.menu-button span {
display: block;
position: absolute;
left: 0;
height: 2px;
width: 100%;
margin-top: -1px;
background-color: #000000;
}
.menu-button::before {
top: 0;
}
.menu-button::after {
bottom: 0;
}
.menu-button span {
top: 50%;
}
/* メニューボタンのアニメーション */
.menu-checkbox:checked ~ .menu-button::before {
top: 50%;
transform: rotate(45deg);
}
.menu-checkbox:checked ~ .menu-button::after {
top: 50%;
transform: rotate(-45deg);
}
.menu-checkbox:checked ~ .menu-button span {
display: none;
}
/* ドロワーメニューの装飾 */
.drawer-menu {
position: fixed;
top: 0;
left: 0;
z-index: 200;
height: 100%;
width: 200px;
transform: translateX(-100%);
transition: .5s;
background-color: #fff;
}
.drawer-menu ul {
margin: 0;
padding: 0;
list-style-type: none;
}
.drawer-menu li {
border-bottom: 1px dotted #ccc;
}
.drawer-menu a {
display: block;
padding: 15px;
color: #000000;
text-decoration: none;
}
/* ドロワーメニューの開閉 */
.menu-checkbox:checked ~ .drawer-menu {
transform: translateX(0);
}
/* ドロワーメニューの背景 */
.menu-background {
display: none;
position: fixed;
top: 0;
left: 0;
z-index: 100;
height: 100%;
width: 100%;
background-color: rgba(0, 0, 0, .5);
cursor: pointer;
}
.menu-checkbox:checked ~ .menu-background {
display: block;
}
ハンバーガーメニューのアニメーションやドロワーメニューの背景の指定を追加したため、少々ボリュームが多くなりました。ひとつひとつ解説すると長くなってしまうので割愛しますが、特に難しい指定はしていません。
HTMLとCSSのみでドロワーメニューを実装する方法のまとめ
レスポンシブサイトなどでよく使うドロワーメニューはHTMLとCSSだけで実装することもできます。普段、javascriptよりHTMLとCSSを触ることが多い方にとっては意外と使いやすいと思います。
CSSを変更することで、ドロワーメニューを上からスライドさせたり、全画面にフェードインで表示したり、いろいろな動きを表現できます。
ぜひいろいろなドロワーメニューを作って遊んでみてください。