今回はモーダルウィンドウをプラグイン無しで実装する方法を解説します。
読者の悩み
こういった疑問に答えます。
本記事の内容
この記事を書いている僕は、フロントエンドエンジニア歴が15年ほど。
web業界からゲーム業界まで数多くのwebサイトやアプリケーションを制作しています。
こういった僕が、分かりやすく解説していきます。
結論として問題ありません。
なぜなら、理由は以下の3つです。
プラグインが不要
モーダルウィンドウを実装するjQueryプラグインはたくさんあります。
ついついプラグインに頼りがちですが既存のプラグインを利用すると「やりたい表現があるけど、どこをどうカスタマイズすればいいかわからない…」という状況に陥ってしまうこともあります。
わざわざプラグインを使わなくても意外と簡単にモーダルウィンドウを実装することができます。
自分で実装できれば、仕組みを理解しているのでカスタマイズやメンテもしやすいのが最大のメリットです。
デモページを用意
デモページを用意してますので実際に動きが確認できます。
また、GitHubにも実際のソースコードをアップしているのでクローンできます。
サンプルコードを用意
モーダルウィンドウのサンプルコードで実際のコード[HTML / SCSS / jQuery]を確認できてコピペできます。
サンプルコードはSCSSですがCSSを見たい場合は、GitHubにコンパイルされてないCSSファイルがありますのでご覧ください。
デモページとソースコードを確認しながらご覧ください。
まず、jQueryを書いていく前に、以下の3つの準備が必要です。
①jQueryの読み込み
jQueryを使用するには、jQueryライブラリを読み込む必要があります。ライブラリはインターネット経由で読み込むのが一般的です。headタグの中で上記のようにURLを読み込むことで、jQueryが使用できるようになります。
<head>
︙
<script src="https://…jquery.min.js"></script>
︙
</head>
②jQueryのコードを記述するファイルの読み込み
jQueryは、.js形式のファイルにコードを書きます。 HTMLファイルで、scriptタグに書くことで、jQueryのコードを記述するファイルが読み込まれます。scriptタグはCSSファイルの読み込みのようにheadタグの中にも書けますが、bodyの閉じタグ直前に書くことで、WEBページの表示速度をより早めることが出来ます。
<head>
︙
</head>
<body>
︙
<script src="modal.js"></script>
</body>
③jQueryの型
jQueryはHTMLの中身を操作するため、HTMLの読み込みが完了してからjQueryによる操作を開始するようにします。そのためにはreadyイベントを使用し、$(document).ready()の中身にjQueryの処理を書いていきます。 この構文には省略形も用意されており、$(function(){ });と書くことも出来ます。
$(function() {
︙
});
ではベースのコードを見ていきます。
HTML
まずはHTMLを記述していきます。
<section>
<div class="c-modal__signup-modal-wrapper" id="ji-signupModal">
<div class="c-modal__innerbox">
<div class="close-modal">
<i class="c-modal__close-btn"></i>
</div>
<div id="signup-form">
<h2>Emailで新規登録</h2>
<form action="#">
<input class="form-control" type="text" placeholder="メールアドレス">
<input class="form-control" type="password" placeholder="パスワード">
<div id="submit-btn">新規登録</div>
</form>
</div>
</div>
</div>
<div class="c-modal__login-modal-wrapper" id="ji-loginModal">
<div class="c-modal__innerbox">
<div class="close-modal">
<i class="c-modal__close-btn"></i>
</div>
<div id="login-form">
<h2>Emailログイン</h2>
<form action="#">
<input class="form-control" type="text" placeholder="メールアドレス">
<input class="form-control" type="password" placeholder="パスワード">
<div id="submit-btn">ログイン</div>
</form>
</div>
</div>
</div>
<div class="c-modal">
<div class="c-modal__inner">
<div class="c-modal__head">
<div>
</div>
<div>
<div id="ji-loginShow" class="c-modal__login">ログイン</div>
</div>
</div>
<div class="c-modal__hero">
<img src="https://buff-design.com/sample/img/website_login.svg" alt="">
<div class="c-modal__content">
<div id="ji-signUpShow" class="c-modal__btn">新規登録はこちら</div>
</div>
</div>
</div>
</div>
</section>
SCSS
続いてSCSSファイルを記述して行きます。
.c-modal {
padding: 0;
margin: 0;
&__inner {
padding: 0 0 48px;
}
&__head {
width: 100%;
height: 40px;
background-color: rgba(34,49,52,0.9);
display: flex;
justify-content: space-around;
@media screen and (max-width: 560px) {
justify-content: space-between;
}
}
&__login {
height: 40px;
padding: 0 24px;
color: white;
background-color: rgba(255,255,255,0.3);
display: flex;
align-items: center;
cursor: pointer;
transition: all 0.5s;
&:hover {
background-color: rgba(255,255,255,0.5);
}
}
&__hero {
margin: 0 auto 0px;
width: 92%;
max-width: 720px;
@media screen and (max-width: 560px) {
width: 92%;
}
img {
max-width: 100%;
height: auto;
}
}
&__content {
text-align: center;
}
&__btn {
padding: 8px 24px;
color: white;
background-color: #239b76;
display: inline-block;
opacity: 0.8;
border-radius: 4px;
cursor: pointer;
&:hover {
opacity: 1;
}
}
/* モーダル部分のCSS */
&__login-modal-wrapper {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: rgba(0, 0, 0, 0.6);
z-index: 100;
display: none;
}
&__signup-modal-wrapper {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: rgba(0, 0, 0, 0.6);
z-index: 100;
display: none;
}
&__innerbox {
position: absolute;
top: 30%;
left: calc(100% / 2 - 225px);
background-color: #e6ecf0;
padding: 20px 0 40px;
border-radius: 10px;
width: 450px;
height: auto;
text-align: center;
@media screen and (max-width: 560px) {
width: 340px;
left: calc(100% / 2 - 170px);
}
}
&__close-btn {
position: absolute;
width: 15px;
height: 15px;
top: 5px;
right: 10px;
cursor: pointer;
&:before {
content: "";
position: absolute;
width: 40%;
height: 24px;
background: #999;
left: 0%;
top: calc(50% - 1px);
transform-origin: 50% 50%;
transform: rotate(-45deg);
}
&:after {
content: "";
position: absolute;
width: 40%;
height: 24px;
background: #999;
left: 0%;
top: calc(50% - 1px);
transform-origin: 50% 50%;
transform: rotate(45deg);
}
}
}
/* フォームボックス */
#signup-form, #login-form {
width: 100%;
}
#signup-form h2, #login-form h2 {
color: #5f5d60;
letter-spacing: 1px;
margin-bottom: 40px;
}
#signup-form input, #login-form input {
width: 320px;
margin-bottom: 20px;
font-size: 12px;
padding: 12px 12px;
border: 1px solid #d0d5d8;
border-radius: 5px;
}
#submit-btn {
display: inline-block;
padding: 7px 70px;
background-color: #5dca88;
border: none;
border-radius: 3px;
color: white;
margin: 10px auto;
cursor: pointer;
}
jQuery
続いてJSファイルを記述して行きます。
$(function() {
//「#ji-loginShow」要素に対するclickイベント
$('#ji-loginShow').on('click', function () {
$('#ji-loginModal').fadeIn();
});
//「#ji-signUpShow」要素に対するclickイベント
$('#ji-signUpShow').on('click', function () {
$('#ji-signupModal').fadeIn();
});
//「.close-modal」要素にclickイベント
$('.close-modal').on('click', function () {
$('#ji-loginModal').fadeOut();
$('#ji-signupModal').fadeOut();
});
//モーダルウィンドウ要素にclickイベント
$('.c-modal__login-modal-wrapper').on('click', function () {
$('#ji-loginModal').fadeOut();
$('#ji-signupModal').fadeOut();
});
//モーダルウィンドウ要素にclickイベント
$('.c-modal__signup-modal-wrapper').on('click', function () {
$('#ji-loginModal').fadeOut();
$('#ji-signupModal').fadeOut();
});
});
骨組みは以下の3つです。
id指定の場所をクリックするとモーダルが表示/非表示になるようにしています。
idは同一ページに一箇所しか存在しないので、jQueryの処理が高速化されます。jQueryオブジェクトのセレクタにはできるだけidを用いるようにしましょう。
HTML
<div id="ji-loginShow" class="c-modal__login">ログイン</div>
<div id="ji-signUpShow" class="c-modal__btn">新規登録はこちら</div>
ログインボタンと新規登録ボタンを使って、ログインフォーム・新規登録フォームをモーダルにします。
SCSS
&__login-modal-wrapper {
︙
display: none;
}
&__signup-modal-wrapper {
︙
display: none;
}
モーダルをCSSで非表示にしておきます。
jQuery
$('#ji-loginShow').on('click', function () {
});
$('#ji-signUpShow').on('click', function () {
});
ログインボタンと新規登録ボタンにclickイベントを設定します。
ログインフォームと新規登録用のフィームにモーダルを用います。
HTML
<div class="c-modal__login-modal-wrapper" id="ji-loginModal">
︙
</div>
<div class="c-modal__signup-modal-wrapper" id="ji-signupModal">
︙
</div>
モーダルウィンドウ全体でフォームを囲むようにします。
jQuery
$('#ji-loginShow').on('click', function () {
$('#ji-loginModal').fadeIn();
});
$('#ji-signUpShow').on('click', function () {
$('#ji-signupModal').fadeIn();
});
ログインボタンと新規登録ボタンのclickイベントでモーダルウィンドウをフェードイン(display: block;)してモーダルを表示させます。
閉じるボタンをクリックした時に、モーダルが閉じるようにします。
また、モーダルウィンドウをクリックしたときも、モーダルが閉じるようにしましょう。
HTML
<div class="c-modal__innerbox">
︙
<i class="c-modal__close-btn"></i>
︙
</div>
ログインと新規登録の2つのモーダルがありますが、これらを閉じるボタンは共通のものを使います。
2箇所に同じclickイベントを設定するので、idではなくclassを用いましょう。
jQuery
//「.close-modal」要素にclickイベント
$('.close-modal').on('click', function () {
$('#ji-loginModal').fadeOut();
$('#ji-signupModal').fadeOut();
});
//モーダルウィンドウ要素にclickイベント
$('.c-modal__login-modal-wrapper').on('click', function () {
$('#ji-loginModal').fadeOut();
$('#ji-signupModal').fadeOut();
});
$('.c-modal__signup-modal-wrapper').on('click', function () {
$('#ji-loginModal').fadeOut();
$('#ji-signupModal').fadeOut();
});
閉じるボタンとモーダルウィンドウにclickイベントを設定し、fadeOutメソッドでモーダルを隠すようにします。
クリックした時にログインフォームと新規登録フォームのモーダルをともに隠します。
今回は以上になります。
モーダルウィンドウの実装はついついプラグインに頼りがちですが、そういったものに頼らずに実装すれば仕組みを理解しているのでカスタマイズやメンテもしやすくなります。
作成方法が不安な方は是非参考にしていただけると嬉しいです。