javaScriptを使わずにHTMLとCSSだけでドロワーメニューを作ります。ハンバーガーメニューとも言います。
スマホでよく見る3本線のボタンでメニューが出るやつです。
だれでも分かるように、サンプルコードを少しずつ作りながら説明します。
まずは完成したサンプルから。
これをHTMLとCSSだけでつくります。
javaScriptを使わないで作る
サンプルをつくっていく前に、JavaScriptを使わないメリットから。
HTMLとCSSだけでつくるとWebサーバにリクエストする回数を最小限にできます。そのしくみは、
- ブラウザからhttpリクエストを送信する。
- Webサーバーから、すべてのコンテンツのHTMLを返す。
- ページを最初に表示するときは、閉じるボタン・メニューなどをかくす。
- コンテンツを表示/非表示する動作をCSSでコントロールする。
これはコンテンツの表示・非表示の切り替えでページ遷移をしません。
また、コンテンツをリクエストで再取得しないとしても、JavaScriptのDOM操作がいらないので、その分だけブラウザの負荷を軽くできます。
あらかじめ、CSSですべての操作のスタイルが定義されているので、CSSOMの再展開がない。
(CSSOMはCSSのDOMみたいなもの。)
(JavaScriptのDOM, CSSOM操作の分がいらない。)
また、HTML, CSSに任せることでJavaScriptのコードを少なくできる。
サンプルコードの内容
今回はステップごとに進めていきます。分かりやすいところで区切っていくので必ず作れます。
サンプルコードでは次のコンテンツを用意します。
- ページ全体のエリア
- メニューの開閉ボタン
- メニューエリア
- ページ全体をおおう半透明シート
ここでウン?と思うのは『半透明シート』ですね?メニューを操作するときはそれ以外を操作をさせないために用意します。
各パーツの機能です。
ページ全体のエリア | 何もしない。 自由にページのコンテンツを配置する。 |
開くボタン | メニューを表示する。 |
閉じるボタン | メニューを閉じる。 |
メニューエリア | メニューのコンテンツを入れるボックス。 ボタンで表示/非表示がコントロールされる。 半透明シートをタップ・クリックすると非表示。 |
半透明シート | メニューが出ているとき ・ページ全体エリアにシートをかぶせる。 ・ページ全体のコンテンツをタップ・クリックさせない。 ・タップ・クリックするとメニューを閉じる。 ・メニューを閉じると消える。 |
ステップ1 - パーツを作る
はじめにそれぞれのパーツを用意します。骨組みはHTMLで肉付けはCSSです。
まだ動きの機能はありません。見た目だけを作ります。
<head>でアイコンフォントのFont Awesomeを読み込んでいます。ボタンのマークやメニュー項目のアイコンに使います。
使い方はかんたんです。
ヘッダ・フッタ
<header>, <footer>タグはHTML5から追加されました。HTML5からサイトのヘッダ・フッタはこのタグを使います。
サンプルでは<header>にドロワーメニュー(.menu-drawer)を追加しました。
メニューはどのページでも表示する『共通機能』だからです。
ページ全体エリア(.main-content)
サンプルではこのエリアがページ全体を覆います。サイトのコンテンツを追加します。
サンプルではメニューの仮のリンク先があるだけです。
ドロワーメニューのボタン
ドロワーメニューのボタンはチェックボックスとラベルで作りました。この理由はあと回しです。とりあえずこういうもんだと思ってください。
メニューの本体が『.menu-drawer .content』です。サンプルでは少しのリストを追加しました。メニューの中身はすべてこの中に入れます。
あと、メニュー以外をクリック・タップしたときチェックボックスをオフにする半透明シートもラベルで作りました。
これもあとで説明します。
HTMLは以上です。とくにむずかしいことはないでしょう。メニューのボタン、半透明シートが気になるくらいでしょうか。
次のステップからすべてCSSで作業します。
ステップ2 - パーツに装飾をつける
ここまでのHTMLの実行結果を見てみましょう。
home
contact
phone
search
まぁそうなりますね。骨がむき出しの状態です。CSSの最初はパーツに装飾をつけます。
まずはパーツ装飾のすべてのCSSはこちらです。
すぐに分からなければ一気に見る必要はないです。少しずつ分解して説明します。
メニュー開閉ボタン
メニュー開閉ボタンは、チェックボックスのラベルを使っているので、そのラベルをボタン風にします。
そして、ボタンのマークを::before, ::after疑似クラスでつくります。
マークはFont Awesomeのアイコンフォントをつかいます。
::before | 三本線。メニューを開く |
::after | バッテン。メニューを閉じる |
ここまでのHTMLを実行してみましょう。
home
contact
phone
search
たいして変わってないですが、これでいいです。いまは開く・閉じるボタンのマークが出ればいいので。
(ボタンをタップ・クリックするとチェックボックスが変化します。)
半透明シート
ページ全体にかぶせる半透明シートです。
ここはたいしたことないです。エリア全体をおおうサイズ指定と、半透明をrgba()をつかってうすい黒にしています。
なんで半透明シートもチェックボックスと連携しているかは、あとで説明します。
メニューコンテンツ
メニュー本体はただのボックスです。
ポイントは、デバイスのサイズでメニューサイズを変えているところでしょうか?(@media)
ほかは色など基本的なことしかしてません。
メニューのヘッダです。とくにむずかしいことはしてません。
メニューを配置するエリアです。高さを固定してスクロールをつけました。
メニューのフォントまわりです。
ポイントは、Flexをつかってメニューを立て並びにしたところです。
ほかはたいしたことありません。
ここまでのHTMLを実行してみましょう。
home
contact
phone
search
おー。やっとメニューらしくなりましたね?
そういえば、top, rightなどメニューの位置を指定したのに変わってません。
そこは、いまは無視してください。
次のステップで、コンテンツのコントロールをします。ここでメニューを完成させます。
ステップ3 - メニューの動きをコントロールする
ここがクライマックスです。
メニューのボタン機能、ボタンを押したときのメニューの動きをつけます。
CSSだけで行ないます。
メニューのポジション
ステップ2でtop, rigthを定義しているのに位置が変わりませんでした。これを完成させます。
メニューボタン、メニュー本体、半透明シートは、タテにスクロールしても同じ位置で固定にしたいのでfixedをつかいます。
あとは、z-indexでコンテンツの重なりを定義します。
メニュー > 半透明シート > ページコンテンツ
メニューはつねにコントロールできるように一番上。
半透明シートは、メニューを出しているときページコンテンツを操作できないようにメニューとページコンテンツのあいだに重ねます。
ここまでのHTMLを実行してみましょう。
メニューの位置が決まりました。半透明シートも出てますね?
メニューの開閉ボタン、半透明シートをクリック・タップしてみてください。左上のチェックボックスが動くのが分かります。
あともう少しです。このチェックボックスまわりをつくれば完成です。
メニューの表示/非表示
チェックボックスまわりの処理です。少しずつ分解して説明します。
まずは初期状態です。
- チェックボックス非表示(none)。
- 開くボタン表示。閉じるボタン非表示。
- 半透明シート非表示。
チェックボックスは機能だけが必要なので見えてはいけません。
最初はメニューをかくしたいので開くボタンだけを表示します。
半透明シートはメニューが出てるときだけ必要なのでかくします。
これはチェックボックスがついてないときの処理です。
ここが最大のポイントです。チェックボックスがついたときの処理です。
こんどは開くボタンをかくして閉じるボタンを表示します。
半透明シートを表示します。
メニュー本体もチェックボックスで動かします。
チェックがついていないときは、ページの右側に追いやってかくしておきます。
チェックがついているときは、かくしたものを元に戻します。
そしてtransitionで、メニューをスーッと出し入れして、なめらかなスライドにします。
ステップ4 - その他を整えて完成
もうこれでメニューはできているのですが、Webページのコンテンツ本体を整えて完成です。
メニューのリンク先が分かりやすいように整形しました。
サンプルでは同一ページでジャンプしていますが、<a>リンクで別ページにジャンプしてもいいです。むしろこちらのほうが多いでしょう。
完成したHTMLを実行してみましょう。
まとめ
HTMLとCSSだけでメニューの動きをコントロールしているのは、チェックボックスと連動しているCSSのchecked疑似クラスです。
ポイントはこれだけといってもいいでしょう。
ほかにも、checked疑似クラスをつかうとHTML・CSSだけでできることがあります。
使い方は同じで、いろいろなことができますよ?