上側へ展開するドロップダウンメニューを作る方法
上側へ展開するドロップダウンメニューを作る方法を紹介します。このサンプルでは、メニューボタンをクリックすると、そのボタンのすぐ上にリンク一覧が展開されるドロップダウンメニューをHTML・CSS・JavaScriptで実装します。もう一度ボタンをクリックするとメニューが閉じるシンプルな仕組みで、通常の下側へ開くメニューとは異なる方向へリンク一覧を表示できます。
画面の下側に配置したナビゲーション、フッター付近のメニュー、管理画面の操作メニュー、ECサイトや会員サイトの補助メニューなど、ボタンより下側の表示スペースが限られている場面に利用できます。リンク一覧を上側へ表示することで、ボタンの位置を変えずに複数のリンクをまとめて表示できます。また、リンクへマウスを重ねると背景色が変わるため、選択しようとしている項目も確認しやすくなっています。
HTMLではメニューボタンの文字や「ホーム」「サービス」「お問い合わせ」などのリンク内容を変更できます。CSSではメニュー全体の横幅、余白、ボタンの高さ、角丸、背景色、上側へ展開するリンク一覧の位置や影などを調整できます。JavaScriptではボタンをクリックするたびにis-openクラスを切り替え、メニューの表示・非表示を制御します。レスポンシブにも対応しているため、スマートフォン・タブレット・PCで利用できる上側展開型のドロップダウンメニューとして活用できます。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
「メニュー」をクリックすると、ボタンの上側へドロップダウンメニューが展開します。もう一度クリックすると閉じます。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コード -->
<meta charset="UTF-8">
<!-- スマートフォン対応 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ページタイトル -->
<title>上側へ展開するドロップダウンメニュー</title>
<!-- CSSファイル -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- ドロップダウンメニュー全体 -->
<div class="top-dropdown-menu_wrap">
<!-- タイトル -->
<div class="top-dropdown-menu_title">
上側へ展開するドロップダウンメニュー
</div>
<!-- 説明文 -->
<p class="top-dropdown-menu_text">
ボタンをクリックすると、リンク一覧がボタンの上側へ展開します。
</p>
<!-- メニューを中央へ配置するエリア -->
<div class="top-dropdown-menu_group">
<!-- 開閉ボタンとリンク一覧をまとめるエリア -->
<div class="top-dropdown-menu_area">
<!-- ドロップダウンメニューの開閉ボタン -->
<button
class="top-dropdown-menu_button"
type="button"
data-top-dropdown-menu-button="">
メニュー
<!-- 上向き矢印 -->
<span class="top-dropdown-menu_arrow">
▲
</span>
</button>
<!-- ボタンの上側へ展開するリンク一覧 -->
<ul
class="top-dropdown-menu_list"
data-top-dropdown-menu-list="">
<!-- ホームへのリンク -->
<li>
<a class="top-dropdown-menu_link" href="#">
ホーム
</a>
</li>
<!-- サービスへのリンク -->
<li>
<a class="top-dropdown-menu_link" href="#">
サービス
</a>
</li>
<!-- お問い合わせへのリンク -->
<li>
<a class="top-dropdown-menu_link" 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で開閉ボタンとリンク一覧を作成し、CSSの絶対配置を使用してリンク一覧をボタンの上側へ配置します。JavaScriptでは開閉ボタンをクリックしたときにis-openクラスを切り替え、上側へ配置したリンク一覧の表示・非表示を変更します。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlはドロップダウンメニューのHTML構造を作るファイルです。「メニュー」の開閉ボタンと、「ホーム」「サービス」「お問い合わせ」の3つのリンクを配置しています。ボタンの文字、リンク名、href属性は用途に合わせて変更できます。
style.cssはドロップダウンメニューのデザインと展開位置を設定するファイルです。全体の横幅や余白、ボタンのサイズ、背景色、角丸、リンク一覧の横幅、余白、影などを設定します。リンク一覧にはposition:absolute;とbottom:calc(100% + 10px);を指定し、開閉ボタンの上側へ表示しています。
script.jsはドロップダウンメニューを開閉するファイルです。開閉ボタンをクリックするとリンク一覧へis-openクラスを付け外しし、CSSのdisplay:none;とdisplay:block;を切り替えます。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置します。3つのファイルを同じ階層へ保存したあと、sample/index.htmlをブラウザで開いてください。index.htmlからstyle.cssとscript.jsを読み込む構成になっているため、追加のライブラリや外部サービスは必要ありません。
画面中央の「メニュー」をクリックすると、「ホーム」「サービス」「お問い合わせ」のリンク一覧がボタンの上側へ展開します。もう一度「メニュー」をクリックするとリンク一覧が閉じます。実際に使用する場合は、index.htmlの各href="#"を移動先のURLへ変更してください。
カスタマイズできる内容
index.htmlでは開閉ボタンの「メニュー」という文字や、リンク一覧の「ホーム」「サービス」「お問い合わせ」を変更できます。リンク先は各a要素のhref属性で設定できます。必要に応じてli要素とa要素を同じ構造で追加すると、リンク項目を増やせます。
style.cssではドロップダウンメニュー全体の横幅や余白、開閉ボタンの高さ、背景色、角丸、リンク一覧の位置、内側余白、角丸、影、リンクへマウスを重ねたときの背景色などを変更できます。
数値調整
style.css
padding:220px 20px 40px;
ページ全体の内側余白です。先頭の220pxは上側へ展開するリンク一覧の表示領域を確保するための上余白です。値を大きくすると上側の空間が広がり、小さくすると狭くなります。
max-width:700px;
ドロップダウンメニューを配置する全体エリアの最大横幅です。値を大きくすると全体が横に広がり、小さくするとコンパクトになります。
margin:40px auto;
全体の上下余白です。40pxを大きくすると上下の間隔が広がり、小さくすると狭くなります。
padding:32px;
全体の内側余白です。値を大きくすると内容と外枠の間隔が広がり、小さくすると狭くなります。
border-radius:18px;
全体の角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。
font-size:22px;
タイトルの文字サイズです。値を大きくすると文字が大きくなり、小さくすると控えめになります。
margin:0 0 24px;
説明文の下側余白です。24pxを大きくすると開閉ボタンとの間隔が広がり、小さくすると狭くなります。
max-width:280px;
開閉ボタンとリンク一覧の最大横幅です。値を大きくするとメニューが横に広がり、小さくすると狭くなります。
min-height:52px;
開閉ボタンの最小高さです。値を大きくするとボタンが高くなり、小さくすると低くなります。
padding:14px 18px;
開閉ボタンの内側余白です。上下14pxを大きくするとボタンが高くなり、左右18pxを大きくすると文字とボタン端の間隔が広がります。
border-radius:10px;
開閉ボタンとリンク一覧の角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。
margin-left:12px;
ボタン文字と矢印の間隔です。値を大きくすると間隔が広がります。
font-size:12px;
上向き矢印の大きさです。値を大きくすると矢印が大きくなります。
bottom:calc(100% + 10px);
開閉ボタンと上側へ展開するリンク一覧の間隔です。10pxを大きくするとボタンとリンク一覧の間隔が広がり、小さくすると近くなります。
z-index:10;
リンク一覧の重なり順です。値を大きくすると、同じ重なり条件にある他の要素より手前へ表示しやすくなります。
padding:8px;
リンク一覧の内側余白です。値を大きくすると外枠と各リンクの間隔が広がります。
box-shadow:0 -10px 24px ...
リンク一覧の影です。-10pxは影の上方向の位置、24pxはぼかしの大きさです。値を変更すると影の位置や広がりを調整できます。
padding:12px 14px;
各リンクの内側余白です。上下12pxを大きくするとリンクが高くなり、左右14pxを大きくすると文字と端の間隔が広がります。
border-radius:8px;
各リンクの角丸です。値を大きくするとマウスオーバー時の背景に丸みが強くなります。
レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssで全体とメニューエリアにwidth:100%を指定し、それぞれmax-width:700pxとmax-width:280pxで最大横幅を制限しています。そのため、画面が狭くなると利用できる横幅に合わせて縮小します。
また、画面幅640px以下ではメディアクエリによって全体の内側余白をpadding:24px 18px;へ変更しています。スマートフォンでは左右の余白を抑えながら、タブレットやPCでは余裕のあるレイアウトで表示できます。
コメント