LoginSignup
4
2

More than 3 years have passed since last update.

dialog要素で遊んでみた

Last updated at Posted at 2021-01-22

HTMLの新しめの要素について調べていたら、
HTML5.2から入ったdialog要素が出てきたので、遊んでみました!(2017年にW3C勧告された要素です)

対応ブラウザ確認

Can I use でdialogがどのブラウザに対応しているか見てみます。
Can I use.png
https://caniuse.com/?search=dialog

IEはさておき、Firefox、Safariではまだ対応していないようで、Webサイトへの普及はこれからなのかなと思いました。どうりでお見かけしないわけだ!

ちなみに、VSコードでhtmlファイル作ってpとか打つと勝手に<p></p>と変換してくれるのですが、dialogと打っても変換されませんでした。これは自力で打っていくしかないですね。

::backdrop擬似要素が使える

全画面モードに配置される要素とdialog要素の両方に使えて、それらの直下に置かれる擬似要素です。
dialog要素だったら要素の下をぼかしたり隠したりするのに用います。
PCではSafari以外は使える擬似要素です。

実装

やってみました

<dialog>
  <p>あいうえお</p>
</dialog>

結果は

dialog.png

真っ白。
しかし、dialog要素にopen属性をつけると、

<dialog open>
  <p>あいうえお</p>
</dialog>

dialog-open.png

表示されます。open属性のつけ外しでダイアログの表示・非表示ができることがわかります。
HTMLDialogElementインターフェースのメソッドでdialog要素を操作できるので、JSでダイアログの開閉をしてみます。ちなみに、IEとSafariでは効かないインターフェースです。

JSでダイアログを開いてみる

新しく作成したOPEN Modalボタンを押すと、ダイアログが表示されるように実装しました。
HTML▼

<dialog id="dialog">
  <p>あいうえお</p>
</dialog>

<button id="openModal">OPEN Modal</button>

JS▼

<script>
(function() {
  var dialog = document.getElementById('dialog');
  var openModal = document.getElementById('openModal');
  openModal.addEventListener('click', function() {
    dialog.showModal();
  })
})();
</script>

dialog-open-js.png

実際の挙動はこちら

See the Pen dialog element by miika (@miika-codepen) on CodePen.

レイヤーとかどうなっているのかと思って、検証ツールで見てみると、ダイアログとレイヤーに値する部分が、それぞれ同じdialog#dialog要素と表示されましたが、それぞれ別のRoleでした(ACCESSIBILITYって書いてあるところ)。一つはdialog、もう一つはgenericです。レイヤーに値する要素(Roleがgeneric)の方は、::backdrop擬似要素に値しそうですが、::backdrop擬似要素はどの要素からも継承しないためか、検証ツールでdialog#dialog::backdropと表示されず、dialog#dialogと表示された模様です。

ダイアログに値する要素▼
dialog-role-dialog.png

レイヤーに値する要素▼
dialog-role-generic.png

これらのRoleはrole属性でHTMLに設定したものではないので、JSで取得できず、よくある「ダイアログ以外をクリックしたらクローズ」の実装、つまり、「dialog#dialog要素以外を選択したらダイアログを閉じる」ができなかったです。
JSでの操作はできなかったですが、CSSでdialog#dialog::backdropbackgroundを変えることは可能です。背景色とか変えられます。

jQueryの場合は、show()hide()で実現できます。先述した、HTMLDialogElementインターフェースは、IEとSafariで効かないのを考えると、jQueryで実装するのも手ですね。

まとめ

dialog要素はopen属性の取り外しで見え隠れする簡易なもので、::backdrop擬似要素のおかげでレイヤーをこちらで考えてレイヤー用のDOMを作らなくていいことがよかったです。
実装自体はしやすいし、HTMLで構造文書を目指してコーディングしていく分にはぜひ使っていきたい気持ちの一方、ブラウザの対応がまちまちなのと、ダイアログ以外をクリック・タッチしたら消える実装に道が見えないことが難でした!今後ブラウザへの対応が進むのか、dialog要素・::backdrop擬似要素が進化するのか、どうなるのか想像を膨らませて、終わりとします!

参考

HTML 5.2 W3C Recommendation, 14 December 2017
https://www.w3.org/TR/html52/

MDN Web Docs <dialog>: ダイアログ要素
https://developer.mozilla.org/ja/docs/Web/HTML/Element/dialog

MDN Web Docs ::backdrop
https://developer.mozilla.org/ja/docs/Web/CSS/::backdrop

MDN Web Docs HTMLDialogElement
https://developer.mozilla.org/ja/docs/Web/API/HTMLDialogElement

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2