1. 4.11 対話的な要素
      1. 4.11.1 details要素
      2. 4.11.2 summary要素
      3. 4.11.3 コマンド
        1. 4.11.3.1 ファセット
      4. 4.11.4 dialog要素

4.11 対話的な要素

4.11.1 details要素

element.">Element/details

Support in all current engines.

Firefox49+Safari6+Chrome12+
Opera?Edge79+
Edge (Legacy)?Internet ExplorerNo
Firefox Android49+Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
カテゴリー
フローコンテンツ
インタラクティブコンテンツ
パルパブルコンテンツ
この要素を使用できるコンテキスト
フローコンテンツが期待される場所。
コンテンツモデル
1つのsummary要素に続くフローコンテンツ
text/htmlにおけるタグ省略
どちらのタグも省略不可。
コンテンツ属性
グローバル属性
name — Name of group of mutually-exclusive details elements
open — detailsが可視かどうか
アクセシビリティの考慮
著者向け
実装者向け
DOMインターフェイス
HTMLDetailsElementを使用する。

details要素は、ユーザーが追加情報やコントロールを得ることができるディスクロージャーウィジェットを表す

As with all HTML elements, it is not conforming to use the details element when attempting to represent another type of control. For example, tab widgets and menu widgets are not disclosure widgets, so abusing the details element to implement these patterns is incorrect.

details要素は、脚注には適さない。脚注をマークアップする方法の詳細については、脚注のセクションを参照のこと。

要素の子summary要素がもしあれば、detailsの要約または凡例を表す

要素のコンテンツの残り部分は、追加情報やコントロールを表す

The name content attribute gives the name of the group of related details elements that the element is a member of. Opening one member of this group causes other members of the group to close. If the attribute is specified, its value must not be the empty string.

Before using this feature, authors should consider whether this grouping of related details elements into an exclusive accordion is helpful or harmful to to users. While using an exclusive accordion can reduce the maximum amount of space that a set of content can occupy, it can also frustrate users who have to open many items to find what they want or users who want to look at the contents of multiple items at the same time.

A document must not contain more than one details element in the same details name group that has the open attribute present. Authors must not use script to add details elements to a document in a way that would cause a details name group to have more than one details element with the open attribute present.

The group of elements that is created by a common name attribute is exclusive, meaning that at most one of the details elements can be open at once. While this exclusivity is enforced by user agents, the resulting enforcement immediately changes the open attributes in the markup. This requirement on authors forbids such misleading markup.

A document must not contain a details element that is a descendant of another details element in the same details name group.

Documents that use the name attribute to group multiple related details elements should keep those related elements together in a containing element (such as a section element or article element). When it makes sense for the group to be introduced with a heading, authors should put that heading in a heading element at the start of the containing element.

Visually and programmatically grouping related elements together can be important for accessible user experiences. This can help users understand the relationship between such elements. When related elements are in disparate sections of a web page rather than being grouped, the elements' relationships to each other can be less discoverable or understandable.

openコンテンツ属性は、真偽属性である。存在する場合、この属性は要約と追加情報の両方がユーザーに表示されることを示す。属性が存在しない場合、要約のみが表示されるようになる。

The ancestor details revealing algorithm is to run the following steps on currentNode:

  1. While currentNode has a parent node within the flat tree:

    1. If currentNode is slotted into the second slot of a details element:

      1. Set currentNode to the details element which currentNode is slotted into.

      2. If the open attribute is not set on currentNode, then set the open attribute on currentNode to the empty string.

    2. Otherwise, set currentNode to the parent node of currentNode within the flat tree.

次の例は、details要素が進捗報告書で技術的な詳細を非表示にするために使用される様子を示す。

<section class="progress window">
 <h1>Copying "Really Achieving Your Childhood Dreams"</h1>
 <details>
  <summary>Copying... <progress max="375505392" value="97543282"></progress> 25%</summary>
  <dl>
   <dt>Transfer rate:</dt> <dd>452KB/s</dd>
   <dt>Local filename:</dt> <dd>/home/rpausch/raycd.m4v</dd>
   <dt>Remote filename:</dt> <dd>/var/www/lectures/raycd.m4v</dd>
   <dt>Duration:</dt> <dd>01:16:27</dd>
   <dt>Color profile:</dt> <dd>SD (6-1-6)</dd>
   <dt>Dimensions:</dt> <dd>320×240</dd>
  </dl>
 </details>
