一定時間操作がないと表示されるモーダルウインドウの作り方
一定時間ユーザーの操作がない場合に、自動で表示されるモーダルウインドウの作り方を紹介します。ページを開いてから何も操作されていない時間をJavaScriptで計測し、指定した時間を超えると画面中央へモーダルウインドウを表示するサンプルです。今回は動作を確認しやすいように、5秒間操作がない場合にモーダルを表示します。
マウスを動かす、クリックする、キーを押す、画面をスクロールする、タッチ操作をするといったユーザー操作を検知すると待機時間をリセットし、その時点から再び5秒間を計測します。操作が続いている間はモーダルウインドウが表示されず、操作が止まって5秒経過した場合だけ自動で表示される仕組みです。
一定時間操作していないユーザーへの案内や、入力途中の確認、会員サイトやECサイトでの注意喚起など、ページを開いているものの操作が止まっている場合に情報を表示したい場面で活用できます。待機時間はJavaScriptの数値を変更して調整でき、CSSではモーダルウインドウの横幅や余白、角丸などを変更できます。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
マウス・クリック・キーボード・スクロール・タッチ操作がない状態が5秒続くと、モーダルウインドウが自動で表示されます。操作すると5秒の計測が最初からやり直されます。
5秒間操作がなかったため、モーダルウインドウを表示しました。
5秒間何も操作しないとモーダルウインドウが表示されます。途中で操作すると待機時間がリセットされます。「もう一度確認する」をクリックすると5秒の計測を最初からやり直せます。
コードをコピーして使おう!
<!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="inactivity-modal-window_wrap">
<!-- タイトル -->
<div class="inactivity-modal-window_title">
5秒間操作せずにお待ちください
</div>
<!-- 説明文 -->
<p class="inactivity-modal-window_text">
マウス・クリック・キーボード・スクロール・タッチ操作がない状態が5秒続くと、モーダルウインドウが自動で表示されます。操作すると5秒の計測が最初からやり直されます。
</p>
</div>
<!-- 一定時間操作がない場合に表示するモーダルウインドウ -->
<div class="inactivity-modal-window_modal" id="inactivity-modal-window-modal" role="dialog" aria-modal="true" aria-labelledby="inactivity-modal-window-title">
<!-- モーダルタイトル -->
<div class="inactivity-modal-window_modal-title" id="inactivity-modal-window-title">
操作がありません
</div>
<!-- モーダル説明文 -->
<p class="inactivity-modal-window_modal-text">
5秒間操作がなかったため、モーダルウインドウを表示しました。
</p>
<!-- 閉じるボタン -->
<button class="inactivity-modal-window_close" id="inactivity-modal-window-close" type="button">
閉じる
</button>
</div>
<!-- JavaScriptファイル -->
<script src="script.js"></script>
</body>
</html>
サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q ダウンロードしたけど、これをネット上で動かすにはどうするの?
Googleアカウントがあれば、InfinityFreeで無料サーバーを作成して、ダウンロードしたサンプルをネット上で動かせます。
InfinityFreeを初めて利用する場合は①から、すでにサーバーを作成している場合は②へ進んでください。
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。ページを開いた時点からユーザーの操作がない時間をJavaScriptで計測し、5秒間操作がない状態が続いた場合にモーダルウインドウを自動で表示します。マウス・クリック・キーボード・スクロール・タッチ操作を検知すると、それまでの待機時間をリセットして再び5秒間の計測を開始します。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlはページの表示内容と、一定時間操作がない場合に表示するモーダルウインドウを構成するファイルです。モーダルウインドウにはタイトル、説明文、「閉じる」ボタンを配置しています。
style.cssはデモ表示エリアとモーダルウインドウのデザインを設定するファイルです。モーダルウインドウは通常時をdisplay:noneとして非表示にし、JavaScriptによってis-activeクラスが追加された場合だけdisplay:blockへ切り替えて表示します。背景を暗くするオーバーレイや×ボタン、開閉アニメーションは使用していません。
script.jsはユーザーの操作を検知し、操作がない時間を計測するファイルです。setTimeout()を使って5秒間を計測し、mousemove、mousedown、keydown、scroll、touchstartのいずれかを検知すると、それまでのタイマーを解除して最初から計測し直します。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置します。3つのファイルを同じ階層へ保存したあと、sample/index.htmlをブラウザで開いてください。index.htmlからstyle.cssとscript.jsが読み込まれます。ページを開いてからマウスやキーボードなどを操作せずに5秒間待つと、モーダルウインドウが自動で表示されます。5秒が経過する前に操作した場合は、その操作を行った時点から再び5秒間の計測が始まります。
カスタマイズできる内容
index.htmlではモーダルウインドウのタイトルや説明文、「閉じる」ボタンの文字を変更できます。style.cssではモーダルウインドウの最大横幅、内側余白、角丸、背景色、影などを変更できます。JavaScriptではinactivityModalWindowDelayの値を変更することで、操作がなくなってからモーダルウインドウを表示するまでの時間を調整できます。また、inactivityModalWindowEventsへ登録するイベントを変更すれば、どの操作を待機時間のリセット対象にするかも変更できます。
数値調整
script.js
const inactivityModalWindowDelay = 5000;
ユーザーの操作がなくなってからモーダルウインドウを表示するまでの待機時間です。JavaScriptでは1000ミリ秒が1秒なので、5000は5秒を表します。10000へ変更すると10秒、30000へ変更すると30秒になります。値を大きくすると表示までの時間が長くなり、小さくすると短くなります。
style.css
max-width:700px;
デモ表示エリアの最大横幅です。値を大きくすると表示エリアが横に広がり、小さくするとコンパクトになります。
margin:40px auto;
デモ表示エリアの上下余白です。40pxを大きくすると上下の間隔が広がり、小さくすると狭くなります。
padding:32px;
デモ表示エリアの内側余白です。値を大きくすると内容と枠線の間隔が広がり、小さくすると狭くなります。
border-radius:18px;
デモ表示エリアとモーダルウインドウの角丸です。値を大きくすると丸みが強くなり、小さくすると角に近づきます。
width:calc(100% - 40px);
モーダルウインドウの横幅です。画面幅から40pxを引くことで左右に余白を確保しています。40pxを大きくすると左右の余白が広がり、小さくするとモーダルが画面端へ近づきます。
max-width:420px;
モーダルウインドウの最大横幅です。値を大きくするとモーダルが横に広がり、小さくするとコンパクトになります。
padding:28px;
モーダルウインドウの内側余白です。値を大きくすると内容とモーダル外周の間隔が広がり、小さくすると狭くなります。
margin:0 0 12px;
モーダルタイトルの下側余白です。12pxを大きくするとタイトルと説明文の間隔が広がり、小さくすると狭くなります。
margin:0 0 24px;
モーダル説明文の下側余白です。24pxを大きくすると説明文と「閉じる」ボタンの間隔が広がり、小さくすると狭くなります。
padding:10px 20px;
「閉じる」ボタンの内側余白です。上下の10pxを大きくするとボタンが高くなり、左右の20pxを大きくすると横に広がります。
レスポンシブ対応
このサンプルはレスポンシブ対応です。モーダルウインドウにはwidth:calc(100% - 40px)とmax-width:420pxを設定しているため、広い画面では最大420pxで表示され、画面幅が狭くなると左右に余白を残しながら縮小します。また、640px以下ではデモ表示エリアをpadding:24px 18px;、モーダルウインドウをpadding:24px 18px;へ変更し、スマートフォンでも内容を確認しやすいようにしています。
コメント