JavaScriptでドロップダウンメニューを簡単に作成する方法12選

JavaScriptでドロップダウンメニューを作成するチュートリアルJS
この記事は約31分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

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

ドロップダウンメニューは、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 href="#">親メニュー1</a>
      <ul>
        <li><a href="#">子メニュー1-1</a></li>
        <li><a href="#">子メニュー1-2</a></li>
        <li><a href="#">子メニュー1-3</a></li>
      </ul>
    </li>
    <li><a href="#">親メニュー2</a>
      <ul>
        <li><a href="#">子メニュー2-1</a></li>
        <li><a href="#">子メニュー2-2</a></li>
        <li><a href="#">子メニュー2-3</a></li>
      </ul>
    </li>
    <li><a href="#">親メニュー3</a>
      <ul>
        <li><a href="#">子メニュー3-1</a></li>
        <li><a href="#">子メニュー3-2</a></li>
        <li><a href="#">子メニュー3-3</a></li>
      </ul>
    </li>
  </ul>
</nav>

<nav>タグでメニュー全体を囲み、<ul>と<li>タグを使って親子関係を表現しています。

<a>タグでリンク先を指定するのも忘れずに。これが、ドロップダウンメニューのHTMLの基本形ですね。

ただ、これだけではまだドロップダウンメニューらしい見た目にはなりません。

次のステップとして、CSSを使ってメニューのスタイルを整えていく必要があります。

●CSSでドロップダウンメニューのスタイルを整える

HTMLでドロップダウンメニューの骨組みができたら、次はCSSを使ってメニューのスタイルを整えていきましょう。

CSSはHTMLで作った構造に装飾を施して、見た目を整える役割を担っています。

ドロップダウンメニューをカッコよくするためには、CSSが欠かせません。

例えば、親メニューと子メニューの背景色を変えたり、ホバー時の動作を設定したり、アイコンを付けたりといったことが、CSSを使えば簡単にできるんです。

○サンプルコード2:ドロップダウンメニューの基本スタイル

それでは、CSSを使ってドロップダウンメニューに基本的なスタイルを適用してみましょう。

こんな感じでCSSを書くことができます。

nav {
  background-color: #f2f2f2;
  padding: 10px;
}

nav ul {
  list-style-type: none;
  margin: 0;
  padding: 0;
}

nav > ul > li {
  display: inline-block;
  position: relative;
}

nav a {
  display: block;
  padding: 10px;
  color: #333;
  text-decoration: none;
}

nav ul ul {
  display: none;
  position: absolute;
  top: 100%;
  left: 0;
  background-color: #fff;
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
}

nav ul ul li {
  width: 200px;
}

nav ul ul a {
  padding: 10px;
}

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 {
  display: block;
}

nav ul ul li:hover {
  background-color: #f2f2f2;
}

nav li:hover > ulで、親メニューにマウスを重ねた時に子メニューを表示するようにしています。

nav ul ul li:hoverは、子メニューの項目にマウスを重ねた時の背景色を指定しています。

これで、ドロップダウンメニューが機能するようになりました。

親メニューにマウスを重ねると、子メニューがスッと現れる感じです。

CSSのちょっとした記述で、グッとメニューに動きが出ましたね。

○サンプルコード4:レスポンシブデザイン対応

最近のWebサイトは、パソコンだけでなくスマートフォンやタブレットなど、さまざまなデバイスで閲覧されます。

どのデバイスでも見やすいメニューにするためには、レスポンシブデザインへの対応が欠かせません。

メディアクエリを使えば、画面の幅に応じてCSSを切り替えることができます。

ドロップダウンメニューをレスポンシブ対応させるなら、こんな感じのCSSを書くことになります。

@media screen and (max-width: 768px) {
  nav > ul > li {
    display: block;
    width: 100%;
  }

  nav ul ul {
    position: static;
    box-shadow: none;
  }

  nav ul ul li {
    width: 100%;
  }
}

画面幅が768px以下の時は、nav > ul > liをブロック化して縦並びにし、nav ul ulの絶対配置を解除。

nav ul ul liは横幅いっぱいに広げて表示するようにしています。

こうすることで、狭い画面でもメニューが見やすくなりました。親メニューをタップすると、子メニューがアコーディオンのように開く感じですね。

レスポンシブ対応も、CSSを工夫するだけでできてしまうんです。

●JavaScriptでドロップダウンメニューに動きをつける