</section>

以下は、details要素がデフォルトで一部のコントロールを非表示にするために使用できる様子を示す:

<details>
 <summary><label for=fn>Name & Extension:</label></summary>
 <p><input type=text id=fn name=fn value="Pillar Magazine.pdf">
 <p><label><input type=checkbox name=ext checked> Hide extension</label>
</details>

これは、ユーザーがそれぞれを開くことができる機能とともに、見出しの小さな集合にフィールドの集合を折りたたむことができるよう、リスト内の他のdetailsとともにこれを使用できる。

これらの例において、要約はコントロールが変更できるものをまとめたものであり、理想に満たない実際値ではない。

The following example shows the name attribute of the details element being used to create an exclusive accordion, a set of details elements where a user action to open one details element causes any open details to close.

<section class="characteristics">
 <details name="frame-characteristics">
  <summary>Material</summary>
  The picture frame is made of solid oak wood.
 </details>
 <details name="frame-characteristics">
  <summary>Size</summary>
  The picture frame fits a photo 40cm tall and 30cm wide.
  The frame is 45cm tall, 35cm wide, and 2cm thick.
 </details>
 <details name="frame-characteristics">
  <summary>Color</summary>
  The picture frame is available in its natural wood
  color, or with black stain.
 </details>
</section>

The following example shows what happens when the open attribute is set on a details element that is part of a set of elements using the name attribute to create an exclusive accordion.

Given the initial markup:

<section class="characteristics">
 <details name="frame-characteristics" id="d1" open>...</details>
 <details name="frame-characteristics" id="d2">...</details>
 <details name="frame-characteristics" id="d3">...</details>
</section>

and the script:

document.getElementById("d2").setAttribute("open", "");

then the resulting tree after the script executes will be equivalent to the markup:

<section class="characteristics">
 <details name="frame-characteristics" id="d1">...</details>
 <details name="frame-characteristics" id="d2" open>...</details>
 <details name="frame-characteristics" id="d3">...</details>
</section>

because setting the open attribute on d2 removes it from d1.

The same happens when the user activates the summary element inside of d2.

ユーザーがコントロールを操作するために自動的にopen属性が追加および削除されるので、この属性の状態に基づく異なる、この属性CSSで要素に使用できる。ここでは、スタイルシートを使用して、要素を開いたり閉じたりしたときのsummaryの色をアニメーションさせている:

<style>
 details > summary { transition: color 1s; color: black; }
 details[open] > summary { color: red; }
</style>
<details>
 <summary>Automated Status: Operational</summary>
 <p>Velocity: 12m/s</p>
 <p>Direction: North</p>
</details>

4.11.2 summary要素

Element/summary

Support in all current engines.

Firefox49+Safari6+Chrome12+
Opera?Edge79+
Edge (Legacy)?Internet ExplorerNo
Firefox Android?Safari iOS?Chrome Android?WebView Android4+Samsung Internet?Opera Android?
カテゴリー
なし。
この要素を使用できるコンテキスト
details要素の最初の子として。
コンテンツモデル
フレージングコンテンツ、オプションでヘディングコンテンツと混合される。
text/htmlにおけるタグ省略
どちらのタグも省略不可。
コンテンツ属性
グローバル属性
アクセシビリティの考慮
著者向け
実装者向け
DOMインターフェイス
HTMLElementを使用する。

summary要素はsummary要素の親details要素に属する残りの内容のキャプションまたは凡例を表す

4.11.3 コマンド

4.11.3.1 ファセット

コマンドは、メニュー項目、ボタン、リンクの背後に抽象化したものである。一度コマンドが定義されると、インターフェイスの他の部分は、Disabled状態のようなファセットを共有するために単一の機能へ多くのアクセスポイントを許可し、同じコマンドを参照できる。

コマンドは、次のファセットを持つように定義される:

