こんにちは。エキサイトでデザイナーをしている齋藤です。
今回は、button
タグの新しい属性であるcommand
属性を使用して、JSなしでdialog
タグを制御する方法をご紹介します。
なお、本稿の内容は2025年6月9日時点のHTML Living Standardと各ブラウザの対応状況に準じています。
command属性とは
command
属性はbutton
タグの新しい属性の一つで、HTML Living Standardでも追加済みとなっています。
dialog
タグ等のJavaScriptのメソッドに対応した値を指定することで、JSと同等なアクションを呼び出すことが可能です。
また、要素の紐づけを指定するcommandfor
属性とセットでの使用が想定されています。
command
属性とcommandfor
属性は、Chrome135
とEdge 135
のみが正式対応となっており、他のブラウザはベータ版のみ対応か未対応となっていますので、ご注意ください。
実現したいこと
実現したいことを整理します。
以下のように、dialog
タグを使用してダイアログ要素のボタンを通じた表示/非表示を実現したいです。
See the Pen JSを使用してdialogタグを制御する by AyumuSaito (@ayumusaito-excite) on CodePen.
const dialog = document.querySelector("#dialog") const showButton = document.querySelector("#show-button") const closeButton = document.querySelector("#close-button") showButton.addEventListener("click", () => { dialog.showModal(); }); closeButton.addEventListener("click", () => { dialog.close(); });
このように、従来の方法ではJSの記述が必要です。
Alpine.jsを使用するとHTMLに処理の記述を寄せることもできます。詳しくは次の記事をご覧ください。
command
属性を使用してダイアログ要素を制御してみる
command
属性とcommandfor
属性を使用して、ダイアログ要素を制御してみます。
冒頭でご説明した通り、command
属性はdialog
タグ等のJavaScriptのメソッドに対応した値を指定することで、JSと同等なアクションを呼び出すことが可能です。
例えば、以下の値が用意されています。
値 | 対応するメソッド |
---|---|
show-modal |
.showModal() |
close |
.close() |
request-close |
.requestClose() |
command
属性に指定したアクションの対象となる要素の指定には、commandfor
属性を使用します。
したがって、次の通り指定した場合は、「id
属性の値がdialog
の要素に対して.showModal()
を実行する」といった宣言になります。
<button command="show-modal" commandfor="dialog" ...>...</button>
実現したいことの項で示した例と同じことを、command
属性とcommandfor
属性を使用して実装すると以下のようになります。
See the Pen commandとcommandforを使用してdialogタグを制御する by AyumuSaito (@ayumusaito-excite) on CodePen.
まとめ
今回は、button
タグの新しい属性であるcommand
属性を使用して、JSなしでdialog
タグを制御する方法をご紹介しました。
command
属性によりJSを記述することなくdialog
タグが制御できるようになるため、ダイアログUIの実装がより簡単にシンプルになるのではないでしょうか。
実運用で超えるべき課題や他のブラウザの対応状況を注視していきたいと思います。
本稿の情報がマークアップされる方の一助となれば幸いです。ご精読ありがとうございました。