3D回転しながら開閉するモーダルウインドウを作る方法
3D回転しながら開閉するモーダルウインドウを作る方法を紹介します。このサンプルでは、HTML・CSS・JavaScriptを使用して、モーダルウインドウが立体的に回転しながら表示・非表示になるアニメーションを実装します。通常のフェード表示とは異なり、奥行きを感じられる動きになるため、ユーザーの目を引く演出として利用できます。
お知らせやキャンペーン情報、会員サイトの案内、ECサイトのクーポン表示、管理画面の確認ダイアログなど、重要な情報を印象的に表示したい場面で活用できます。モーダルを開くと斜め方向へ3D回転しながら表示され、閉じるボタンを押すと逆方向へ回転しながら閉じるため、自然で滑らかな動きを実現できます。
タイトルや本文、ボタンの文字はHTMLから変更でき、CSSではモーダルのサイズ、背景色、角丸、影、回転角度、アニメーション時間などを自由に調整できます。レスポンシブにも対応しているため、スマートフォン・タブレット・PCでも利用しやすく、印象的なモーダルウインドウを作成したい場合に活用できるサンプルです。
コードについて
本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項
本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
3D回転モーダルウインドウ
モーダルが3D回転しながら表示・非表示になります。
モーダルタイトル
モーダルが立体的に回転しながら開閉します。
「モーダルを開く」をクリックすると、モーダルが3D回転しながら表示されます。「閉じる」をクリックすると逆方向へ回転しながら閉じます。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コードをUTF-8へ設定 -->
<meta charset="UTF-8">
<!-- スマートフォンやタブレットの画面幅へ対応 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ブラウザのタブへ表示するページタイトル -->
<title>3D回転しながら開閉するモーダルウインドウ</title>
<!-- CSSファイルを読み込み -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- モーダルを開くエリア -->
<div class="modal-3d-rotate_wrap">
<!-- タイトル -->
<div class="modal-3d-rotate_title">
3D回転モーダルウインドウ
</div>
<!-- 説明文 -->
<p class="modal-3d-rotate_text">
モーダルが3D回転しながら表示・非表示になります。
</p>
<!-- モーダルを開くボタン -->
<button
class="modal-3d-rotate_open"
type="button">
モーダルを開く
</button>
</div>
<!-- モーダル全体 -->
<div class="modal-3d-rotate_overlay">
<!-- モーダル本体 -->
<div
class="modal-3d-rotate_modal"
role="dialog"
aria-modal="true"
aria-labelledby="modal-3d-rotate-title">
<!-- モーダルタイトル -->
<div
class="modal-3d-rotate_modal-title"
id="modal-3d-rotate-title">
モーダルタイトル
</div>
<!-- モーダル説明文 -->
<p class="modal-3d-rotate_modal-text">
モーダルが立体的に回転しながら開閉します。
</p>
<!-- モーダルを閉じるボタン -->
<button
class="modal-3d-rotate_close"
type="button">
閉じる
</button>
</div>
</div>
<!-- JavaScriptファイルを読み込み -->
<script src="script.js"></script>
</body>
</html>
/* ページ全体 */
body{
margin:0; /* ブラウザ標準の外側余白を削除する */
padding:40px 20px; /* 上下40px・左右20px。値を大きくすると画面端との間隔が広がる */
background:#ffffff; /* ページ全体の背景色 */
color:#111827; /* ページ全体の基本文字色 */
font-family:sans-serif; /* ページ全体で使用するフォント */
}
/* モーダルを開くエリア */
.modal-3d-rotate_wrap{
width:100%; /* 画面幅に合わせて横幅を縮小する */
max-width:700px; /* 最大横幅。値を大きくすると全体が横に広がる */
margin:40px auto; /* 上下40pxの余白を付けて左右中央へ配置する */
padding:32px; /* 内側余白。値を大きくすると内容と外枠の間隔が広がる */
border:1px solid #e5e7eb; /* 全体を囲む枠線 */
border-radius:18px; /* 全体の角丸。値を大きくすると丸みが強くなる */
background:#f8fafc; /* 全体の背景色 */
text-align:center; /* 内容を中央揃えにする */
box-sizing:border-box; /* paddingとborderを横幅へ含める */
}
/* タイトル */
.modal-3d-rotate_title{
margin:0 0 12px; /* 下側12pxの余白。値を大きくすると説明文との間隔が広がる */
font-size:22px; /* タイトルの文字サイズ。値を大きくすると文字が大きくなる */
font-weight:700; /* タイトルを太字にする */
line-height:1.5; /* タイトルの行間。値を大きくすると行間が広がる */
}
/* 説明文 */
.modal-3d-rotate_text{
margin:0 0 24px; /* 下側24pxの余白。値を大きくするとボタンとの間隔が広がる */
color:#4b5563; /* 説明文の文字色 */
font-size:16px; /* 説明文の文字サイズ */
line-height:1.8; /* 説明文の行間。値を大きくすると行間が広がる */
}
/* モーダルを開くボタン */
.modal-3d-rotate_open{
padding:12px 24px; /* 上下12px・左右24px。値を大きくするとボタンが大きくなる */
border:none; /* ブラウザ標準の枠線を非表示にする */
border-radius:8px; /* ボタンの角丸。値を大きくすると丸みが強くなる */
background:#2563eb; /* ボタンの背景色 */
color:#ffffff; /* ボタンの文字色 */
font:inherit; /* ページ全体と同じフォントを使用する */
font-size:16px; /* ボタンの文字サイズ */
font-weight:700; /* ボタンの文字を太字にする */
cursor:pointer; /* マウスカーソルを指型へ変更する */
}
/* モーダル全体 */
.modal-3d-rotate_overlay{
position:fixed; /* ブラウザ画面へ固定する */
inset:0; /* 上下左右を0にして画面全体へ広げる */
z-index:9999; /* 他の要素より手前へ表示する */
display:flex; /* モーダルを中央配置する */
align-items:center; /* モーダルを縦方向の中央へ配置する */
justify-content:center; /* モーダルを横方向の中央へ配置する */
padding:20px; /* 画面端との間隔。値を大きくすると余白が広がる */
background:rgba(15,23,42,.55); /* 背景色。.55を大きくすると暗くなる */
opacity:0; /* 閉じた状態では透明にする */
visibility:hidden; /* 閉じた状態では操作できないようにする */
perspective:1200px; /* 3D空間の奥行き。値を小さくすると遠近感が強くなる */
transition:
opacity .35s ease,
visibility .35s ease;
/*
0.35秒で背景を表示・非表示にする。
値を大きくするとゆっくり、小さくすると速くなる。
*/
box-sizing:border-box; /* paddingを画面サイズへ含める */
}
/* モーダルが開いている状態 */
.modal-3d-rotate_overlay.show{
opacity:1; /* 背景を表示する */
visibility:visible; /* モーダルを操作できる状態にする */
}
/* モーダル本体 */
.modal-3d-rotate_modal{
width:100%; /* 画面幅に合わせて横幅を縮小する */
max-width:420px; /* 最大横幅。値を大きくするとモーダルが横に広がる */
padding:30px; /* 内側余白。値を大きくすると内容と外側の間隔が広がる */
border-radius:18px; /* モーダルの角丸。値を大きくすると丸みが強くなる */
background:#ffffff; /* モーダルの背景色 */
box-shadow:0 20px 45px rgba(0,0,0,.22); /* モーダルの影。数値を大きくすると影が広がる */
text-align:center; /* モーダル内の内容を中央揃えにする */
opacity:0; /* 閉じた状態では透明にする */
transform:rotate3d(1,1,0,-120deg) scale(.65);
/*
縦方向と横方向へ-120度回転し、65%の大きさにする。
角度を大きくすると回転量が増え、scaleを小さくすると縮小が強くなる。
*/
transform-style:preserve-3d; /* 子要素の3D表示を維持する */
transition:
transform .65s cubic-bezier(.22,1,.36,1),
opacity .35s ease;
/*
回転と拡大は0.65秒、透明度は0.35秒で変化する。
値を大きくするとゆっくり、小さくすると速くなる。
*/
box-sizing:border-box; /* paddingを最大横幅へ含める */
}
/* 開いているモーダル本体 */
.modal-3d-rotate_overlay.show .modal-3d-rotate_modal{
opacity:1; /* モーダルを表示する */
transform:rotate3d(0,0,0,0deg) scale(1); /* 回転を戻して通常サイズで表示する */
}
/* モーダルタイトル */
.modal-3d-rotate_modal-title{
margin:0 0 12px; /* 下側12pxの余白。値を大きくすると説明文との間隔が広がる */
font-size:22px; /* モーダルタイトルの文字サイズ */
font-weight:700; /* モーダルタイトルを太字にする */
line-height:1.5; /* モーダルタイトルの行間 */
}
/* モーダル説明文 */
.modal-3d-rotate_modal-text{
margin:0 0 24px; /* 下側24pxの余白。値を大きくすると閉じるボタンとの間隔が広がる */
color:#4b5563; /* モーダル説明文の文字色 */
font-size:16px; /* モーダル説明文の文字サイズ */
line-height:1.8; /* モーダル説明文の行間 */
}
/* モーダルを閉じるボタン */
.modal-3d-rotate_close{
padding:10px 20px; /* 上下10px・左右20px。値を大きくするとボタンが大きくなる */
border:none; /* ブラウザ標準の枠線を非表示にする */
border-radius:8px; /* ボタンの角丸。値を大きくすると丸みが強くなる */
background:#111827; /* ボタンの背景色 */
color:#ffffff; /* ボタンの文字色 */
font:inherit; /* ページ全体と同じフォントを使用する */
font-size:16px; /* ボタンの文字サイズ */
font-weight:700; /* ボタンの文字を太字にする */
cursor:pointer; /* マウスカーソルを指型へ変更する */
}
/* 画面幅640px以下 */
@media(max-width:640px){
/* モーダルを開くエリア */
.modal-3d-rotate_wrap{
margin:24px auto; /* 上下余白を24pxへ縮小する */
padding:24px 18px; /* 内側余白を縮小して画面内へ収める */
}
/* モーダル本体 */
.modal-3d-rotate_modal{
padding:24px 18px; /* 内側余白を縮小して画面内へ収める */
}
}
// モーダルを開くボタンを取得
const modal3dRotateOpen =
document.querySelector(".modal-3d-rotate_open");
// モーダルを閉じるボタンを取得
const modal3dRotateClose =
document.querySelector(".modal-3d-rotate_close");
// モーダル全体を取得
const modal3dRotateOverlay =
document.querySelector(".modal-3d-rotate_overlay");
// 開くボタンをクリックしたときの処理
modal3dRotateOpen.addEventListener("click",function(){
// showクラスを追加してモーダルを表示する
modal3dRotateOverlay.classList.add("show");
});
// 閉じるボタンをクリックしたときの処理
modal3dRotateClose.addEventListener("click",function(){
// showクラスを削除してモーダルを非表示にする
modal3dRotateOverlay.classList.remove("show");
});
コードをコピーする場合
使用するコードのタブを選び、「このタブをコピー」をクリックすると、現在表示中のコードをコピーできます。
サンプル一式を取得する場合
HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLではモーダルウインドウの構造を作成し、CSSでは3D回転アニメーションやデザイン、JavaScriptではモーダルの表示・非表示を制御します。CSSの3D変形機能を利用することで、通常のフェード表示とは異なる立体感のあるモーダルウインドウを実装できます。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlはモーダルウインドウ全体を構成するファイルです。タイトル、説明文、ボタンの文字、モーダル内の文章などを変更できます。
style.cssはページ全体とモーダルウインドウのデザインを設定するファイルです。背景色、サイズ、角丸、影、3D回転アニメーション、表示速度などを変更できます。
script.jsはモーダルウインドウの表示・非表示を制御するファイルです。開くボタンをクリックすると3D回転しながら表示され、閉じるボタンをクリックすると逆方向へ回転しながら閉じます。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置します。3つのファイルを同じ階層へ保存したあと、sample/index.htmlをブラウザで開いてください。「モーダルを開く」をクリックすると3D回転アニメーション付きでモーダルが表示され、「閉じる」をクリックするとモーダルが非表示になります。
カスタマイズできる内容
index.htmlではタイトル、説明文、ボタンの文字、モーダル内のタイトルや本文を変更できます。
style.cssではモーダルの横幅、背景色、余白、角丸、影、背景オーバーレイの色、回転角度、拡大率、アニメーション時間などを変更できます。3D回転の方向や見え方も自由に調整できます。
script.jsでは開閉する対象やイベント処理を変更できます。
数値調整
style.css
max-width:700px;
全体エリアの最大横幅です。値を大きくすると横に広がり、小さくするとコンパクトになります。
padding:32px;
全体エリアの内側余白です。値を大きくすると余白が広がり、小さくすると詰まった表示になります。
perspective:1200px;
3D表示の奥行きです。値を小さくすると立体感が強くなり、大きくすると自然な見た目になります。
max-width:420px;
モーダルの最大横幅です。値を大きくするとモーダルが横に広がります。
padding:30px;
モーダル内部の余白です。値を大きくすると内容と枠線の間隔が広がります。
rotate3d(1,1,0,-120deg)
モーダルが表示される前の回転角度です。角度を変更すると3D回転の見え方が変わります。
scale(.65)
モーダルの初期サイズです。値を小さくすると小さい状態から表示され、大きくすると通常サイズに近い状態から表示されます。
transform .65s
3D回転アニメーションの時間です。値を大きくするとゆっくり、小さくすると速く回転します。
opacity .35s
フェードイン・フェードアウトの時間です。値を大きくすると透明度の変化がゆっくりになります。
レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssのwidth:100%とmax-widthにより画面幅へ合わせて自動調整されます。また、640px以下ではpadding:24px 18px;へ変更して余白を調整しているため、スマートフォン・タブレット・PCで利用できます。
コメント