ログインフォーム付きドロワーメニューの作り方
ログインフォーム付きドロワーメニューの作り方を紹介します。ボタンをクリックすると画面の左側からドロワーメニューが表示され、その中にログインフォームを配置できるサンプルです。限られた画面スペースでもログイン機能を見やすく表示したい場合に利用できます。
フォームにはユーザーIDやメールアドレス、パスワードなどの入力欄を配置でき、ヘッダーやナビゲーションと組み合わせたログイン画面にも活用できます。JavaScriptでドロワーメニューの開閉を制御するため、シンプルな構成で導入しやすいのも特徴です。
HTML・CSS・JavaScriptのみで実装しているため、特別なライブラリは必要ありません。デザインや入力項目、ボタンの文字、ドロワーメニューのサイズなども自由に変更できるので、会員サイトや管理画面、Webアプリなど幅広い場面で利用できます。
コードについて
本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項
当サイトは、本コードの利用により発生した損害について、一切の責任を負いません。
コードをコピーして使おう!
<!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="login-form-drawer-menu_wrap">
<!-- 操作エリアのタイトル -->
<div class="login-form-drawer-menu_title">
ログインフォーム付きドロワーメニュー
</div>
<!-- 操作エリアの説明文 -->
<p class="login-form-drawer-menu_text">
ボタンをクリックすると、画面左側へログインフォームが表示されます。
</p>
<!-- ドロワーメニューを開くボタン -->
<button
class="login-form-drawer-menu_open"
type="button"
data-login-drawer-open>
ログインフォームを開く
</button>
</div>
<!-- ドロワーメニュー表示時の背景 -->
<div
class="login-form-drawer-menu_overlay"
data-login-drawer-overlay
aria-hidden="true">
<!-- ドロワーメニュー本体 -->
<div
class="login-form-drawer-menu_drawer"
role="dialog"
aria-modal="true"
aria-labelledby="login-form-drawer-menu-heading">
<!-- ドロワーメニュー上部 -->
<div class="login-form-drawer-menu_header">
<!-- ドロワーメニューのタイトル -->
<div
class="login-form-drawer-menu_heading"
id="login-form-drawer-menu-heading">
ログイン
</div>
<!-- ドロワーメニューを閉じるボタン -->
<button
class="login-form-drawer-menu_close"
type="button"
data-login-drawer-close
aria-label="ドロワーメニューを閉じる">
×
</button>
</div>
<!-- ログインフォームの説明文 -->
<p class="login-form-drawer-menu_description">
メールアドレスとパスワードを入力してください。
</p>
<!-- ログインフォーム -->
<form
class="login-form-drawer-menu_form"
data-login-drawer-form>
<!-- メールアドレス入力欄 -->
<div class="login-form-drawer-menu_field">
<label
class="login-form-drawer-menu_label"
for="login-form-drawer-menu-email">
メールアドレス
</label>
<input
class="login-form-drawer-menu_input"
id="login-form-drawer-menu-email"
type="email"
name="email"
placeholder="example@example.com"
autocomplete="email"
required>
</div>
<!-- パスワード入力欄 -->
<div class="login-form-drawer-menu_field">
<label
class="login-form-drawer-menu_label"
for="login-form-drawer-menu-password">
パスワード
</label>
<input
class="login-form-drawer-menu_input"
id="login-form-drawer-menu-password"
type="password"
name="password"
placeholder="パスワードを入力"
autocomplete="current-password"
required>
</div>
<!-- ログインボタン -->
<button
class="login-form-drawer-menu_submit"
type="submit">
ログインする
</button>
</form>
<!-- ログイン処理についての注意書き -->
<p class="login-form-drawer-menu_note">
このサンプルには実際のログイン処理は実装されていません。
</p>
</div>
</div>
<!-- JavaScriptファイルを読み込み -->
<script src="script.js"></script>
</body>
</html>
/* 全要素 */
*{
box-sizing:border-box; /* 幅と高さに余白・枠線を含める */
}
/* ページ全体 */
body{
margin:0; /* ブラウザ標準の余白を削除 */
padding:40px 20px; /* 上下40px・左右20pxのページ余白 */
background:#f8fafc; /* ページの背景色 */
color:#0f172a; /* 基本文字色 */
font-family:sans-serif; /* ページ全体のフォント */
}
/* ドロワーメニューを開く操作エリア */
.login-form-drawer-menu_wrap{
width:100%; /* 画面幅に合わせる */
max-width:700px; /* 最大横幅。値を大きくすると表示エリアが広がる */
margin:40px auto; /* 上下40pxの余白と左右中央配置 */
padding:32px; /* 内側余白。値を大きくすると内容周囲の余白が広がる */
border:1px solid #e5e7eb; /* 枠線の太さと色 */
border-radius:18px; /* 角丸。値を大きくすると丸みが強くなる */
background:#ffffff; /* 操作エリアの背景色 */
text-align:center; /* 内容を中央揃え */
}
/* 操作エリアのタイトル */
.login-form-drawer-menu_title{
margin:0 0 12px; /* 下側12pxの余白 */
color:#0f172a; /* タイトルの文字色 */
font-size:22px; /* 文字サイズ。値を大きくするとタイトルが大きくなる */
font-weight:700; /* 文字の太さ */
line-height:1.5; /* 行間 */
}
/* 操作エリアの説明文 */
.login-form-drawer-menu_text{
margin:0 0 24px; /* 下側24pxの余白 */
color:#475569; /* 説明文の文字色 */
font-size:16px; /* 説明文の文字サイズ */
line-height:1.8; /* 行間。値を大きくすると行間が広がる */
}
/* ドロワーメニューを開くボタン */
.login-form-drawer-menu_open{
min-height:48px; /* タップしやすい最小高さ */
padding:12px 24px; /* 上下・左右の内側余白 */
border:none; /* 標準の枠線を削除 */
border-radius:8px; /* 角丸。値を大きくすると丸みが強くなる */
background:#2563eb; /* ボタンの背景色 */
color:#ffffff; /* ボタンの文字色 */
font-size:16px; /* ボタンの文字サイズ */
font-weight:700; /* ボタン文字の太さ */
cursor:pointer; /* マウスカーソルを指型へ変更 */
transition:background .2s ease; /* 0.2秒で背景色を変化。値を大きくすると遅く、小さくすると速くなる */
}
/* 開くボタンのホバー状態 */
.login-form-drawer-menu_open:hover{
background:#1d4ed8; /* ホバー時の背景色 */
}
/* ドロワーメニュー表示時の背景 */
.login-form-drawer-menu_overlay{
display:none; /* 初期状態では非表示 */
position:fixed; /* 画面全体へ固定 */
inset:0; /* 上下左右を0にして画面全体へ広げる */
z-index:9999; /* 他の要素より前面へ表示 */
align-items:stretch; /* ドロワーを画面の高さへ広げる */
justify-content:flex-start; /* ドロワーを左側へ配置 */
background:rgba(15,23,42,.55); /* 背景色。.55を大きくすると暗く、小さくすると薄くなる */
}
/* ドロワーメニューの表示状態 */
.login-form-drawer-menu_overlay.is-active{
display:flex; /* 表示用クラスが付いた時に表示 */
}
/* ドロワーメニュー本体 */
.login-form-drawer-menu_drawer{
width:420px; /* 横幅。値を大きくするとドロワーが広くなる */
max-width:90%; /* 小さい画面で画面幅を超えない最大幅 */
height:100%; /* 画面の高さに合わせる */
padding:28px; /* 内側余白。値を大きくすると内容周囲の余白が広がる */
overflow-y:auto; /* 内容が画面高を超えた場合に縦スクロール */
background:#ffffff; /* ドロワーの背景色 */
box-shadow:10px 0 40px rgba(0,0,0,.2); /* 右側の影 */
animation:login-form-drawer-menu-slide .35s ease forwards; /* 0.35秒で左側から表示。値を大きくすると遅く、小さくすると速くなる */
}
/* ドロワーメニュー上部 */
.login-form-drawer-menu_header{
display:flex; /* タイトルと閉じるボタンを横並び */
align-items:center; /* 垂直方向中央揃え */
justify-content:space-between; /* タイトルと閉じるボタンを両端へ配置 */
gap:16px; /* 要素間の余白 */
margin-bottom:20px; /* 下側20pxの余白 */
}
/* ドロワーメニューのタイトル */
.login-form-drawer-menu_heading{
color:#0f172a; /* タイトルの文字色 */
font-size:22px; /* タイトルの文字サイズ */
font-weight:700; /* タイトル文字の太さ */
line-height:1.5; /* 行間 */
}
/* ドロワーメニューを閉じるボタン */
.login-form-drawer-menu_close{
flex-shrink:0; /* ボタンの縮小を防ぐ */
width:40px; /* ボタンの横幅 */
height:40px; /* ボタンの高さ */
padding:0; /* 内側余白を削除 */
border:none; /* 標準の枠線を削除 */
border-radius:50%; /* 円形にする */
background:#e2e8f0; /* ボタンの背景色 */
color:#0f172a; /* ×印の文字色 */
font-size:24px; /* ×印の文字サイズ */
line-height:1; /* ×印の行間 */
cursor:pointer; /* マウスカーソルを指型へ変更 */
transition:background .2s ease; /* 0.2秒で背景色を変化。値を大きくすると遅く、小さくすると速くなる */
}
/* 閉じるボタンのホバー状態 */
.login-form-drawer-menu_close:hover{
background:#cbd5e1; /* ホバー時の背景色 */
}
/* ログインフォームの説明文 */
.login-form-drawer-menu_description{
margin:0 0 20px; /* 下側20pxの余白 */
color:#475569; /* 説明文の文字色 */
font-size:16px; /* 説明文の文字サイズ */
line-height:1.8; /* 行間 */
}
/* ログインフォーム */
.login-form-drawer-menu_form{
display:grid; /* 入力項目を縦方向へ配置 */
gap:18px; /* 入力項目間の余白 */
}
/* 入力項目 */
.login-form-drawer-menu_field{
text-align:left; /* ラベルと入力欄を左揃え */
}
/* 入力項目のラベル */
.login-form-drawer-menu_label{
display:block; /* ラベルを独立した行へ表示 */
margin-bottom:8px; /* 入力欄との間隔 */
color:#0f172a; /* ラベルの文字色 */
font-size:14px; /* ラベルの文字サイズ */
font-weight:700; /* ラベル文字の太さ */
}
/* ログインフォームの入力欄 */
.login-form-drawer-menu_input{
width:100%; /* ドロワーの横幅に合わせる */
padding:12px 14px; /* 入力欄内側の余白 */
border:1px solid #cbd5e1; /* 枠線の太さと色 */
border-radius:8px; /* 角丸。値を大きくすると丸みが強くなる */
background:#ffffff; /* 入力欄の背景色 */
color:#0f172a; /* 入力文字の色 */
font:inherit; /* ページと同じフォントを使用 */
}
/* 入力欄のフォーカス状態 */
.login-form-drawer-menu_input:focus{
border-color:#2563eb; /* フォーカス時の枠線色 */
outline:3px solid rgba(37,99,235,.18); /* フォーカス位置を示す外枠 */
}
/* ログインボタン */
.login-form-drawer-menu_submit{
min-height:48px; /* タップしやすい最小高さ */
padding:12px 20px; /* 上下・左右の内側余白 */
border:none; /* 標準の枠線を削除 */
border-radius:8px; /* 角丸 */
background:#2563eb; /* ボタンの背景色 */
color:#ffffff; /* ボタンの文字色 */
font-size:16px; /* ボタンの文字サイズ */
font-weight:700; /* ボタン文字の太さ */
cursor:pointer; /* マウスカーソルを指型へ変更 */
transition:background .2s ease; /* 0.2秒で背景色を変化。値を大きくすると遅く、小さくすると速くなる */
}
/* ログインボタンのホバー状態 */
.login-form-drawer-menu_submit:hover{
background:#1d4ed8; /* ホバー時の背景色 */
}
/* ログイン処理についての注意書き */
.login-form-drawer-menu_note{
margin:16px 0 0; /* 上側16pxの余白 */
color:#64748b; /* 注意書きの文字色 */
font-size:13px; /* 注意書きの文字サイズ */
line-height:1.7; /* 行間 */
}
/* ドロワーメニュー表示アニメーション */
@keyframes login-form-drawer-menu-slide{
/* アニメーション開始時 */
from{
opacity:0; /* 完全に透明な状態から開始 */
transform:translateX(-100%); /* 左側の画面外から開始 */
}
/* アニメーション終了時 */
to{
opacity:1; /* 完全に表示 */
transform:translateX(0); /* 元の位置へ移動 */
}
}
/* 画面幅640px以下 */
@media screen and (max-width:640px){
/* スマートフォン用のページ全体 */
body{
padding:24px 12px; /* 上下24px・左右12pxへページ余白を縮小 */
}
/* スマートフォン用の操作エリア */
.login-form-drawer-menu_wrap{
margin:24px auto; /* 上下余白を24pxへ縮小 */
padding:24px 18px; /* 上下24px・左右18pxへ内側余白を縮小 */
}
/* スマートフォン用の開くボタン */
.login-form-drawer-menu_open{
width:100%; /* ボタンを操作エリアの横幅いっぱいに広げる */
}
/* スマートフォン用のドロワーメニュー */
.login-form-drawer-menu_drawer{
padding:24px 20px; /* 小さい画面で内側余白を縮小 */
}
}
// ドロワーメニューを開くボタンを取得
const loginFormDrawerMenuOpen=document.querySelector(
"[data-login-drawer-open]"
);
// ドロワーメニューを閉じるボタンを取得
const loginFormDrawerMenuClose=document.querySelector(
"[data-login-drawer-close]"
);
// ドロワーメニュー表示時の背景を取得
const loginFormDrawerMenuOverlay=document.querySelector(
"[data-login-drawer-overlay]"
);
// ログインフォームを取得
const loginFormDrawerMenuForm=document.querySelector(
"[data-login-drawer-form]"
);
// 開くボタンをクリックした時
loginFormDrawerMenuOpen.addEventListener("click",function(){
// ドロワーメニューへ表示用クラスを追加
loginFormDrawerMenuOverlay.classList.add("is-active");
// ドロワーメニューが表示中であることを支援技術へ伝える
loginFormDrawerMenuOverlay.setAttribute(
"aria-hidden",
"false"
);
});
// 閉じるボタンをクリックした時
loginFormDrawerMenuClose.addEventListener("click",function(){
// ドロワーメニューから表示用クラスを削除
loginFormDrawerMenuOverlay.classList.remove("is-active");
// ドロワーメニューが非表示であることを支援技術へ伝える
loginFormDrawerMenuOverlay.setAttribute(
"aria-hidden",
"true"
);
});
// ログインフォームを送信した時
loginFormDrawerMenuForm.addEventListener("submit",function(event){
// サンプルでは実際のログイン処理を行わない
event.preventDefault();
});
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLにはログインフォーム付きドロワーメニューの構造、CSSにはフォームとドロワーメニューのデザイン、JavaScriptにはドロワーメニューの開閉処理を記述しています。現在のコードにはログイン認証処理は含まれておらず、画面表示とドロワーメニューの動作確認を目的としたサンプルです。
PHPと組み合わせて実際のログイン機能として利用する場合は、index.htmlのform要素に送信先PHPを指定し、method属性をpostへ変更します。メールアドレスとパスワードにはname属性が設定されているため、PHP側ではPOSTデータとして受け取れます。ログイン認証やセッション管理などは送信先PHPで実装してください。
このサンプルはログインフォームの見た目とドロワーメニューの開閉を確認するためのコードです。PHPと組み合わせる場合も、HTML・CSS・JavaScriptの構成はそのまま利用でき、フォームのaction属性とmethod属性を変更することでログイン処理へ接続できます。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.html はログインフォーム、ドロワーメニュー本体、開くボタン、閉じるボタンを配置します。PHPと組み合わせる場合は、form要素のaction属性へ送信先PHPを指定し、method属性をpostへ変更します。メールアドレスはname=”email”、パスワードはname=”password”としてPHP側で受け取れます。
style.css はドロワーメニューの横幅、背景色、余白、角丸、影、入力欄、ログインボタンなどのデザインを管理します。PHPと組み合わせた場合でも、このファイルはそのまま利用できます。
script.js はドロワーメニューを開く処理、閉じるボタンで閉じる処理、フォーム送信時のデモ用処理を管理します。デモでは送信ボタン押下時の表示のみを行い、実際のログイン認証は行いません。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置し、sample/index.htmlをブラウザで開くと動作を確認できます。「ログインフォームを開く」ボタンをクリックするとドロワーメニューが開きます。
PHPと組み合わせる場合は、index.htmlのform要素を次のように変更します。
action=”#”
method=”get”
を、
action=”login.php”
method=”post”
へ変更します。送信先のlogin.phpでは、email・passwordを受け取り、入力チェック、ログイン認証、セッション管理などの処理を実装してください。
カスタマイズできる内容
index.htmlではタイトル、説明文、ボタン名、メールアドレス欄、パスワード欄、送信先PHPを変更できます。style.cssではドロワーメニューの横幅、背景色、入力欄の余白、角丸、影、ボタン色などを変更できます。script.jsではドロワーメニューの開閉処理を編集できます。
数値調整
style.cssのwidth:420px;を変更するとドロワーメニューの横幅が変わります。padding:28px;を変更するとドロワー内部の余白が変わります。gap:20px;を変更すると入力欄同士の間隔が変わります。animation:.35s;の0.35秒を変更するとドロワーメニュー表示アニメーションの速度が変わります。transition:.2s;の0.2秒を変更するとボタンのアニメーション速度が変わります。
レスポンシブ対応
style.cssではwidth:100%、max-width、padding、@media (max-width:640px)を使用してレスポンシブ対応しています。スマートフォンではドロワーメニューや余白が縮小され、タブレットやPCでは適切な横幅を保ったまま表示されます。
コメント