JavaScript - <dialog> 要素でモーダルダイアログを作成する方法

HTML の <dialog> 要素を使って作成するダイアログは、CSS で見た目を自由にカスタマイズできます。showModal() メソッドまたは show() メソッドで自作のダイアログを表示する方法を学びましょう。

JavaScript - <dialog> 要素でモーダルダイアログを作成する方法
Photo by Jason Leung / Unsplash

<dialog> 要素で作るダイアログ

今回は、HTML の <dialog> 要素でダイアログを作成し、JavaScript で表示する方法を紹介します。

ダイアログとは、パソコンやスマホを操作しているときに画面のいちばん手前に現れる小さなウィンドウのことです。ダイアログボックス(メッセージボックス・ポップアップウィンドウ)とも呼ばれ、ユーザーに何かを通知したり、入力や確認を求めるときに表示されます。

JavaScript では、alert()prompt()confirm()メソッドを使ってダイアログを表示することができますね。これらのダイアログの見た目はブラウザによって決まります。一方で、HTML の <dialog> 要素を使うと、好みのスタイルのダイアログを簡単に作成することができますよ。

メッセージと閉じるボタンを含んだダイアログの例
メッセージと閉じるボタンを含んだダイアログの例

<dialog> 要素の使い方

では早速、HTML の <dialog> 要素の使い方を見ていきましょう。書き方はとても簡単です。<dialog> タグで、ダイアログ内に表示したい内容を囲みます。

<!-- ダイアログ要素 -->
<dialog>
  これはダイアログです
</dialog>

<dialog> 要素は、デフォルトでは非表示です。open 属性を指定すると見えるようになりますよ。

<!-- open属性を指定 -->
<dialog open>
  これはダイアログです
</dialog>

ブラウザには下のように表示されます。ダイアログには黒い枠線がついていて、位置は画面の左右中央です。

黒い枠線で囲まれたダイアログ
黒い枠線で囲まれたダイアログ

ダイアログの見た目を変える

<dialog> 要素で作るダイアログは、CSS で簡単に見た目をカスタマイズすることができます。たとえば、下のような CSS でダイアログのスタイルを変更してみましょう。

dialog {
  font-size: 30px;
  font-weight: bold;
  font-family: sans-serif;
  padding: 80px 30px;
  box-shadow: gray 2px 2px 5px 2px;
  border: none;
  border-radius: 20px;
}

ブラウザには下のように表示されます。

黒い枠線がなくなりサイズが大きくなったダイアログ
黒い枠線がなくなりサイズが大きくなったダイアログ

ボタンクリックでダイアログを表示する

ここからは、ユーザーの操作によってダイアログが表示されるようにしていきます。たとえば、ボタンをクリックしたらダイアログが表示されるようにしてみましょう。

HTML

HTML では、ボタンとダイアログを作成します。

  • ダイアログを表示するためのボタン openDialog <button> を用意します。
  • <dialog> 要素内には、ダイアログを閉じるためのボタン closeDialog <button> を作ってください。
<!-- ダイアログを表示するためのボタン -->
<button class="openDialog">ダイアログを開く</button>

<!-- ダイアログ -->
<dialog class="dialogDemo">
  これはHTMLのdialog要素で作成したダイアログです
  <!-- ダイアログを閉じるためのボタン -->
  <button class="closeDialog">閉じる</button>
</dialog>

ブラウザには下のように表示されます。open 属性のない <dialog> 要素は非表示です。ダイアログを表示するためのボタンだけが画面に表示されます。

ダイアログを開くボタンが表示されている
ダイアログを開くボタンが表示されている

JavaScript

JavaScript では、ボタンをクリックできるようにしたり、ダイアログが表示されるようにコーディングしていきます。

まずは、要素の取得です。HTML 要素に動きをつけるためには、JavaScript でそれぞれの要素にアクセスする必要があります。そのために使うのが、document.querySelector() メソッドです。document.querySelector() メソッドで要素を取得して変数に格納しておくと、その変数を参照して HTML 要素を操作できるようになりますよ。

  • ダイアログを開くボタン openDialog <button> を取得し、変数 openBtn に格納します。
  • ダイアログ dialogDemo <dialog>を取得し、変数 dialogDemo に格納します。
  • 閉じるボタン closeDialog <button> を取得し、変数 closeBtn に格納します。
// ダイアログを開くボタン
const openBtn = document.querySelector('.openDialog');
// ダイアログ
const dialogDemo = document.querySelector('.dialogDemo');
// 閉じるボタン
const closeBtn = document.querySelector('.closeDialog');

次に、ユーザーがダイアログを開くボタンをクリックしたときに、ダイアログが開くようにしましょう。クリックをきっかけに何か動きをつけるためには、ボタンに click イベントを追加する必要があります。そのために使うのが、addEventListener() メソッドです。

  • ダイアログを開くボタンopenBtnclick イベントを追加します。
// ダイアログを開くボタンにクリックイベントを追加
openBtn.addEventListener('click', () => {
  
  //クリックされたときに実行する処理
  // …
  
});

上のコードの () => { } の部分は関数を表していて、波括弧 { } の中に、click イベントが発生したときに実行する処理を書きます。ボタンがクリックされたときに実行するのは、「ダイアログを開く」という処理です。ダイアログを開くために使うのは、showModal() メソッドです。

  • ダイアログ dialogDemoshowModal() メソッドで開きます。
// ダイアログを開くボタンがクリックされたとき
openBtn.addEventListener('click', () => {

  // ダイアログを開く
  dialogDemo.showModal();

});