ラベル
ユーザーから見たコマンドの名前。
アクセスキー
コマンドを切り替えるユーザーエージェントによって選択されたキーの組み合わせ。コマンドはアクセスキーを持たないかもしれない。
Hidden状態
コマンドが非表示にされたかどうか(基本的に、メニューに表示するかどうか)。
Disabled状態
コマンドが関連するおよび切り替え可能かどうか。
アクション
コマンドを切り替える実際の効果がもつもの。これは、スクリプト化されたイベントハンドラー、どのようにナビゲートするためのURL、またはフォーム送信であるかもしれない。

ユーザーエージェントは、次の条件に一致するコマンドを公開してもよい:

ユーザーエージェントは、ユーザーにこれらのキーを通知するための方法として、アクセスキーを持つコマンドのために特にこれを行うことが推奨される。

たとえば、そのようなコマンドは、ユーザーエージェントのメニューバーにリストされるかもしれない。

4.11.4 dialog要素

Element/dialog

Support in all current engines.

Firefox98+Safari15.4+Chrome37+
Opera?Edge79+
Edge (Legacy)?Internet ExplorerNo
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
カテゴリー
フローコンテンツ
この要素を使用できるコンテキスト
フローコンテンツが期待される場所。
コンテンツモデル
フローコンテンツ
text/htmlにおけるタグ省略
どちらのタグも省略不可。
コンテンツ属性
グローバル属性
open — ダイアログボックスが見えるかどうか
アクセシビリティの考慮
著者向け
実装者向け
DOMインターフェイス
HTMLDialogElementを使用する。

dialog要素は、小さいウィンドウ("ダイアログボックス")の形式で、ユーザーはこのウィンドウを操作してタスクを実行したり、情報を収集したりする、アプリケーションの一時的な部分を表す。ユーザーが終了すると、ダイアログはアプリケーションによって自動的に閉じる、またはユーザーによって手動で閉じることができる。

すべてのタイプのアプリケーションでおなじみのパターンである、特にモーダルダイアログの場合、著者は、ウェブアプリケーション内のダイアログが、非ウェブアプリケーションのユーザーにも馴染みのある方法で動作するように保証すべきである。

すべてのHTML要素と同様に、別のタイプのコントロールを表現しようとするときにdialog要素を使用することは適合しない。たとえば、コンテキストメニュー、ツールチップ、ポップアップリストボックスは、ダイアログボックスではないため、これらのパターンを実装するためにdialog要素を乱用することは正しくない。

ユーザー向けダイアログの動作で重要な部分は、初期のフォーカスの配置である。ダイアログフォーカスステップは、ダイアログが表示されたときに初期のフォーカスの適切な候補を選択しようするが、特定のダイアログに対するユーザーの期待に沿う正確な選択を慎重に検討する著者の代わりにはならないかもしれない。そのため、著者は、ダイアログが開いた後にユーザーがすぐに対話することが期待されるダイアログの子孫要素に対して、autofocus属性を使用すべきである。そのような要素がない場合、著者はdialog要素自体にautofocus属性を使用すべきである。

次の例では、在庫管理ウェブアプリケーションで製品の詳細を編集するためにダイアログが使用される。

<dialog>
  <label>Product Number <input type="text" readonly></label>
  <label>Product Name <input type="text" autofocus></label>
</dialog>

autofocus属性が存在しない場合、Product Numberフィールドはダイアログフォーカスステップによってフォーカスされる。これは合理的な動作であるが、Product Numberフィールドは読み取り専用であり、ユーザー入力を想定していないため、Product Nameフィールドにフォーカスを当てる方が適切であると著者は判断した。そこで、著者はデフォルトを上書きするためにオートフォーカスを使用した。

たとえ著者がデフォルトでProduct Numberフィールドにフォーカスしたいとしても、input要素にオートフォーカスを使用して明示的に指定するのが最良である。これは、コードの将来の読者に対して意図を明確にし、将来の更新に対してコードが堅牢であり続けることを保証する。(たとえば、別の開発者が閉じるボタンを追加し、ノードツリーのProduct Numberフィールドの前に配置した場合)。

