スライドイン・スライドアウトするドロップダウンメニューを作る方法
スライドイン・スライドアウトするドロップダウンメニューを作る方法を紹介します。このサンプルでは、「メニュー」ボタンをクリックするとリンク一覧が上から下へスライドインし、もう一度クリックすると下から上へスライドアウトして閉じるドロップダウンメニューを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="slide-dropdown-menu_wrap">
<!-- タイトル -->
<div class="slide-dropdown-menu_title">
スライドするドロップダウンメニュー
</div>
<!-- 説明文 -->
<p class="slide-dropdown-menu_text">
ボタンをクリックすると、リンク一覧がスライドしながら開閉します。
</p>
<!-- ドロップダウンメニューの配置エリア -->
<div class="slide-dropdown-menu_group">
<!-- 開閉ボタンとリンク一覧をまとめるエリア -->
<div class="slide-dropdown-menu_area">
<!-- ドロップダウンメニューの開閉ボタン -->
<button
class="slide-dropdown-menu_button"
type="button"
data-slide-dropdown-menu-button="">
メニュー
<!-- 開閉状態を示す矢印 -->
<span class="slide-dropdown-menu_arrow">
▼
</span>
</button>
<!-- スライドイン・スライドアウトするリンク一覧 -->
<ul
class="slide-dropdown-menu_list"
data-slide-dropdown-menu-list="">
<!-- ホームへのリンク -->
<li>
<a class="slide-dropdown-menu_link" href="#">
ホーム
</a>
</li>
<!-- サービスへのリンク -->
<li>
<a class="slide-dropdown-menu_link" href="#">
サービス
</a>
</li>
<!-- お問い合わせへのリンク -->
<li>
<a class="slide-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のtransformとtransitionを使用してスライドイン・スライドアウトする動きを設定します。JavaScriptでは開閉ボタンをクリックしたときにis-openクラスを切り替え、リンク一覧の開閉状態を制御します。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlはドロップダウンメニューのHTML構造を作るファイルです。「メニュー」の開閉ボタンと、「ホーム」「サービス」「お問い合わせ」の3つのリンクを配置しています。ボタンの文字、リンク名、リンク先は用途に合わせて変更できます。
style.cssはドロップダウンメニューのデザインとスライドアニメーションを設定するファイルです。閉じた状態ではリンク一覧をtranslateY(-18px)で上へ移動し、透明な状態にしています。is-openクラスが付くとtranslateY(0)へ移動しながら表示されます。
script.jsはドロップダウンメニューの開閉を制御するファイルです。開閉ボタンをクリックするたびにボタンとリンク一覧のis-openクラスを切り替えます。ボタン側のクラスは矢印の回転、リンク一覧側のクラスはスライドイン・スライドアウトの切り替えに使用します。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置します。3つのファイルを同じ階層へ保存したあと、sample/index.htmlをブラウザで開いてください。index.htmlからstyle.cssとscript.jsを読み込む構成になっているため、外部ライブラリは必要ありません。
「メニュー」をクリックすると、リンク一覧が上側の位置から下方向へスライドインして表示されます。もう一度クリックすると上方向へスライドアウトして閉じます。開閉に合わせてボタン右側の矢印も180度回転します。実際に使用する場合は、index.htmlの各href="#"を移動先のURLへ変更してください。
カスタマイズできる内容
index.htmlでは開閉ボタンの文字、リンク一覧の表示内容、リンク先を変更できます。リンクを追加する場合は、既存のli要素とa要素と同じ構造で項目を追加できます。
style.cssでは全体の横幅や余白、開閉ボタンの背景色、文字サイズ、角丸、リンク一覧の背景色、影、スライドする距離、アニメーション時間などを変更できます。transform:translateY(-18px);の値でスライド開始位置、.3sの値で開閉速度を調整できます。
数値調整
style.css
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;
開閉ボタンとリンク一覧の角丸です。値を大きくすると丸みが強くなります。
margin-left:12px;
ボタン文字と矢印の間隔です。値を大きくすると間隔が広がります。
font-size:12px;
矢印の大きさです。値を大きくすると矢印が大きくなります。
transform:rotate(180deg);
メニューを開いたときの矢印の回転角度です。180度回転することで下向きから上向きへ変化します。
top:calc(100% + 10px);
開閉ボタンとリンク一覧の間隔です。10pxを大きくすると上下の間隔が広がります。
padding:8px;
リンク一覧の内側余白です。値を大きくすると外枠とリンクの間隔が広がります。
box-shadow:0 10px 24px ...
リンク一覧の影です。10pxは下方向の位置、24pxはぼかしの大きさです。値を変更すると影の位置や広がりを調整できます。
transform:translateY(-18px);
閉じた状態のリンク一覧の位置です。18px上へ移動した位置からスライドを開始します。絶対値を大きくするとスライドする距離が長くなり、小さくすると短くなります。
transition:.3s;
スライドと透明度、矢印回転のアニメーション時間です。0.3秒で変化します。値を大きくするとゆっくり、小さくすると速く動きます。
padding:12px 14px;
各リンクの内側余白です。上下12pxを大きくするとリンクが高くなり、左右14pxを大きくすると文字と端の間隔が広がります。
border-radius:8px;
各リンクの角丸です。値を大きくするとマウスオーバー時の背景の丸みが強くなります。
レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssで全体とメニューエリアにwidth:100%を指定し、max-width:700pxとmax-width:280pxで最大横幅を制限しているため、画面幅が狭くなると自動的に縮小します。
また、画面幅640px以下では全体の内側余白をpadding:24px 18px;へ変更します。これにより左右の余白を抑え、スマートフォン・タブレット・PCで利用しやすい表示になります。
コメント