モーダルの基本的な使い方とデザイン

モーダルウィンドウのイラスト

モーダルとは、「モードがある」状態のことで、特定のタスクや機能の利用に制限された状態のことをモーダルと表現し、ユーザーに重要な操作や確認を促したりするときに用いられることが多く、JavaScriptで作られることが多いUIです。

今回は、モーダルの基本的な使い方とデザインについてご紹介します。

モーダルのメリットとデメリット

WEBサイトの仕様の一部をモーダルにすることで、ユーザーに特定のタスクに集中できる環境を提供し、とって欲しい行動を促すことや文章·画像などの情報に注意や関心を惹きつけることができますが、表示されたタスクが完了するまで、ユーザーは他の作業を行えず、ユーザーは表示内容に従うか、モーダルウィンドウを閉じなければならないという、強制力が強くユーザーにストレスを与える可能性のあるUIで、モーダルウィンドウを使用するデザイナーが多くなっているのも事実です。

例えば、Twitterのプロフィール編集画面はモーダルです。

このTwitterのモーダルなUIは、ユーザーを1つの操作に縛り付けてしまうため、その操作が完了するまで他の操作を制限してしまい、ユーザーは自由に操作することができず、ストレスを感じさせてしまいます。

モーダルなUIを利用する際は、ユーザーが特定のタスクに集中する必要があるか、操作の自由を奪ってまで提示すべき情報なのかといった検討が必要で、場合によってはユーザーに制限のない、作業中の画面の操作を続行できる「別ウィンドウ」のポップアップの仕様も考慮した方が良いでしょう。

モーダルを使用するときの注意点

モーダルは強制力の強いUIですが、使い方を考慮することで有効に使うこともできます。

以下の2点は最低限考慮してモーダルの設置を行いましょう。

そもそもモーダルが適切かどうか?

モーダルは、ページを遷移するのではなく、ページ上にウィンドウを表示することで行動を促したり、情報を提供したりすることができるUIですが、モーダルを開いている間は、背景のページを操作することができまない為、時としてユーザーが望まない動作を無理やりさせることで、ユーザーのストレスとなってしまいます。

代用として、アコーディオンのUIならユーザーが任意でコンテンツの表示、非表示が行える為、ストレスも軽減させることができ、表示させたい内容を考慮して適切なUIで設計することが大切です。

モーダルの利点で言えば、ユーザーは任意のタイミングで背景にある元のページに戻ることができるため、タスクが完了した後に元のページに戻る必要がある場合には、ページを遷移してから戻るよりも、ユーザーは文脈を理解しながら操作できるため有効な使い方ができます。

モーダルはページを遷移しないUIの為、完了やキャンセル後の挙動がイメージしやすく、ページ遷移を挟まずに情報を提示できるため結果ユーザーもその内容に集中することができます。

サイズに気をつける

スマホなどの画面のサイズが小さい端末では、閉じるボタンが押しずらくなる為モーダルは向いていません。

その為、モーダルのサイズはもちろんですが、表示後の閉じるボタンの適切なサイズ設定にも配慮をして設置をしましょう。

HTMLとCSSのコピペでできるモーダルのUI

モーダルは、表示されている間は他の操作ができませんがそのウィンドウに集中することができるメリットとデメリットを併せ持つUIです。

以下はjsを使わないHTMLとCSSのコピペでできるモーダルです。

モーダルを表示

コードを表示する

HTML

<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>

CSS

.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
}