モーダル Modal Dialog

画面を覆うオーバーレイ上にコンテンツを表示するダイアログ。ユーザーの確認操作を求める時に使用。

使用場面: 確認ダイアログ、フォーム入力、詳細表示、警告 採用例: macOS Alert, Instagram

ライブデモ

ソースコード

<button class="demo-modal-open">モーダルを開く</button>
<div class="demo-modal-overlay" style="display:none;">
  <div class="demo-modal-dialog" role="dialog" aria-modal="true" aria-labelledby="demo-modal-title">
    <div class="demo-modal-header">
      <h3 class="demo-modal-title" id="demo-modal-title">確認</h3>
      <button class="demo-modal-close" aria-label="閉じる">&times;</button>
    </div>
    <div class="demo-modal-body">
      <p>この操作を実行しますか?この操作は取り消せません。</p>
    </div>
    <div class="demo-modal-footer">
      <button class="demo-modal-btn cancel">キャンセル</button>
      <button class="demo-modal-btn confirm">確認する</button>
    </div>
  </div>
</div>
.demo-modal-open { position: relative;
  padding: 10px 20px; background: var(--ui-primary); color: #fff;
  border: none; border-radius: 8px; font-size: 14px; cursor: pointer;
  transition: opacity 0.2s;
}
.demo-modal-open:hover { opacity: 0.85; }
.demo-modal-overlay { display: none; position: fixed; inset: 0; z-index: 9999; background: rgba(0,0,0,0.5); align-items: center; justify-content: center; }
.demo-modal-dialog {
  background: #fff; border-radius: 14px; width: 90%; max-width: 420px;
  box-shadow: 0 8px 30px rgba(0,0,0,0.2); animation: demo-modal-scale-in 0.25s ease-out;
}
.demo-modal-header {
  display: flex; align-items: center; justify-content: space-between;
  padding: 16px 20px; border-bottom: 1px solid #e5e7eb;
}
.demo-modal-title { margin: 0; font-size: 16px; color: #111; }
.demo-modal-close {
  background: none; border: none; font-size: 22px; color: #999;
  cursor: pointer; width: 32px; height: 32px; border-radius: 8px;
  display: flex; align-items: center; justify-content: center;
}
.demo-modal-close:hover { background: #f3f4f6; }
.demo-modal-body { padding: 20px; font-size: 14px; color: #555; line-height: 1.6; }
.demo-modal-footer { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 20px; border-top: 1px solid #e5e7eb; }
.demo-modal-btn {
  padding: 8px 18px; border-radius: 8px; font-size: 13px;
  cursor: pointer; border: none; font-weight: 600;
}
.demo-modal-btn.cancel { background: #f3f4f6; color: #333; }
.demo-modal-btn.cancel:hover { background: #e5e7eb; }
.demo-modal-btn.confirm { background: var(--ui-primary); color: #fff; }
.demo-modal-btn.confirm:hover { opacity: 0.85; }
@keyframes demo-modal-fade-in { from { opacity: 0; } to { opacity: 1; } }
@keyframes demo-modal-scale-in { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } }
(function(){
  const overlay = document.querySelector('.demo-modal-overlay');
  function open() { overlay.style.display = 'flex'; }
  function close() { overlay.style.display = 'none'; }
  document.querySelector('.demo-modal-open').addEventListener('click', open);
  document.querySelector('.demo-modal-close').addEventListener('click', close);
  document.querySelector('.demo-modal-btn.cancel').addEventListener('click', close);
  document.querySelector('.demo-modal-btn.confirm').addEventListener('click', close);
  overlay.addEventListener('click', function(e) { if (e.target === overlay) close(); });
})();

AIプロンプト

Basic
モーダルダイアログをHTML/CSS/JSで作ってください。ボタンを押すとオーバーレイ付きのダイアログが表示されます。
Custom
以下の仕様でモーダルを実装してください。
- フェードイン + スケールアップのアニメーション
- プライマリカラー: #2563eb
- 背景オーバーレイクリックで閉じる
- 閉じるボタン(×)
- ヘッダー・ボディ・フッターの3セクション
- フッターにキャンセル/確認ボタン
- スクロール可能なコンテンツ対応
Advanced
アクセシビリティ完全対応のモーダルを実装してください。
- role="dialog" + aria-modal="true"
- aria-labelledby, aria-describedby の設定
- フォーカストラップ(Tab/Shift+Tab がモーダル内で循環)
- ESCキーで閉じる
- 開くときに前のフォーカス位置を記録、閉じたら戻す
- bodyスクロールロック(scroll-behavior考慮)
- アニメーションはprefers-reduced-motion対応
- ネスト(モーダルの中からモーダルを開く)対応
- <dialog>要素ベースの実装