ユーザー動作のもう1つの重要な側面は、ダイアログがスクロール可能かどうかということである。場合によっては、オーバーフロー(つまりスクロール可能性)は、例えば、ユーザーの高いテキストズーム設定によって引き起こされる場合、回避することができない。しかし一般に、スクロール可能なダイアログはユーザーには期待されない。大きなテキストノードをダイアログ要素に直接追加すると、ダイアログ要素自体がオーバーフローする可能性があるため、特に問題が多い。著者はそれらを避けるのが最善である。

次のサービス条件のダイアログでは、上記の提案を尊重する。

<dialog style="height: 80vh;">
  <div style="overflow: auto; height: 60vh;" autofocus>
    <p>By placing an order via this Web site on the first day of the fourth month of the year
    2010 Anno Domini, you agree to grant Us a non-transferable option to claim, for now and for
    ever more, your immortal soul.</p>
    <p>Should We wish to exercise this option, you agree to surrender your immortal soul,
    and any claim you may have on it, within 5 (five) working days of receiving written
    notification from  this site or one of its duly authorized minions.</p>
    <!-- ... etc., with many more <p> elements ... -->
  </div>
  <form method="dialog">
    <button type="submit" value="agree">Agree</button>
    <button type="submit" value="disagree">Disagree</button>
  </form>
</dialog>

ダイアログフォーカスステップは、デフォルトでスクロール可能なdiv要素が選択されるが、直前の例と同様に、将来の変更に対してより明確で堅牢になるように、autofocusdivに配置した。

対照的に、利用規約を表すp要素にそのようなラッパーdiv要素がない場合、dialog自身がスクロール可能になり、上記のアドバイスに違反する。さらに、autofocus属性が存在しない場合、そのようなマークアップパターンは上記のアドバイスに違反し、ダイアログフォーカスステップのデフォルト動作を中断させ、フォーカスがAgree buttonにジャンプする原因となる。これは、悪いユーザー体験となる。

open属性は、真偽属性である。指定される場合、dialog要素はアクティブであり、ユーザーが操作できることを示す。

open属性を削除すると、通常ダイアログが非表示になる。しかし、そのようにすると、いくつかの奇妙な追加の結果となる:

これらの理由から、open属性を手動で削除しない方が一般的には良い方法である。代わりに、ダイアログを閉じるためにclose()メソッドを使用する、または非表示にするためにhidden属性を使用する。

tabindex属性は、dialog要素で指定されてはならない。

dialog.show()

dialog要素を表示する。

dialog.showModal()

dialog要素を表示し、一番上のモーダルダイアログにする。

この方法は、autofocus属性を履行する。

dialog.close([ result ])

dialog要素を閉じる。

引数が与えられた場合、戻り値を提供する。

dialog.returnValue [ = result ]

dialogの戻り値を返す。

戻り値を更新する設定が可能である。

次の制約により、表示する/隠す(show/hide)や開く/閉じる(open/close)などの対義語として一般的に考えられている動詞のペアとは対照的に、dialog要素の動詞として表示する/閉じる(show/close)を使用する:

さらに、dialog要素のもとのデザインと同時代の他の多くのUIフレームワークの調査により、表示する/閉じる(show/close)の動詞のペアがかなり一般的であることが明らかになった。

要約すると、特定の動詞の意味、およびそれらの動詞が技術的なコンテキストでどのように使用されるかは、ダイアログの表示と閉じるなどのペアの動作が必ずしも対義語として表現できるとは限らないことがわかる。

このダイアログボックスは、いくつかの小さなプリントを持つ。strong要素は、より重要な部分にユーザーの注意を引くために使用される。

<dialog>
 <h1>Add to Wallet</h1>
 <p><strong><label for=amt>How many gold coins do you want to add to your wallet?</label></strong></p>
 <p><input id=amt name=amt type=number min=0 step=0.01 value=100></p>
 <p><small>You add coins at your own risk.</small></p>
 <p><label><input name=round type=checkbox> Only add perfectly round coins</label></p>
 <p><input type=button onclick="submit()" value="Add Coins"></p>
</dialog>