HTMLとCSSでドロップダウンメニューの見た目は整いましたが、これだけではまだ物足りないですよね。

メニューをクリックした時の動作や、選択した項目の値の取得など、もっと動的な機能が欲しいところです。

そこで登場するのがJavaScriptです。

JavaScriptを使えば、ドロップダウンメニューにさまざまな動きをつけることができます。

例えば、メニューのクリックで子メニューの表示/非表示を切り替えたり、選択した項目の値を取得して別の処理に渡したりといったことが可能になります。

JavaScriptは初心者にはちょっとハードルが高いと感じるかもしれませんが、コツをつかめば意外と簡単に実装できるんですよ。

これから、JavaScriptを使ったドロップダウンメニューの実装方法をいくつか見ていきましょう。

○サンプルコード5:クリックで開閉する

まず最初は、クリックでメニューの開閉を切り替える方法です。

親メニューをクリックした時に、子メニューの表示/非表示を切り替えるイメージですね。

<nav>
  <ul>
    <li><a href="#" class="dropdown-toggle">親メニュー1</a>
      <ul class="dropdown">
        <li><a href="#">子メニュー1-1</a></li>
        <li><a href="#">子メニュー1-2</a></li>
        <li><a href="#">子メニュー1-3</a></li>
      </ul>
    </li>
    <!-- 他の親メニューも同様に記述 -->
  </ul>
</nav>
document.addEventListener('DOMContentLoaded', function() {
  const dropdownToggle = document.querySelectorAll('.dropdown-toggle');

  dropdownToggle.forEach(function(toggle) {
    toggle.addEventListener('click', function(e) {
      e.preventDefault();
      const dropdownMenu = this.nextElementSibling;
      dropdownMenu.classList.toggle('active');
    });
  });
});

HTMLでは、親メニューのリンクにdropdown-toggleクラス、子メニューのリストにdropdownクラスを付与しています。

JavaScriptでは、dropdown-toggleクラスの要素を全て取得し、クリックイベントを設定。

クリックされた時に、隣接するdropdownクラスの要素(子メニュー)にactiveクラスを付け外しして、表示/非表示を切り替えています。

CSSで.dropdowndisplaynoneにしておき、.activeが付いた時にdisplayblockにすることで、クリックで開閉する動作を実現できます。

これで、親メニューをクリックすると、子メニューがアコーディオンのように開閉するようになりました。

○サンプルコード6:選択した値を取得する

ドロップダウンメニューで項目を選択した時に、その値を取得して別の処理に渡したいことがあります。

例えば、選択した項目に応じて表示する内容を切り替えたり、フォームの送信先を変えたりといった感じですね。

<nav>
  <ul>
    <li>
      <select id="dropdown">
        <option value="">選択してください</option>
        <option value="1">項目1</option>
        <option value="2">項目2</option>
        <option value="3">項目3</option>
      </select>
    </li>
  </ul>
</nav>

<div id="result"></div>
document.addEventListener('DOMContentLoaded', function() {
  const dropdown = document.getElementById('dropdown');
  const result = document.getElementById('result');

  dropdown.addEventListener('change', function() {
    const selectedValue = this.value;
    result.textContent = `選択された値は${selectedValue}です`;
  });
});

HTMLでは、<select>タグを使ってドロップダウンメニューを作成し、各<option>value属性で値を設定しています。

JavaScriptでは、<select>要素のchangeイベントを監視し、選択された<option>valueを取得。

取得した値をresult要素のテキストに反映しています。

このように、選択した値を取得するのは意外と簡単ですね。

取得した値を使って、別の処理を実行することもできます。

例えば、switch文を使って値に応じて処理を分岐させたり、fetchを使ってサーバーにリクエストを送信したりといったことが考えられます。

○サンプルコード7:動的にメニューを生成する

ドロップダウンメニューの項目を動的に生成したい場合もあるでしょう。

例えば、サーバーから取得したデータをもとにメニューを構築したり、ユーザーの入力に応じてメニューの項目を追加したりといったケースですね。

<nav>
  <ul id="menu">
    <!-- ここにメニューの項目を動的に追加 -->
  </ul>
</nav>
document.addEventListener('DOMContentLoaded', function() {
  const menu = document.getElementById('menu');
  const menuItems = ['項目1', '項目2', '項目3', '項目4', '項目5'];

  menuItems.forEach(function(item) {
    const li = document.createElement('li');
    const a = document.createElement('a');
    a.href = '#';
    a.textContent = item;
    li.appendChild(a);
    menu.appendChild(li);
  });
});