続けて、閉じるボタンにも click イベントを追加しましょう。閉じるボタンがクリックされたときに、ダイアログが閉じるようにしますよ。ダイアログを閉じるために使うのは、close() メソッドです。

  • 閉じるボタン closeBtnclick イベントを追加し、ダイアログ dialogDemoclose() メソッドで閉じます。
// 閉じるボタンがクリックされたときダイアログを閉じる
closeBtn.addEventListener('click', () => {
  dialogDemo.close();
});

以上で、ボタンクリックでダイアログを表示するコードが完成です。

//***********************************
// ボタンクリックでダイアログを表示するコード
//***********************************

// ダイアログを開くボタン
const openBtn = document.querySelector('.openDialog');
// ダイアログ
const dialogDemo = document.querySelector('.dialogDemo');
// 閉じるボタン
const closeBtn = document.querySelector('.closeDialog');

// ダイアログを開くボタンがクリックされたときダイアログを開く
openBtn.addEventListener('click', () => {
  dialogDemo.showModal();
});

// 閉じるボタンがクリックされたときダイアログを閉じる
closeBtn.addEventListener('click', () => {
  dialogDemo.close();
});

ダイアログを開くボタンをクリックすると、画面のいちばん手前の中央にダイアログが表示され、その背後は少し透明な黒色になります。このように表示されるダイアログは、モーダルダイアログ、またはモーダルウィンドウと呼ばれます。

showModal()メソッドで表示されるダイアログの例
showModal()メソッドで表示されるダイアログの例

モーダルダイアログとは

showModal() メソッドで開いたダイアログは、「モーダル」というダイアログになります。モーダルとは、ダイアログが閉じられるまで他の部分を操作できなくなるダイアログことです。モーダルダイアログは、閉じるボタンをクリックせずに、キーボードの Esc キーを押してダイアログを閉じることもできますよ。

一方で、ダイアログを表示した状態で他の領域を操作できるものはモードレスダイアログと呼ばれます。showModal() ではなく show() メソッドを使うと、下のようにモードレスダイアログが開きます。モードレスダイアログは、Esc キーを押して閉じることはできません。

openBtn.addEventListener('click', () => {
  dialogDemo.show(); // モードレスダイアログを開く
});
show()メソッドで表示されるモードレスダイアログの例
show()メソッドで表示されるモードレスダイアログの例

モーダルダイアログの背後の色を変える

showModal() メソッドで開いたモーダルダイアログの場合、CSS の ::backdrop 擬似要素を使うと、ダイアログが表示されたときの背後の色を設定することができます。

先ほど見たとおり、モーダルダイアログの背後の色は、デフォルトでは透明度のある黒色です。たとえば、CSS を次のようにすると、背後はオレンジ色になります。

.dialogDemo::backdrop {
  background-color: #FAB367; /* オレンジ色 */
}
モーダルダイアログが表示され、背後はオレンジ色
モーダルダイアログが表示され、背後はオレンジ色

CSS を次のようにすると、オレンジ色が半透明になり、背後の要素がうっすら見えるようになります。

.dialogDemo::backdrop {
  background-color: #FAB36750; /* 半透明のオレンジ色 */
}
モーダルダイアログが表示され、背後は半透明のオレンジ色
モーダルダイアログが表示され、背後は半透明のオレンジ色

さらに、backdrop-filter プロパティで blur の値を指定すると、背後をぼかすことができますよ。

.dialogDemo::backdrop {
  background-color: #FAB36750;
  /* ぼかし効果 */
  backdrop-filter: blur(3px);
  -webkit-backdrop-filter: blur(3px); /* Safari */
}
モーダルダイアログが表示され、背後にはぼかし効果が適用されている
モーダルダイアログが表示され、背後にはぼかし効果が適用されている

サンプルプロジェクト

では最後に、<dialog> 要素で作成したダイアログのサンプルプロジェクトを紹介します。showModal() メソッドで開くモーダルダイアログと、show() メソッドで開くモードレスダイアログです。二つのダイアログの違いを試してみてください。

See the Pen JavaScript - Dialog with HTML <dialog> element by Pyxofy (@pyxofy) on CodePen.


まとめ

今回は、HTML の <dialog> 要素を使ってダイアログボックスを作成し、showModal() メソッドまたは show() メソッドでダイアログがどのように表示されるのかを解説しました。

<dialog> 要素には好きな内容を入れることができますし、見た目も CSS で簡単に設定できるので、ぜひオリジナルのダイアログを作ってみてくださいね。

最後まで読んでいただき、ありがとうございます。この記事をシェアしてくれると嬉しいです!

SNSで Pyxofy とつながりましょう! LinkedInThreadsMastodon X (Twitter) @pyxofyFacebook

関連記事

JavaScript - ダイアログの表示方法 - alert(), confirm(), prompt()
ポップアップで表示するダイアログを3つ紹介します。ユーザーに対してメッセージを表示する alert()、確認をする confirm()、入力を求める prompt() の使い方を学びましょう。
CSS Art – How to Make Image Masks and Knockout Text
Ever wondered how colorful CSS gradients can be combined with mask and text. Step-by-step article to create CSS mask and knockout text.
CSS Animation – Fade In and Out
Poof! Now you see it, now you don’t. Let’s learn how to make sophisticated fade effects and much more in this step-by-step article.
スクラッチプログラミング - セリフを一文字ずつひょうじしよう
スプライトがいうセリフの文字を、キーボードで入力(にゅうりょく)されているかのように、ひとつずつ表示(ひょうじ)する方法(ほうほう)をしょうかいします。「ブロック定義(ていぎ)」と「変数(へんすう)」をつかってプログラミングします。