【JavaScript】window.confirmのようなシンプルなモーダルウィンドウを実装する

window.confirmのように Yes No の選択が行える
シンプルなモーダルウィンドウのテンプレートが欲しかったので備忘録です。

ブラウザ確認

Google Chrome: 117.0.5938.150 以上
Mozilla Firefox: 118.0.1 以上
Microsoft Edge: 117.0.2045.60 以上
今回はテンプレートなので最低限のブラウザのみ確認。iOS系は未確認。

サンプル

兎に角サンプルから。
テストページを作成していますので以下よりご確認ください。

[サンプル1]
https://x.zmjtk.jp/modal1/

容易に変更できるよう記述量は最小限にしています。

HTML

<!-- モーダルウィンドウ用サンプル1 ここから -->
<button type="button" id="js-button" >サンプル1</button>
<!-- ボタンがクリックされた際に表示される部分、通常は非表示 -->
<div id="js-menu" class="modal_menu">
	<!-- 表示される中身 -->
	<div class="menu__content">
		<p>よろしいですか</p>
		<br>
		<!-- Yes No ボタン -->
		<div class="inButtonSetting">
			<div id="js-yes" class="modal_inButton">はい</div>
			<div id="js-no" class="modal_inButton">いいえ</div>
		</div>
	</div>
</div>
<!-- モーダルウィンドウ用サンプル1 ここまで -->

HTMLでのポイントを2つ解説します。

<button type="button" id="js-button" >サンプル1</button>

モーダルウィンドウの表示するためのボタンになります。ボタンの見た目装飾したい場合は上記にCSSを追加します。

<div id="js-menu" class="modal_menu">
=== 略 ===
</div>

モーダルウィンドウの表示、非表示のために用意している要素になり、モーダルウィンドウで表示される中身はこの<div>タグ内に格納します。表示、非表示の制御はJavaScriptとCSSで行うのでこれのみでは機能しません。

CSS

/* モーダル用サンプル用 CSS start ================== */
/* モーダルウィンドウの表示非表示や表示される位置を制御する */
.modal_menu {
	position: fixed;
	top: 0;
	left: 0;
	display: flex;
	justify-content: center;
	align-items: center;
	width: 100%;
	height: 100%;
	/* モーダルウィンドウ以外の外側部分、どの程度透過するか */
	background-color: rgba(0,0,0,0.5) !important;
	opacity: 0;
	pointer-events: none;
	visibility: hidden;
	/* モーダルウィンドウを表示するまでの時間 0.3秒に指定 */
	transition: all .3s ease;
	transition-property: opacity, pointer-events, visibility;

	/* クリックされた際にウィンドウ表示、非表示の切り替えを行う部分 */
	&.is-show {
		opacity: 1;
		pointer-events: auto;
		visibility: visible;
	}
}

/* ウィンドウ全体のCSS */
.menu__content {
	width: 100%;
	width: 600px;
	padding: 8px 8px 16px;
	background: #dedede;
	text-align: center;
	border-radius: 5px;
}

/* Yes No 2つのボタンを横並べする */
.inButtonSetting {
	display: flex;
	justify-content: center;
}

/* Yes No ボタン自体の装飾 */
.modal_inButton {
	width: 150px;
	padding: 5px !important;
	margin-right: 10px;
	margin-left: 10px;
	border: solid 1px #aaa;
	background: #efefef;
	border-radius: 3px;
}
/* モーダル用サンプル用 CSS end  ================== */

HTMLと合わせて各CSSの役割をコメントで記載しているので表示されるモーダルウィンドウの見た目についてはコメントを見ながら追記や変更を行ってください。
CSSでのポイントは3つ。

/* モーダルウィンドウ以外の外側部分、どの程度透過するか */
background-color: rgba(0,0,0,0.5) !important;

モーダルウィンドウが表示された際に、ウィンドウ以外の背景をどの程度透過するかを決定します。
背景色と透過率をそれぞれ指定できるので変更したい方は以下を参考ください。

[参考]
rgba()-CSS3リファレンス

/* モーダルウィンドウを表示するまでの時間 0.3秒に指定 */
transition: all .3s ease;

ボタンをクリックしてからモーダルウィンドウが表示されるまでの時間を決定します。
サンプルでは0.3秒に指定しています。

/* クリックされた際にウィンドウ表示、非表示の切り替えを行う部分 */
&.is-show {
	opacity: 1;
	pointer-events: auto;
	visibility: visible;
}

非表示の部分をクリックされた時だけ表示に切り替える部分です。後述するjavascriptのclassList.addと組み合わせ、クリックされた際だけこちらのCSSを付け加える事で本来記載されているCSSが以下のように切替わります。
opacity: 0 → 1
visibility: hidden → visible
表示非表示の切り替えが上手くいかない場合はこのあたりの記述が正しいかも確認する必要があります。

JavaScript

//モーダルウィンドウ表示用
window.addEventListener('DOMContentLoaded', function() {

	let button = document.getElementById('js-button');
	let menu = document.getElementById('js-menu');
	let js_yes = document.getElementById('js-yes');
	let js_no = document.getElementById('js-no');
	
	/* ボタンがクリックされたら、 メニュー表示させる */
	button.addEventListener('click',()=>{
		menu.classList.add('is-show');
		return false;
	});

	/* はい ボタンがクリックされたら、 アラート後画面を閉じる */
	js_yes.addEventListener('click',()=>{
		alert("「はい」がクリックされました");
		menu.classList.remove('is-show');
		return false;
	});
	
	/* いいえ ボタンを押したら メニューを閉じる */
	js_no.addEventListener('click', (event) => {
		menu.classList.remove('is-show');
		return false;
	});
});

JavaScriptはシンプルでCSSの部分で解説した is-show クラスをクリックイベントに応じて付け外ししているだけになります。 js_yes.addEventListener の部分に「はい」がクリックされた時の処理、 js_no.addEventListener の部分に「いいえ」がクリックした時の処理をそれぞれ記述しており、例えばフォーム送信前の確認等もこの部分に記述するだけで実装できます。

おまけサンプル

最後に先ほどのテンプレートに少し追記を行い装飾したサンプルを記載します。
[サンプル2]
https://x.zmjtk.jp/modal2/

コピペしたい方はリンクより直接ソースを閲覧してください。
ボタンや表示される要素等、自由にカスタマイズ可能な事が分かるかと思います。

コメント