JavaScriptでは、createElementを使って<li><a>要素を動的に生成し、textContentでリンクのテキストを設定。

生成した要素を<ul>要素に追加することで、メニューの項目を動的に生成しています。

この例では配列menuItemsをもとにメニューを生成していますが、実際にはサーバーからのレスポンスや、ユーザー入力など、さまざまなデータソースが考えられます。

動的にメニューを生成することで、状況に応じて柔軟にメニューを構成できるようになりますね。

○サンプルコード8:連動するドロップダウンメニューを作る

ドロップダウンメニューを連動させて、親メニューの選択に応じて子メニューの項目を切り替えたいことがあります。

例えば、国名を選択すると、その国の都市名が子メニューに表示されるようなイメージですね。

<nav>
  <ul>
    <li>
      <select id="country">
        <option value="">国を選択してください</option>
        <option value="japan">日本</option>
        <option value="usa">アメリカ</option>
        <option value="china">中国</option>
      </select>
    </li>
    <li>
      <select id="city">
        <option value="">都市を選択してください</option>
      </select>
    </li>
  </ul>
</nav>
document.addEventListener('DOMContentLoaded', function() {
  const countrySelect = document.getElementById('country');
  const citySelect = document.getElementById('city');

  const cityData = {
    japan: ['東京', '大阪', '名古屋'],
    usa: ['ニューヨーク', 'ロサンゼルス', 'シカゴ'],
    china: ['北京', '上海', '広州']
  };

  countrySelect.addEventListener('change', function() {
    const selectedCountry = this.value;
    const cities = cityData[selectedCountry];

    citySelect.innerHTML = '<option value="">都市を選択してください</option>';

    if (cities) {
      cities.forEach(function(city) {
        const option = document.createElement('option');
        option.value = city;
        option.textContent = city;
        citySelect.appendChild(option);
      });
    }
  });
});

JavaScriptでは、国名の<select>要素のchangeイベントを監視し、選択された国名に応じて都市名の<select>要素の<option>を動的に生成。

都市名のデータはオブジェクトcityDataに定義しておき、国名がキーになっています。

国名が選択されると、cityDataから対応する都市名の配列を取得し、forEachを使って<option>要素を生成。

生成した<option>要素を都市名の<select>要素に追加することで、連動するドロップダウンメニューを実現しています。

○サンプルコード9:アニメーション効果をつける

ドロップダウンメニューの開閉にアニメーション効果をつけると、より洗練された印象になります。

CSSのtransitionを使えば、簡単にアニメーションを実装できますよ。

.dropdown {
  display: none;
  opacity: 0;
  transition: opacity 0.3s;
}

.dropdown.active {
  display: block;
  opacity: 1;
}

CSSでは、.dropdownopacityを0に設定し、transitionopacityのアニメーションを指定。

.activeが付いた時にopacityを1にすることで、フェードインのアニメーションを実現しています。

これだけでも、ドロップダウンメニューの開閉がスムーズになって、高級感が出ますね。

他にも、heighttransformを使ったアニメーションを組み合わせれば、スライドダウンやズームインなど、さまざまな効果を付けられます。

●よくあるエラーと対処法

JavaScriptを使ってドロップダウンメニューを実装する際、思わぬエラーに遭遇することがあります。

特に、初心者のうちは原因がわからずに頭を抱えてしまうこともありますよね。

それでは、ドロップダウンメニューの実装でよく発生するエラーとその対処法を見ていきましょう。

エラーメッセージをしっかり読んで、原因を特定することが大切ですよ。

○ドロップダウンメニューが表示されない

ドロップダウンメニューを実装したのに、クリックしても子メニューが表示されないことがあります。

こんな時は、まずHTMLの構造が正しいか確認しましょう。

<ul><li>のネストが適切でないと、CSSが正しく適用されません。

また、CSSのdisplayプロパティがnoneになっていないか、visibilityプロパティがhiddenになっていないかもチェックしましょう。

これらのプロパティは要素を非表示にするので、ドロップダウンメニューが表示されなくなります。

JavaScriptの記述に誤りがある場合も、ドロップダウンメニューが動作しないことがあります。

コンソールを開いてエラーメッセージを確認し、スペルミスや構文エラーがないか見直しましょう。

○スマホで正しく動作しない

ドロップダウンメニューをスマートフォンで表示させると、意図しない動作をすることがあります。

