横並びのドロップダウンメニューを1つずつ開く方法
横並びに配置した複数のドロップダウンメニューを1つずつ開く方法を紹介します。このサンプルでは、「メニュー1」と「メニュー2」の2つのドロップダウンメニューを横並びに配置し、それぞれのボタンをクリックしてメニューを開閉できます。どちらか一方を開いた状態でもう一方のボタンをクリックすると、先に開いていたメニューが自動で閉じ、新しく選んだメニューだけが表示されます。
複数のドロップダウンメニューを同じ場所へ配置すると、複数のメニューが同時に開いて画面が見づらくなる場合があります。このサンプルでは、JavaScriptで現在開いているメニューを確認し、クリックされたメニュー以外からis-activeクラスを削除することで、常に1つだけ開くようにしています。ヘッダーのナビゲーション、管理画面の操作メニュー、会員サイトのメニューなど、複数の選択肢を横並びで整理したい場面に利用できます。
HTMLでは開閉ボタンの文字、メニュー項目、リンク先を変更でき、CSSではメニューの横幅、ボタンの色、余白、角丸、メニュー同士の間隔、ドロップダウンの表示位置などを調整できます。JavaScriptでは複数の開閉ボタンへ同じクリック処理を設定しているため、同じ構造のドロップダウンメニューを追加することもできます。画面幅が狭い場合は縦並びへ切り替わるため、スマートフォン・タブレット・PCで利用できます。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
「メニュー1」または「メニュー2」をクリックしてください。別のメニューを開くと、先に開いていたメニューは自動で閉じます。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コード -->
<meta charset="UTF-8">
<!-- スマートフォン対応 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ページタイトル -->
<title>横並びのドロップダウンメニューを1つずつ開く</title>
<!-- CSSファイル -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- ドロップダウンメニュー全体 -->
<div class="single-open-dropdown-menu_wrap">
<!-- タイトル -->
<div class="single-open-dropdown-menu_title">
横並びのドロップダウンメニュー
</div>
<!-- 説明文 -->
<p class="single-open-dropdown-menu_text">
別のメニューを開くと、先に開いていたメニューが自動で閉じます。
</p>
<!-- 複数のドロップダウンメニューを並べるエリア -->
<div class="single-open-dropdown-menu_row">
<!-- 1つ目のドロップダウンメニュー -->
<div class="single-open-dropdown-menu_box">
<!-- 1つ目の開閉ボタン -->
<button class="single-open-dropdown-menu_button" type="button">
メニュー1
</button>
<!-- 1つ目のメニュー項目 -->
<ul class="single-open-dropdown-menu_list">
<li>
<a href="#">ホーム</a>
</li>
<li>
<a href="#">サービス</a>
</li>
<li>
<a href="#">お問い合わせ</a>
</li>
</ul>
</div>
<!-- 2つ目のドロップダウンメニュー -->
<div class="single-open-dropdown-menu_box">
<!-- 2つ目の開閉ボタン -->
<button class="single-open-dropdown-menu_button" type="button">
メニュー2
</button>
<!-- 2つ目のメニュー項目 -->
<ul class="single-open-dropdown-menu_list">
<li>
<a href="#">プロフィール</a>
</li>
<li>
<a href="#">設定</a>
</li>
<li>
<a href="#">ログアウト</a>
</li>
</ul>
</div>
</div>
</div>
<!-- JavaScriptファイル -->
<script src="script.js"></script>
</body>
</html>
サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q ダウンロードしたけど、これをネット上で動かすにはどうするの?
Googleアカウントがあれば、InfinityFreeで無料サーバーを作成して、ダウンロードしたサンプルをネット上で動かせます。
InfinityFreeを初めて利用する場合は①から、すでにサーバーを作成している場合は②へ進んでください。
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLでは「メニュー1」と「メニュー2」の2つのドロップダウンメニューを作成し、CSSでは2つのメニューを横並びに配置します。JavaScriptではクリックされたメニュー以外を一度閉じてから対象のメニューを開くことで、複数のドロップダウンメニューが同時に開かないようにしています。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlはドロップダウンメニュー全体を構成するファイルです。開閉ボタンの文字、メニュー項目、各リンクの表示内容やリンク先を変更できます。サンプルでは「メニュー1」と「メニュー2」の2つを配置しています。
style.cssはドロップダウンメニューのデザインと配置を設定するファイルです。2つのメニューを横並びにし、ボタンの色、横幅、余白、角丸、リストの表示位置、枠線、影などを設定しています。画面幅640px以下では横並びから縦並びへ切り替えます。
script.jsは複数のドロップダウンメニューを1つずつ開く処理を記述したファイルです。クリックされたボタンに対応するリストを取得し、ほかのリストからis-activeクラスを削除してから対象のリストを表示します。同じボタンをもう一度クリックすると、そのメニューを閉じることもできます。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置します。3つのファイルを同じ階層へ保存したあと、sample/index.htmlをブラウザで開いてください。index.htmlからstyle.cssとscript.jsを読み込むため、追加のライブラリは必要ありません。
「メニュー1」をクリックすると1つ目のドロップダウンメニューが開きます。その状態で「メニュー2」をクリックするとメニュー1が自動で閉じ、メニュー2だけが開きます。開いているメニューと同じボタンをもう一度クリックすると閉じます。
カスタマイズできる内容
index.htmlでは開閉ボタンの文字、メニュー項目、リンク先を変更できます。同じsingle-open-dropdown-menu_boxの構造を追加すると、横並びに配置するドロップダウンメニューを増やせます。実際に使用する場合は、各href="#"を移動先のURLへ変更してください。
style.cssでは全体の最大横幅、メニュー同士の間隔、1つのメニューの横幅、ボタンの背景色、文字サイズ、角丸、リストの表示位置、余白、枠線、影などを変更できます。
数値調整
style.css
max-width:760px;
全体の最大横幅です。値を大きくすると横に広がり、小さくするとコンパクトになります。
padding:32px;
全体の内側余白です。値を大きくすると内容と外枠の間隔が広がります。
border-radius:18px;
全体の角丸です。値を大きくすると丸みが強くなります。
font-size:22px;
タイトルの文字サイズです。値を大きくするとタイトルが大きくなります。
margin:0 0 28px;
説明文の下側余白です。28pxを大きくすると開閉ボタンとの間隔が広がります。
gap:24px;
横並びにしたドロップダウンメニュー同士の間隔です。値を大きくすると間隔が広がります。
width:220px;
1つのドロップダウンメニューの横幅です。値を大きくするとボタンとリストが横に広がります。
padding:14px;
開閉ボタンの内側余白です。値を大きくするとボタンが大きくなります。
border-radius:12px;
開閉ボタンとメニューリストの角丸です。値を大きくすると丸みが強くなります。
font-size:15px;
開閉ボタンの文字サイズです。値を大きくすると文字が大きくなります。
top:calc(100% + 10px);
ボタンとメニューリストの間隔です。10pxを大きくするとリストがボタンから離れ、小さくすると近づきます。
padding:8px 0;
メニューリストの上下余白です。8pxを大きくするとリスト上下の余白が広がります。
box-shadow:0 10px 25px ...
メニューリストの影です。10pxは下方向の位置、25pxはぼかしの大きさです。値を変更すると影の位置や広がりを調整できます。
padding:12px 18px;
メニュー項目の内側余白です。12pxが上下、18pxが左右の余白です。値を大きくすると項目が大きくなります。
レスポンシブ対応
このサンプルはレスポンシブ対応です。通常はdisplay:flexによって2つのドロップダウンメニューを横並びに表示します。画面幅640px以下ではflex-direction:columnへ変更し、メニューを縦並びに切り替えます。
スマートフォン表示では全体の内側余白をpadding:24px 18px;へ縮小し、各メニューにはwidth:100%とmax-width:280pxを設定しています。これにより、スマートフォン・タブレット・PCの画面幅に合わせて利用できます。
コメント