モーダルとは、「モードがある」状態のことで、特定のタスクや機能の利用に制限された状態のことをモーダルと表現します。
このモーダルは、ユーザーに重要な操作や確認を促したりするときに用いられることが多く、JavaScriptで作られることが多いUIです。
表示の違いで「ポップアップ」と言ったりしますが、広義には一緒です。
今回は、そんなモーダルの基本的な使い方とデザインについてご紹介します。
目次
モーダルのメリットとデメリット
WEBサイトの仕様の一部をモーダルにすることで、ユーザーに特定のタスクに集中できる環境を提供します。そして、「ユーザーにとって欲しい行動」を促すことや、文章·画像などの情報に注意や関心を惹きつけることができます。
ですが、表示されたタスクが完了するまで、ユーザーは他の作業を行えず、ユーザーは表示内容に従うか、モーダルウィンドウを閉じなければならないという、強制力が強くユーザーにストレスを与える可能性のあるUIです。
例えば、Twitterのプロフィール編集画面はモーダルです。
このTwitterのモーダルなUIは、ユーザーを1つの操作に縛り付けてしまいます。その為、操作が完了するまで他の操作を制限してしまい、ユーザーは自由に操作することができず、ストレスを感じさせてしまいます。
モーダルのUIを利用する際は、ユーザーが特定のタスクに集中する必要があるか、操作の自由を奪ってまで提示すべき情報なのかといった検討が必要です。
また、場合によってはユーザーに制限のない、作業中の画面の操作を続行できる「別ウィンドウ」のポップアップの仕様も考慮した方が良いでしょう。
モーダルがベストなのか、どうなのかは慎重に検討しましょう。
モーダルを使用するときの注意点
モーダルは強制力の強いUIですが、使い方を考慮することで有効に使うこともできます。
以下の2点は最低限考慮して、モーダルの設置を行いましょう。
そもそもモーダルが適切かどうか?
モーダルは、ページを遷移するのではなく、ページ上にウィンドウを表示することで行動を促したり、情報を提供したりすることができるUIです。
モーダルを開いている間は、背景のページを操作することができまない為、時としてユーザーが望まない動作を無理やりさせることで、ユーザーのストレスとなってしまいます。
代用として、アコーディオンのUIならユーザーが任意でコンテンツの表示、非表示が行える為、ストレスも軽減させることができ、表示させたい内容を考慮して適切なUIで設計することが大切です。
モーダルの利点で言えば、ユーザーは任意のタイミングで背景にある元のページに戻ることができます。
その為、タスクが完了した後に元のページに戻る必要がある場合には、ページを遷移してから戻るよりも、ユーザーは文脈を理解しながら操作できるため有効な使い方ができます。
つまり、モーダルはページを遷移しないUIです。
ユーザーが完了やキャンセル後の挙動がイメージしやすく、ページ遷移を挟まずに情報を提示できるため、結果ユーザーもその内容に集中することができるのはメリットでもあります。
サイズに気をつける
スマホなどの画面のサイズが小さい端末では、閉じるボタンが押しずらくなる為モーダルは比較的向いていません。
その為、モーダルのサイズはもちろんですが、表示後の閉じるボタンの適切なサイズ設定にも配慮をして設置をしましょう。
HTMLとCSSのコピペでできるモーダルのUI
モーダルは、表示されている間は他の操作ができませんがそのウィンドウに集中することができるメリットとデメリットを併せ持つUIです。
以下はjsを使わないHTMLとCSSのコピペでできるモーダルです。
コードを表示する
<center>
<a href="#modal-01" class="modal-button">
モーダルを表示
</a>
</center>
<div class="modal-wrapper" id="modal-01">
<a href="#!" class="modal-overlay"></a>
<div class="modal-window">
<div class="modal-content">
<p class="modal_title">モーダルの中身</p>
<p>
ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
</p>
<p>
ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
</p>
</div>
<a href="#!" class="modal-close"><i class="far fa-times-circle"></i></a>
</div>
</div>
.modal-wrapper {
z-index: 999;
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
padding: 40px 10px;
text-align: center;
}
.modal-button {
color: #4f96f6;
background-color: #eeeeee;
font-weight: bold;
text-align: center;
cursor :pointer;
transition: all 0.3s;
display: block;
margin-top: 40px;
margin-bottom: 1px;
padding: 12px 2px;
max-width:300px;
text-decoration: none;
}
.modal-button:active {
/*ボタンを押したとき*/
-webkit-transform: translateY(2px);
transform: translateY(2px);/*下に動く*/
}
/*アイコンを表示*/
.modal-button:after {
font-family: "Font Awesome 5 Free";
content: "\f2d0";
padding-left: 8px;
}
/*ラベルホバー時*/
.modal-button:hover {
color: #FFFFFF;
background-color: #4f96f6;
transition: .6s;
}
.modal-wrapper:not(:target) {
opacity: 0;
visibility: hidden;
transition: opacity .3s, visibility .3s;
}
.modal-wrapper:target {
opacity: 1;
visibility: visible;
transition: opacity .4s, visibility .4s;
}
.modal-wrapper::after {
display: inline-block;
height: 100%;
margin-left: -.05em;
vertical-align: middle;
content: ""
}
.modal-wrapper .modal-window {
box-sizing: border-box;
display: inline-block;
z-index: 20;
position: relative;
width: 70%;
max-width: 600px;
padding: 10px 30px 25px;
border-radius: 2px;
background: #fff;
box-shadow: 0 0 30px rgba(0, 0, 0, .6);
vertical-align: middle
}
.modal-wrapper .modal-window .modal-content {
max-height: 80vh;
overflow-y: auto;
text-align: left
}
.modal_title {
font-size: 1.5em;
position: relative;
overflow: hidden;
padding: 0;
}
.modal_title::before,
.modal_title::after{
content: "";
position: absolute;
bottom: 0;
}
/* h2 プライマリカラー*/
.modal_title:before{
border-bottom: 4px solid #6bb6ff;
width: 100%;
}
/* h2 セカンダリカラー*/
.modal_title:after{
border-bottom: 4px solid #c8e4ff;
width: 100%;
}
.modal-content p {
margin: 10px 0 0 0;
}
.modal-overlay {
z-index: 10;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: rgba(0, 0, 0, .8)
}
.modal-wrapper .modal-close {
z-index: 20;
position: absolute;
top: 5px;
right: 5px;
width: 35px;
color: #95979c !important;
font-size: 30px;
font-weight: 700;
line-height: 35px;
text-align: center;
text-decoration: none;
text-indent: 0
}
.modal-wrapper .modal-close:hover {
color: #2b2e38 !important
}
その他のHTMLとCSSでできるモーダル
その他のHTMLとCSSだけで実装できるモーダルは、以下の記事です。
クリックすると上から落ちてくるものや、WordPressの検索ウィジェットを表示するモーダルもあるので、こちらの記事も参考にしてみてください。
HTMLとCSSのコピペでできるモーダルウィンドウのデザイン3種jQueryを使ったモーダル
JSを使って、モーダルを実装できます。
実装も簡単です。
ここでは、トップページ限定や、ユーザーが主体的に見たいと思ってくれた場合に、ストレスにならずきちんと表示をさせたい場合によく使うjQueryをいくつかご紹介します。
拡大画像をポップアップで表示
単体で使うことはなく、スライダー・カルーセルとセットで使うことが比較的多いモーダルのjQueryです。
とは言え、最近はスライダー・カルーセルにも標準で拡大して表示させる機能があるので、あまり使わなくなりました。
コピペでできるlightbox2を使ったギャラリーの表示インタースティシャルとは、メインのコンテンツを覆い隠すように表示されるポップアップ。
いわゆるモーダルで、強制的に表示されてしまう、かなり強制力が強いUIなので、使う時は結構慎重に使うことが適切かどうかを検討しますが、使う場合このjQueryのcookieなしで実装することが多いです。
jQueryのコピペでcookieを使って初回アクセス時にモーダルを表示させるスニペットYouTubeやvimeoの動画モーダル
モーダルはCSSでも実装できますが、YouTubeやvimeoの動画を組み合わせて動画を再生した場合、動画を停止せずにモーダルを非表示にしても再生が止まりません。
その為、動画をモーダルで表示する場合だ、このjQueryが勝手に制御してくれるので非常に重宝します。
また、フワッと表示される感じでそこまで強い感じがしないのも、GOODなポイントです。
jQueryライブラリmodal-videoのコピペでできるYouTubeやvimeoの動画モーダル画像や動画のモーダル
モーダルの実装自体の難易度は難しくないですが、できることなら簡単に実装したい時に活躍するのが、このjQueryライブラリFancyboxです。
簡単なので、このライブラリを使うことが最近多いです。
jQueryライブラリFancyboxのコピペでできる画像や動画のモーダルスクロールしてYouTubeが表示されると自動で再生
YouTube Inview Autoplayは、ページ内に埋め込んだYouTubeの動画がウィンドウ内に表示されると、自動的に再生・停止するjQueryプラグインです。
ウィンドウ内に動画が入ると再生されるので、ユーザーが再生しなくても一番最初から見て欲しい時など、スクロールを挟んで見せたいYouTubeの動画がある時に役立ちます。
jQueryライブラリYouTube Inview AutoplayでYouTube動画がウィンドウ内に表示されたら自動で再生を開始ネイティブなJavaScriptのモーダル
非jQueryでいわゆる「バニラJS」のモーダルの作り方も、サンプルを交え解説しています。
初回のみ表示させるモーダルや、YouTubeを表示させるモーダルもプラグインやライブラリ不要でできるので、チェックしてみてください。
JavaScriptのgetBoundingClientRect();でカードをクリックしたらカードからモーダルを拡大縮小して表示
JavaScriptの.offsetHeightでページ最下部に到達した時にモーダルを表示
JavaScriptの.preventDefault()でaタグのリンククリックで離脱防止のモーダルを出してOKでページ遷移
JavaScriptの.indexOf()でURLを部分一致で検索して一致する場合にモーダルを表示
JavaScriptの.addEventListenerクリックで検索フォームのモーダル
JavaScriptの.createElement() でYouTube動画をモーダルで表示
JavaScriptのsessionStorageでそのページへ初回アクセス時にモーダルを表示
JavaScriptの.querySelectorAll()でページのhタグを取得してモーダルに目次を生成
JavaScriptの.querySelectorAll()で複数のモーダル
JavaScriptのstyle.displayでモーダル
さいごに
今では多少ユーザーに敬遠されるUIのモーダルですが、使い方によってはユーザーの快適な体験を提供します。
その為、モーダルを使う時は
- いつ・どのように表示させるのか?
- 何を表示させるのか?
- ユーザーがどう感じるか?
- 本当にモーダルが適切かどうか?
は最低限考慮した上で、実装するようにしましょう。