例えば、子メニューをタップしてもリンク先に遷移しなかったり、親メニューをタップした時に子メニューが表示されなかったりといった具合です。

こうした問題は、タッチデバイス特有の挙動が原因であることが多いです。

タッチデバイスでは、mouseentermouseleaveといったマウスイベントが発生しないため、ホバー時の動作が正しく働きません。

対処法としては、タッチデバイス用のイベントを利用することです。

touchstarttouchendといったタッチイベントを監視して、適切な処理を行うようにします。

また、CSSメディアクエリを使って、タッチデバイス向けのスタイルを定義するのも効果的です。

// タッチデバイス用のイベントリスナー
document.addEventListener('touchstart', function() {
  // タッチ開始時の処理
});

document.addEventListener('touchend', function() {
  // タッチ終了時の処理
});
/* タッチデバイス用のスタイル */
@media screen and (max-width: 768px) {
  .dropdown {
    /* ドロップダウンメニューのスタイル */
  }
}

このように、デバイスの特性を考慮したイベント処理とスタイル定義を行うことで、スマートフォンでも正しく動作するドロップダウンメニューを実現できます。

○CSSが適用されない

せっかくCSSでドロップダウンメニューのスタイルを定義しても、意図したデザインにならないことがあります。

この場合、CSSが正しく適用されていない可能性があります。

まず、CSSファイルがHTMLから正しく読み込まれているか確認しましょう。

<link>タグのhref属性に指定したパスが正しいか、スペルミスがないかチェックします。

また、CSSのセレクタが適切かどうかも重要です。

HTMLの構造に合わせて、適切な詳細度のセレクタを使用しているか見直しましょう。

セレクタの詳細度が低いと、他のスタイルに上書きされてしまうことがあります。

<head>
  <!-- CSSファイルの読み込み -->
  <link rel="stylesheet" href="path/to/your/stylesheet.css">
</head>
/* 適切な詳細度のセレクタ */
nav > ul > li {
  /* 親メニューのスタイル */
}

nav > ul > li > ul {
  /* 子メニューのスタイル */
}

CSSが正しく適用されないときは、開発者ツールを活用するのも良い方法です。

ブラウザの開発者ツールを使えば、要素に適用されているCSSを確認できます。

想定したスタイルが適用されていない場合は、原因を特定しやすくなりますよ。

●ドロップダウンメニューのデザイン例

ドロップダウンメニューの実装方法がわかったところで、次はデザインのインスピレーションを得るために、実際のデザイン例を見てみましょう。

他のサイトのドロップダウンメニューを参考にすることで、自分のサイトにふさわしいデザインのアイデアが浮かぶかもしれません。

デザインを考える際は、サイトの全体的な雰囲気や、ターゲットとするユーザー層を意識することが大切です。

シンプルでモダンなデザインが好まれるサイトもあれば、遊び心のあるポップなデザインが求められるサイトもあります。

ユーザーにとって使いやすく、サイトのコンセプトにマッチしたデザインを目指しましょう。

○サンプルコード10:シンプルで使いやすいデザイン

まずは、シンプルで使いやすいドロップダウンメニューのデザイン例です。

余計な装飾を省いて、必要な情報だけを表示するスタイルは、幅広いサイトで活用できそうですね。

<nav>
  <ul>
    <li><a href="#">ホーム</a></li>
    <li><a href="#">製品紹介</a>
      <ul>
        <li><a href="#">カテゴリA</a></li>
        <li><a href="#">カテゴリB</a></li>
        <li><a href="#">カテゴリC</a></li>
      </ul>
    </li>
    <li><a href="#">お問い合わせ</a></li>
  </ul>
</nav>
nav {
  background-color: #333;
}

nav ul {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0;
  margin: 0;
  list-style: none;
}

nav > ul > li {
  position: relative;
}

nav a {
  display: block;
  padding: 15px;
  color: #fff;
  text-decoration: none;
}

nav > ul > li:hover > a {
  background-color: #555;
}

nav ul ul {
  display: none;
  position: absolute;
  top: 100%;
  left: 0;
  min-width: 200px;
  background-color: #555;
}

nav ul ul li {
  border-bottom: 1px solid #777;
}

nav ul ul li:last-child {
  border-bottom: none;
}

nav li:hover > ul {
  display: block;
}

親メニューは横並びのフレックスボックスで配置し、子メニューは絶対配置で親メニューの下に表示されるようにしています。

