立体的なドロップダウンメニューを作る方法
立体的なドロップダウンメニューを作る方法を紹介します。このサンプルでは、開閉ボタンと選択肢の両方に影や押し込み表現を付け、通常のフラットなメニューよりも奥行きのあるデザインにしています。開閉ボタンをクリックすると下に選択肢が表示され、選択肢へマウスを重ねると少し浮き上がり、クリックすると押し込まれたように動きます。
選択肢は「商品について」「サービスについて」「料金について」「その他」の4項目を用意しています。初期状態では開閉ボタンに「選択してください」と表示し、選択肢をクリックすると選んだ内容へ文字が切り替わります。同時に選択した項目を青色で表示し、その後ドロップダウンメニューを閉じます。お問い合わせ画面、会員サイトの設定画面、ECサイトの商品分類など、複数の候補から1つを選択する場面で利用できます。
HTMLではタイトル、説明文、ラベル、選択肢の内容を変更でき、CSSでは横幅、余白、角丸、背景色、影、ボタンの高さ、選択肢同士の間隔、押し込み量やアニメーション時間などを調整できます。JavaScriptではメニューの開閉、選択状態の切り替え、選択した文字の反映を行います。レスポンシブにも対応しているため、スマートフォン・タブレット・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="three-dimensional-dropdown_wrap">
<!-- タイトル -->
<div class="three-dimensional-dropdown_title">
立体的なドロップダウンメニュー
</div>
<!-- 説明文 -->
<p class="three-dimensional-dropdown_text">
ボタンをクリックして、お問い合わせ内容を選択してください。
</p>
<!-- ドロップダウンメニューの選択エリア -->
<div class="three-dimensional-dropdown_field">
<!-- 項目名 -->
<div class="three-dimensional-dropdown_label">
お問い合わせ内容
</div>
<!-- ドロップダウンメニューを開閉するボタン -->
<button
class="three-dimensional-dropdown_trigger"
type="button"
aria-expanded="false">
<!-- 選択した内容を表示する部分 -->
<span class="three-dimensional-dropdown_value">
選択してください
</span>
<!-- 開閉状態を表す矢印 -->
<span
class="three-dimensional-dropdown_arrow"
aria-hidden="true">
</span>
</button>
<!-- ドロップダウンメニューの選択肢一覧 -->
<ul class="three-dimensional-dropdown_options">
<!-- 商品について -->
<li class="three-dimensional-dropdown_option">
<button
class="three-dimensional-dropdown_option-button"
type="button"
data-value="商品について">
商品について
</button>
</li>
<!-- サービスについて -->
<li class="three-dimensional-dropdown_option">
<button
class="three-dimensional-dropdown_option-button"
type="button"
data-value="サービスについて">
サービスについて
</button>
</li>
<!-- 料金について -->
<li class="three-dimensional-dropdown_option">
<button
class="three-dimensional-dropdown_option-button"
type="button"
data-value="料金について">
料金について
</button>
</li>
<!-- その他 -->
<li class="three-dimensional-dropdown_option">
<button
class="three-dimensional-dropdown_option-button"
type="button"
data-value="その他">
その他
</button>
</li>
</ul>
</div>
<!-- ドロップダウンメニューの補足説明 -->
<p class="three-dimensional-dropdown_description">
開閉ボタンと選択肢の両方に影と押し込み表現を付けた、立体的なドロップダウンメニューです。
</p>
</div>
<!-- JavaScriptファイル -->
<script src="script.js"></script>
</body>
</html>
サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q ダウンロードしたけど、これをネット上で動かすにはどうするの?
Googleアカウントがあれば、InfinityFreeで無料サーバーを作成して、ダウンロードしたサンプルをネット上で動かせます。
InfinityFreeを初めて利用する場合は①から、すでにサーバーを作成している場合は②へ進んでください。
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLではタイトル、説明文、開閉ボタン、4つの選択肢を作成し、CSSでは開閉ボタンと選択肢へ影や押し込み表現を付けて立体的なデザインにします。JavaScriptではドロップダウンメニューの開閉、選択状態の切り替え、選択した内容の表示を行います。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlはドロップダウンメニュー全体を構成するファイルです。タイトル、説明文、「お問い合わせ内容」の項目名、「選択してください」の初期表示、「商品について」「サービスについて」「料金について」「その他」の4つの選択肢を変更できます。
style.cssはドロップダウンメニューのデザインを設定するファイルです。全体の横幅や余白、開閉ボタンと選択肢の高さ、背景色、枠線、角丸、影、マウスオーバー時の浮き上がり、クリック時の押し込み、開閉時のアニメーションなどを変更できます。
script.jsはドロップダウンメニューの動作を設定するファイルです。開閉ボタンをクリックしたときの表示切り替え、選択した項目へのis-selectedクラスの付与、data-valueの内容を開閉ボタンへ反映する処理、選択後にメニューを閉じる処理を行います。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置します。3つのファイルを同じ階層へ保存したあと、sample/index.htmlをブラウザで開いてください。index.htmlからstyle.cssとscript.jsを読み込む構成になっているため、そのままドロップダウンメニューを動作確認できます。
初期状態では開閉ボタンに「選択してください」と表示されます。ボタンをクリックすると4つの選択肢が下方向へ表示されます。選択肢をクリックすると、その項目が選択状態になり、選択した内容が開閉ボタンへ表示されたあとメニューが閉じます。
カスタマイズできる内容
index.htmlではタイトル、説明文、項目名、初期表示、選択肢の文字を変更できます。選択肢を変更する場合は、ボタン内に表示する文字とdata-valueの値を用途に合わせて変更してください。お問い合わせ内容だけでなく、商品カテゴリーや各種設定項目などの選択にも利用できます。
style.cssでは全体の横幅、余白、角丸、背景色、開閉ボタンと選択肢の高さ、文字サイズ、枠線、影、選択肢同士の間隔、マウスオーバー時とクリック時の移動量、開閉アニメーションの速度などを変更できます。
script.jsでは選択後にメニューを閉じるまでの待機時間を変更できます。開閉処理や選択状態の切り替え、選択内容の反映もこのファイルで行っています。
数値調整
style.css
max-width:700px;
ドロップダウンメニュー全体の最大横幅です。値を大きくすると全体が横に広がり、小さくするとコンパクトになります。
margin:40px auto;
全体の上下余白です。40pxを大きくすると上下の間隔が広がり、小さくすると狭くなります。
padding:36px 32px 42px;
全体の内側余白です。上36px・左右32px・下42pxをそれぞれ変更すると、内容と外枠の間隔を調整できます。
border-radius:20px;
全体の角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。
font-size:22px;
タイトルの文字サイズです。値を大きくすると文字が大きくなり、小さくすると控えめになります。
margin:0 0 30px;
タイトル下の説明文と選択エリアの間隔です。30pxを大きくすると間隔が広がり、小さくすると狭くなります。
max-width:460px;
開閉ボタンと選択肢を含む選択エリアの最大横幅です。値を大きくすると横に広がり、小さくすると狭くなります。
transition:margin-bottom .3s ease;
メニューを開閉するときに下側スペースが変化する時間です。0.3秒を大きくするとゆっくり、小さくすると速く変化します。
margin-bottom:290px;
メニューを開いたときに選択肢を表示するための下側スペースです。値を大きくすると空間が広がり、小さくすると狭くなります。
min-height:58px;
開閉ボタンの最小高さです。値を大きくするとボタンが高くなり、小さくすると低くなります。
padding:0 20px;
開閉ボタンの左右の内側余白です。20pxを大きくすると文字とボタン端の間隔が広がります。
border-radius:12px;
開閉ボタンの角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。
box-shadow:0 5px 0 ...
開閉ボタンの厚みを作る影です。5pxを大きくすると下方向の厚みが強くなります。
transform:translateY(-2px);
マウスを重ねたときに開閉ボタンを上へ移動する距離です。絶対値を大きくすると浮き上がる動きが強くなります。
transform:translateY(3px);
クリック中に開閉ボタンを下へ移動する距離です。値を大きくすると押し込み量が大きくなります。
width:11px;・height:11px;
開閉ボタン右側にある矢印の大きさです。値を大きくすると矢印が大きくなります。
top:calc(100% + 14px);
開閉ボタンと選択肢一覧の間隔です。14pxを大きくすると選択肢がさらに下へ移動します。
gap:12px;
選択肢同士の間隔です。値を大きくすると間隔が広がり、小さくすると狭くなります。
transform:translateY(-12px);
閉じた状態で選択肢一覧を上へ移動させる距離です。絶対値を大きくすると開閉時の移動量が大きくなります。
transition:opacity .3s ease, visibility .3s ease, transform .3s ease;
選択肢一覧を開閉するアニメーション時間です。0.3秒を大きくするとゆっくり、小さくすると速く変化します。
min-height:54px;
各選択肢の最小高さです。値を大きくすると選択肢が高くなり、小さくすると低くなります。
padding:0 18px;
選択肢の左右の内側余白です。18pxを大きくすると文字と端の間隔が広がります。
border-radius:11px;
選択肢の角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。
box-shadow:0 4px 0 ...
選択肢の厚みを作る影です。4pxを大きくすると下方向の厚みが強くなります。
transition:.18s
開閉ボタンや選択肢を操作したときの位置・影・色などの切り替え時間です。0.18秒を大きくするとゆっくり、小さくすると速く変化します。
script.js
100
選択肢をクリックしてからメニューを閉じるまでの待機時間です。100は0.1秒を表します。値を大きくすると選択状態を長く表示してから閉じます。
レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssのwidth:100%とmax-width:700px、選択エリアのwidth:100%とmax-width:460pxにより、画面幅に合わせて全体が縮小されます。
画面幅640px以下ではメディアクエリを使用し、全体の余白をpadding:28px 18px 34px;、開閉ボタンの高さをmin-height:56px;、選択肢の間隔をgap:10px;、選択肢の高さをmin-height:52px;へ変更しています。そのため、スマートフォン・タブレット・PCの画面幅に合わせて利用できます。
コメント