●ドロップダウンメニューとは?
ドロップダウンメニューは、Webサイトでよく見かける機能の1つです。
マウスカーソルを重ねたり、クリックしたりすると、メニューが展開して表示されるのが特徴ですね。
スペースを節約しつつ、多くの項目を表示できるので、ナビゲーションメニューやフォームの選択肢などに使われることが多いです。
○ドロップダウンメニューの特徴
ドロップダウンメニューの最大の特徴は、メニューが階層構造になっていることです。
親メニューをクリックすると、その下に子メニューが表示される仕組みになっています。
この階層構造によって、限られたスペースにたくさんの選択肢を収めることができるんです。
また、ドロップダウンメニューは、マウスオーバーやクリックなどのユーザーアクションに反応して表示されるのも特徴です。
普段は非表示になっているので、画面がすっきりと見えます。必要な時だけメニューが現れるので、ユーザーを混乱させずに済むというメリットもありますね。
○ドロップダウンメニューを使うメリット
ドロップダウンメニューを使うメリットは、大きく分けて3つあります。
1つ目は、スペースの有効活用です。
特に、スマートフォンのような小さな画面では、限られたスペースを効率的に使う必要があります。
ドロップダウンメニューなら、たくさんの項目を表示しても、画面を圧迫せずに済みます。
2つ目は、ユーザビリティの向上です。
ドロップダウンメニューは、視覚的にわかりやすい構造をしています。
親メニューと子メニューの関係性が一目で把握できるので、ユーザーは目的の項目をすぐに見つけられます。
また、マウスオーバーやクリックで操作できるので、直感的に使えるのもポイントですね。
3つ目は、デザインの自由度の高さです。CSSを使えば、ドロップダウンメニューのデザインを自由にカスタマイズできます。
サイトのデザインコンセプトに合わせて、色や形、アニメーションなどを調整できるので、オリジナリティあふれるメニューを作ることができます。
ドロップダウンメニューは、使い方次第でWebサイトの使いやすさを大きく向上させられる機能です。
上手に活用して、ユーザーにストレスのないWebサイトを作っていきましょう。
●HTMLでドロップダウンメニューの骨組みを作る
さて、ドロップダウンメニューを作るには、まずHTMLでメニューの骨組みを作ることから始めます。
HTMLはWebページの構造を作る言語ですから、ドロップダウンメニューの土台となる部分を担当するんですね。
基本的には、<ul>タグと<li>タグを使って、メニューの項目を階層構造で表現していきます。
<ul>タグは親メニュー、<li>タグは子メニューを表すイメージですね。
ただ、ここで気をつけたいのが、ドロップダウンメニューらしい見た目にするためには、HTMLだけでは不十分だということです。
HTMLはあくまでも構造を作る言語なので、見た目の装飾はCSSが担当します。
だから、HTMLでメニューの骨組みを作ったら、次はCSSでスタイルを整えていくことになりますよ。
とはいえ、HTMLの書き方によってCSSの適用のしやすさが変わってくるので、HTMLの段階からドロップダウンメニューっぽい構造を意識することが大切です。具
体的には、親メニューと子メニューを<ul>と<li>で適切に入れ子にしたり、アイコン用の<span>タグを用意したりといった工夫が必要になってきますね。
○サンプルコード1:基本的なHTMLの構造
それでは、ドロップダウンメニューのHTMLの基本的な構造を見てみましょう。
こんな感じでメニューを作ることができます。
<nav>タグでメニュー全体を囲み、<ul>と<li>タグを使って親子関係を表現しています。
<a>タグでリンク先を指定するのも忘れずに。これが、ドロップダウンメニューのHTMLの基本形ですね。
ただ、これだけではまだドロップダウンメニューらしい見た目にはなりません。
次のステップとして、CSSを使ってメニューのスタイルを整えていく必要があります。
●CSSでドロップダウンメニューのスタイルを整える
HTMLでドロップダウンメニューの骨組みができたら、次はCSSを使ってメニューのスタイルを整えていきましょう。
CSSはHTMLで作った構造に装飾を施して、見た目を整える役割を担っています。
ドロップダウンメニューをカッコよくするためには、CSSが欠かせません。
例えば、親メニューと子メニューの背景色を変えたり、ホバー時の動作を設定したり、アイコンを付けたりといったことが、CSSを使えば簡単にできるんです。
○サンプルコード2:ドロップダウンメニューの基本スタイル
それでは、CSSを使ってドロップダウンメニューに基本的なスタイルを適用してみましょう。
こんな感じでCSSを書くことができます。
nav
にはメニュー全体の背景色とパディングを指定しています。
nav ul
ではリストのマーカーを非表示にしてマージンとパディングをリセット。
nav > ul > li
は親メニューを横並びにするためにインラインブロック化し、子メニューの基準位置にするためにposition: relative
を指定しています。
nav a
ではリンクのデフォルトスタイルを調整し、nav ul ul
で子メニューを非表示にして、絶対配置で親メニューの下に配置。
nav ul ul li
で子メニューの幅を指定し、nav ul ul a
で子メニューのリンクのパディングを調整しています。
これで、ドロップダウンメニューっぽい見た目になりましたね。でも、まだ子メニューにマウスを重ねても表示されません。
それを実現するには、もう一工夫必要です。
○サンプルコード3:ホバー時のスタイル
子メニューをホバー時に表示させるには、CSSの:hover
疑似クラスを使います。
親メニューにマウスを重ねた時に、子メニューを表示させるイメージですね。
nav li:hover > ul
で、親メニューにマウスを重ねた時に子メニューを表示するようにしています。
nav ul ul li:hover
は、子メニューの項目にマウスを重ねた時の背景色を指定しています。
これで、ドロップダウンメニューが機能するようになりました。
親メニューにマウスを重ねると、子メニューがスッと現れる感じです。
CSSのちょっとした記述で、グッとメニューに動きが出ましたね。
○サンプルコード4:レスポンシブデザイン対応
最近のWebサイトは、パソコンだけでなくスマートフォンやタブレットなど、さまざまなデバイスで閲覧されます。
どのデバイスでも見やすいメニューにするためには、レスポンシブデザインへの対応が欠かせません。
メディアクエリを使えば、画面の幅に応じてCSSを切り替えることができます。
ドロップダウンメニューをレスポンシブ対応させるなら、こんな感じのCSSを書くことになります。
画面幅が768px以下の時は、nav > ul > li
をブロック化して縦並びにし、nav ul ul
の絶対配置を解除。
nav ul ul li
は横幅いっぱいに広げて表示するようにしています。
こうすることで、狭い画面でもメニューが見やすくなりました。親メニューをタップすると、子メニューがアコーディオンのように開く感じですね。
レスポンシブ対応も、CSSを工夫するだけでできてしまうんです。
●JavaScriptでドロップダウンメニューに動きをつける
HTMLとCSSでドロップダウンメニューの見た目は整いましたが、これだけではまだ物足りないですよね。
メニューをクリックした時の動作や、選択した項目の値の取得など、もっと動的な機能が欲しいところです。
そこで登場するのがJavaScriptです。
JavaScriptを使えば、ドロップダウンメニューにさまざまな動きをつけることができます。
例えば、メニューのクリックで子メニューの表示/非表示を切り替えたり、選択した項目の値を取得して別の処理に渡したりといったことが可能になります。
JavaScriptは初心者にはちょっとハードルが高いと感じるかもしれませんが、コツをつかめば意外と簡単に実装できるんですよ。
これから、JavaScriptを使ったドロップダウンメニューの実装方法をいくつか見ていきましょう。
○サンプルコード5:クリックで開閉する
まず最初は、クリックでメニューの開閉を切り替える方法です。
親メニューをクリックした時に、子メニューの表示/非表示を切り替えるイメージですね。
HTMLでは、親メニューのリンクにdropdown-toggle
クラス、子メニューのリストにdropdown
クラスを付与しています。
JavaScriptでは、dropdown-toggle
クラスの要素を全て取得し、クリックイベントを設定。
クリックされた時に、隣接するdropdown
クラスの要素(子メニュー)にactive
クラスを付け外しして、表示/非表示を切り替えています。
CSSで.dropdown
のdisplay
をnone
にしておき、.active
が付いた時にdisplay
をblock
にすることで、クリックで開閉する動作を実現できます。
これで、親メニューをクリックすると、子メニューがアコーディオンのように開閉するようになりました。
○サンプルコード6:選択した値を取得する
ドロップダウンメニューで項目を選択した時に、その値を取得して別の処理に渡したいことがあります。
例えば、選択した項目に応じて表示する内容を切り替えたり、フォームの送信先を変えたりといった感じですね。
HTMLでは、<select>
タグを使ってドロップダウンメニューを作成し、各<option>
にvalue
属性で値を設定しています。
JavaScriptでは、<select>
要素のchange
イベントを監視し、選択された<option>
のvalue
を取得。
取得した値をresult
要素のテキストに反映しています。
このように、選択した値を取得するのは意外と簡単ですね。
取得した値を使って、別の処理を実行することもできます。
例えば、switch
文を使って値に応じて処理を分岐させたり、fetch
を使ってサーバーにリクエストを送信したりといったことが考えられます。
○サンプルコード7:動的にメニューを生成する
ドロップダウンメニューの項目を動的に生成したい場合もあるでしょう。
例えば、サーバーから取得したデータをもとにメニューを構築したり、ユーザーの入力に応じてメニューの項目を追加したりといったケースですね。
JavaScriptでは、createElement
を使って<li>
と<a>
要素を動的に生成し、textContent
でリンクのテキストを設定。
生成した要素を<ul>
要素に追加することで、メニューの項目を動的に生成しています。
この例では配列menuItems
をもとにメニューを生成していますが、実際にはサーバーからのレスポンスや、ユーザー入力など、さまざまなデータソースが考えられます。
動的にメニューを生成することで、状況に応じて柔軟にメニューを構成できるようになりますね。
○サンプルコード8:連動するドロップダウンメニューを作る
ドロップダウンメニューを連動させて、親メニューの選択に応じて子メニューの項目を切り替えたいことがあります。
例えば、国名を選択すると、その国の都市名が子メニューに表示されるようなイメージですね。
JavaScriptでは、国名の<select>
要素のchange
イベントを監視し、選択された国名に応じて都市名の<select>
要素の<option>
を動的に生成。
都市名のデータはオブジェクトcityData
に定義しておき、国名がキーになっています。
国名が選択されると、cityData
から対応する都市名の配列を取得し、forEach
を使って<option>
要素を生成。
生成した<option>
要素を都市名の<select>
要素に追加することで、連動するドロップダウンメニューを実現しています。
○サンプルコード9:アニメーション効果をつける
ドロップダウンメニューの開閉にアニメーション効果をつけると、より洗練された印象になります。
CSSのtransitionを使えば、簡単にアニメーションを実装できますよ。
CSSでは、.dropdown
にopacity
を0に設定し、transition
でopacity
のアニメーションを指定。
.active
が付いた時にopacity
を1にすることで、フェードインのアニメーションを実現しています。
これだけでも、ドロップダウンメニューの開閉がスムーズになって、高級感が出ますね。
他にも、height
やtransform
を使ったアニメーションを組み合わせれば、スライドダウンやズームインなど、さまざまな効果を付けられます。
●よくあるエラーと対処法
JavaScriptを使ってドロップダウンメニューを実装する際、思わぬエラーに遭遇することがあります。
特に、初心者のうちは原因がわからずに頭を抱えてしまうこともありますよね。
それでは、ドロップダウンメニューの実装でよく発生するエラーとその対処法を見ていきましょう。
エラーメッセージをしっかり読んで、原因を特定することが大切ですよ。
○ドロップダウンメニューが表示されない
ドロップダウンメニューを実装したのに、クリックしても子メニューが表示されないことがあります。
こんな時は、まずHTMLの構造が正しいか確認しましょう。
<ul>
と<li>
のネストが適切でないと、CSSが正しく適用されません。
また、CSSのdisplay
プロパティがnone
になっていないか、visibility
プロパティがhidden
になっていないかもチェックしましょう。
これらのプロパティは要素を非表示にするので、ドロップダウンメニューが表示されなくなります。
JavaScriptの記述に誤りがある場合も、ドロップダウンメニューが動作しないことがあります。
コンソールを開いてエラーメッセージを確認し、スペルミスや構文エラーがないか見直しましょう。
○スマホで正しく動作しない
ドロップダウンメニューをスマートフォンで表示させると、意図しない動作をすることがあります。
例えば、子メニューをタップしてもリンク先に遷移しなかったり、親メニューをタップした時に子メニューが表示されなかったりといった具合です。
こうした問題は、タッチデバイス特有の挙動が原因であることが多いです。
タッチデバイスでは、mouseenter
やmouseleave
といったマウスイベントが発生しないため、ホバー時の動作が正しく働きません。
対処法としては、タッチデバイス用のイベントを利用することです。
touchstart
やtouchend
といったタッチイベントを監視して、適切な処理を行うようにします。
また、CSSメディアクエリを使って、タッチデバイス向けのスタイルを定義するのも効果的です。
このように、デバイスの特性を考慮したイベント処理とスタイル定義を行うことで、スマートフォンでも正しく動作するドロップダウンメニューを実現できます。
○CSSが適用されない
せっかくCSSでドロップダウンメニューのスタイルを定義しても、意図したデザインにならないことがあります。
この場合、CSSが正しく適用されていない可能性があります。
まず、CSSファイルがHTMLから正しく読み込まれているか確認しましょう。
<link>
タグのhref
属性に指定したパスが正しいか、スペルミスがないかチェックします。
また、CSSのセレクタが適切かどうかも重要です。
HTMLの構造に合わせて、適切な詳細度のセレクタを使用しているか見直しましょう。
セレクタの詳細度が低いと、他のスタイルに上書きされてしまうことがあります。
CSSが正しく適用されないときは、開発者ツールを活用するのも良い方法です。
ブラウザの開発者ツールを使えば、要素に適用されているCSSを確認できます。
想定したスタイルが適用されていない場合は、原因を特定しやすくなりますよ。
●ドロップダウンメニューのデザイン例
ドロップダウンメニューの実装方法がわかったところで、次はデザインのインスピレーションを得るために、実際のデザイン例を見てみましょう。
他のサイトのドロップダウンメニューを参考にすることで、自分のサイトにふさわしいデザインのアイデアが浮かぶかもしれません。
デザインを考える際は、サイトの全体的な雰囲気や、ターゲットとするユーザー層を意識することが大切です。
シンプルでモダンなデザインが好まれるサイトもあれば、遊び心のあるポップなデザインが求められるサイトもあります。
ユーザーにとって使いやすく、サイトのコンセプトにマッチしたデザインを目指しましょう。
○サンプルコード10:シンプルで使いやすいデザイン
まずは、シンプルで使いやすいドロップダウンメニューのデザイン例です。
余計な装飾を省いて、必要な情報だけを表示するスタイルは、幅広いサイトで活用できそうですね。
親メニューは横並びのフレックスボックスで配置し、子メニューは絶対配置で親メニューの下に表示されるようにしています。
色味を抑えたモノトーンの配色が、シンプルで洗練された印象を与えますね。
○サンプルコード11:アイコンを使ったデザイン
次は、アイコンを使ったドロップダウンメニューのデザイン例です。
視覚的にわかりやすいアイコンを使うことで、メニューの直感的な理解を助けることができます。
Font Awesomeのアイコンフォントを使用して、メニュー項目にアイコンを追加しています。
アイコンとテキストを横並びに配置するために、Flexboxを活用していますね。
ドロップシャドウを使って立体感を出すのもポイントです。
○サンプルコード12:マテリアルデザイン風
最後は、マテリアルデザイン風のドロップダウンメニューのデザイン例です。
Google製のUIデザイン言語であるマテリアルデザインは、シンプルで直感的な操作性が特徴ですね。
親メニューはマテリアルデザインの特徴である色鮮やかな背景色とドロップシャドウを使用し、立体的な印象を与えています。
子メニューは白背景にシンプルなスタイルで、ホバー時の背景色の変化にトランジションを使ってスムーズな印象を出していますね。
まとめ
JavaScriptを使ったドロップダウンメニューの作成方法を、基本的な実装からエラー対処法、デザイン例まで幅広く解説してきました。
サンプルコードを参考にしながら実際にコーディングすることで、ドロップダウンメニューの仕組みへの理解が深まるはずです。
本記事で紹介した内容を踏まえて、ぜひ自分のWebサイトにドロップダウンメニューを実装してみてください。
JavaScriptの力を借りて、Webサイトの可能性を広げていきましょう。