色味を抑えたモノトーンの配色が、シンプルで洗練された印象を与えますね。

○サンプルコード11:アイコンを使ったデザイン

次は、アイコンを使ったドロップダウンメニューのデザイン例です。

視覚的にわかりやすいアイコンを使うことで、メニューの直感的な理解を助けることができます。

<nav>
  <ul>
    <li><a href="#"><i class="fas fa-home"></i> ホーム</a></li>
    <li><a href="#"><i class="fas fa-info-circle"></i> 会社情報</a>
      <ul>
        <li><a href="#"><i class="fas fa-building"></i> 会社概要</a></li>
        <li><a href="#"><i class="fas fa-map-marker-alt"></i> アクセス</a></li>
        <li><a href="#"><i class="fas fa-briefcase"></i> 事業内容</a></li>
      </ul>
    </li>
    <li><a href="#"><i class="fas fa-envelope"></i> お問い合わせ</a></li>
  </ul>
</nav>
nav {
  background-color: #f2f2f2;
}

nav ul {
  display: flex;
  justify-content: flex-end;
  align-items: center;
  padding: 0;
  margin: 0;
  list-style: none;
}

nav > ul > li {
  position: relative;
}

nav a {
  display: flex;
  align-items: center;
  padding: 15px;
  color: #333;
  text-decoration: none;
}

nav a i {
  margin-right: 5px;
}

nav > ul > li:hover > a {
  background-color: #ddd;
}

nav ul ul {
  display: none;
  position: absolute;
  top: 100%;
  right: 0;
  min-width: 200px;
  background-color: #fff;
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
}

nav ul ul li {
  border-bottom: 1px solid #eee;
}

nav ul ul li:last-child {
  border-bottom: none;
}

nav li:hover > ul {
  display: block;
}

Font Awesomeのアイコンフォントを使用して、メニュー項目にアイコンを追加しています。

アイコンとテキストを横並びに配置するために、Flexboxを活用していますね。

ドロップシャドウを使って立体感を出すのもポイントです。

○サンプルコード12:マテリアルデザイン風

最後は、マテリアルデザイン風のドロップダウンメニューのデザイン例です。

Google製のUIデザイン言語であるマテリアルデザインは、シンプルで直感的な操作性が特徴ですね。

<nav>
  <ul>
    <li><a href="#">ホーム</a></li>
    <li><a href="#">ブログ</a>
      <ul>
        <li><a href="#">カテゴリ1</a></li>
        <li><a href="#">カテゴリ2</a></li>
        <li><a href="#">カテゴリ3</a></li>
      </ul>
    </li>
    <li><a href="#">お問い合わせ</a></li>
  </ul>
</nav>
nav {
  background-color: #4CAF50;
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
}

nav ul {
  display: flex;
  justify-content: center;
  align-items: center;
  padding: 0;
  margin: 0;
  list-style: none;
}

nav > ul > li {
  position: relative;
}

nav a {
  display: block;
  padding: 20px;
  color: #fff;
  text-decoration: none;
  font-weight: bold;
  transition: background-color 0.3s;
}

nav > ul > li:hover > a {
  background-color: #388E3C;
}

nav ul ul {
  display: none;
  position: absolute;
  top: 100%;
  left: 0;
  min-width: 200px;
  background-color: #fff;
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
}

nav ul ul li {
  border-bottom: 1px solid #eee;
}

nav ul ul li:last-child {
  border-bottom: none;
}

nav ul ul a {
  padding: 15px;
  color: #333;
  transition: background-color 0.3s;
}

nav ul ul a:hover {
  background-color: #f2f2f2;
}

nav li:hover > ul {
  display: block;
}

親メニューはマテリアルデザインの特徴である色鮮やかな背景色とドロップシャドウを使用し、立体的な印象を与えています。

子メニューは白背景にシンプルなスタイルで、ホバー時の背景色の変化にトランジションを使ってスムーズな印象を出していますね。

まとめ

JavaScriptを使ったドロップダウンメニューの作成方法を、基本的な実装からエラー対処法、デザイン例まで幅広く解説してきました。

サンプルコードを参考にしながら実際にコーディングすることで、ドロップダウンメニューの仕組みへの理解が深まるはずです。

本記事で紹介した内容を踏まえて、ぜひ自分のWebサイトにドロップダウンメニューを実装してみてください。

JavaScriptの力を借りて、Webサイトの可能性を広げていきましょう。