* fieldset 要素型 (HTML, XHTML 1)
[5] [DFN[[CODE(HTMLe)[fieldset]] 要素]]は、
[[フォーム]]の[[制御子]]や[RUBY[名札] [ラベル]]をまとめるために使います。
[16]
仕様書:
- [[HTML 4]] ([[Web Forms 1.0]])
-- [CITE[17.10 Adding structure to forms: the [CODE(HTMLe)[FIELDSET]] and [CODE(HTMLe)[LEGEND]] elements]]
[17]
:[[開始タグ]]:必須
:[[終了タグ]]:必須
:[[内容模型]] (HTML 4):[CODE(SGML)[([[空白]], [CODE(HTMLe)[[[legend]]]], (%[[flow]])*)]]
:内容模型 (ISO‐HTML):
[CODE(SGML)[(空白, [CODE(HTMLe)[legend]], (%[[block]] | %[[inline]] | [CODE(HTMLe)[[[address]]]])+) −([CODE(HTMLe)[fieldset]])]]
:出現できる文脈:[CODE(SGML)[%[[block]]]] が出現できる場所。
(歴史的変遷: )
:[[属性]]:
,属性名 ,属性値 ,既定値 ,説明 ,出典
,[CODE(HTMLa)@en[[[align]]]] , , ,非標準
,[CODE(HTMLa)[[[class]]]] , ,(なし) ,[[級]] ,"[HTML 4] %[[coreattrs]] ⊂ %[[attrs]], [XHTML 1] [[Core]] ⊂ [[Common]]"
,[CODE(HTMLa)[[[dir]]]] , , ,[[書字方向]] ,"[HTML 4] %[[i18n]] ⊂ %attrs, [XHTML 1] [[I18N]] ⊂ Common"
,[CODE(HTMLa)[[[id]]]] ,[CODE(SGML)[[[ID]]]] ,(なし) ,一意識別子 ,"[HTML 4] %coreattrs ⊂ %attrs, [XHTML 1] Core ⊂ Common"
,[CODE(HTMLa)[[[lang]]]] , , ,[[自然言語]] ,[HTML 4] %i18n ⊂ %attrs
,[CODE(HTMLa)[[[xml]]:lang]] , , ,自然言語 ,[XHTML 1] I18N ⊂ Common
,[CODE(HTMLa)[[[onclick]]]] ,[CODE(SGML)[%[[Script]]]] ,(なし) , ,"[HTML 4] %[[events]] ⊂ %attrs, [XHTML 1] [[Events]] ⊂ Common"
,[CODE(HTMLa)[[[ondblclick]]]] ,[CODE(SGML)[%[[Script]]]] ,(なし) , ,"[HTML 4] %events ⊂ %attrs, [XHTML 1] Events ⊂ Common"
,[CODE(HTMLa)[[[onkeydown]]]] ,[CODE(SGML)[%[[Script]]]] ,(なし) , ,"[HTML 4] %events ⊂ %attrs, [XHTML 1] Events ⊂ Common"
,[CODE(HTMLa)[[[onkeypress]]]] ,[CODE(SGML)[%[[Script]]]] ,(なし) , ,"[HTML 4] %events ⊂ %attrs, [XHTML 1] Events ⊂ Common"
,[CODE(HTMLa)[[[onkeyup]]]] ,[CODE(SGML)[%[[Script]]]] ,(なし) , ,"[HTML 4] %events ⊂ %attrs, [XHTML 1] Events ⊂ Common"
,[CODE(HTMLa)[[[onmousedown]]]] ,[CODE(SGML)[%[[Script]]]] ,(なし) , ,"[HTML 4] %events ⊂ %attrs, [XHTML 1] Events ⊂ Common"
,[CODE(HTMLa)[[[onmousemove]]]] ,[CODE(SGML)[%[[Script]]]] ,(なし) , ,"[HTML 4] %events ⊂ %attrs, [XHTML 1] Events ⊂ Common"
,[CODE(HTMLa)[[[onmouseout]]]] ,[CODE(SGML)[%[[Script]]]] ,(なし) , ,"[HTML 4] %events ⊂ %attrs, [XHTML 1] Events ⊂ Common"
,[CODE(HTMLa)[[[onmouseover]]]] ,[CODE(SGML)[%[[Script]]]] ,(なし) , ,"[HTML 4] %events ⊂ %attrs, [XHTML 1] Events ⊂ Common"
,[CODE(HTMLa)[[[onmouseup]]]] ,[CODE(SGML)[%[[Script]]]] ,(なし) , ,"[HTML 4] %events ⊂ %attrs, [XHTML 1] Events ⊂ Common"
,[CODE(HTMLa)[[[style]]]] , , ,スタイル情報 ,"[HTML 4] %coreattrs ⊂ %attrs, [XHTML 1] [[Style]] ⊂ Common"
,[CODE(HTMLa)[[[title]]]] , , ,注釈的題 ,"[HTML 4] %coreattrs ⊂ %attrs, [XHTML 1] Core ⊂ Common"
[[#comment]]
** 内容模型
[6] [[HTML 4]] の [[DTD]] では、 [CODE(HTMLe)[fieldset]]
要素型の内容模型は [CODE(SGML)[(#[[PCDATA]], [CODE(HTMLe)[LEGEND]], ([VAR[%flow]])*)]]
とされていますが、注釈で、 [CODE(SGML)[#PCDATA]]
は[[混合内容]]問題を解決するためで、
[[空白]]のみが許される、とされています。
もし内容模型が [CODE(SGML)[([CODE(HTMLe)[legend]], ([VAR[%flow]])*)]]
であったとすると、
[PRE(HTML)[
]PRE]
のように [CODE(HTMLe)[legend]] の開始タグの前に空白がある時に、
(この内容模型は [CODE[[VAR[%flow]]]] 内に [CODE(SGML)[#PCDATA]] が含まれているため、混合内容であり、)
その空白が [CODE(SGML)[#PCDATA]] に該当する[[データ]]とされてしまいます。
しかし、 [CODE(HTMLe)[fieldset]] 要素内にはデータより先に
[CODE(HTMLe)[legend]] 要素が必要ですから、非[[妥当]]にされてしまいます。
この問題には、
- [CODE(HTMLe)[legend]] 要素の開始タグは必ず
[CODE(HTMLe)[fieldset]] 要素の開始タグの直後に書く
(字下げは諦める)
- [CODE(HTMLe)[[[textflow]]]] 要素型や [CODE(HTMLe)[[[bodytext]]]] 要素型のようなダミーを用意する
- [CODE(SGML)[#PCDATA]] を許してしまう
(厳密性を諦める)
の三つの解法があります。 HTML 4 は最終的には三番目の解法を
選択しました。
[7] ところで、 HTML 4 DTD 注釈には
[Q[per specification only whitespace is allowed there]]
と書いてありますけど、仕様書のどこに書いてあるのでしょうか?
(HTML 4 DTD 内の注釈は[RUBYB[参考] [informative]]だし、
心許ないなあ。でも ISO‐HTML の注釈は[RUBYB[規定] [normative]]だ。)
[10]
[[XHTML 1]] では、 [[XML]] の制約から、
更に自由な内容模型 [CODE(XML)[(#PCDATA | %[CODE(HTMLe)[legend]].qname; | %[[Flow.mix]];)*]] になってしまっています。
だけど混合内容問題を解決するために〜という注釈は残ったままなので意味不明になっています。 ([CODE(HTMLe)[fieldset]] 内は全く要素か空白しか入れられないように読めてしまう。)
たとえば:
[11]
HTML 4 でも XHTML 1 でも、 [CODE(HTMLe)[form]] 要素の子孫に [CODE(HTMLe)[form]] 要素を入れることはできませんから、 [CODE(HTMLe)[form]] 要素の子孫である [CODE(HTMLe)[fieldset]] 要素の子孫として [CODE(HTMLe)[form]] 要素を入れることはできません。しかし、
[CODE(HTMLe)[form]] 要素の子孫ではない [CODE(HTMLe)[fieldset]] 要素の子孫に [CODE(HTMLe)[form]] 要素を入れることは可能のようです。
[15] ISO‐HTML では [CODE(HTMLe)[fieldset]]
要素の入れ子は禁止されています。
[20]
HTML 4 DTD の[[注釈]] (参考) の説明:
> #PCDATA is to solve the mixed content problem,
per specification only whitespace is allowed there!
([[名無しさん]] [sage])
[[#comment]]
** UA による利用
[[#comment]]
*** レンダリング
[8] [CODE(HTMLe)[fieldset]] による集団化情報を使って、
[[視覚UA]] は[[タブ]]を使ったレンダリングができますし、
[[音声UA]] もより分かりやすいレンダリングができます。
従って利用者はよりフォームの制御子等の目的を理解しやすくなり、
文書の[[アクセス可能性]]が高まります。 [SRC[HTML 4 17.10]]
[18]
HTML 4 (というか HTML 3 Form)
の最初期の草案ではもろにタブをマークする方法も検討されていたこともあったようですが、
最終的にレンダリングに中立な[Q[集団化]]に留まったのでしょう。
しかし、同じ [CODE(HTMLe)[[[form]]]] 内の近隣の
[CODE(HTMLe)[[[fieldset]]]] をまとめてタブ集合として表示する
UA なんて見たことがありません。
実際にタブとしてレンダリングするには [CODE(HTMLe)[[[li]]]]
に対する [CODE(HTMLe)[[[ul]]]] のような包含子要素が要るのではないでしょうか。
[9] [[WinIE]] や [[Gecko]] などは、
[PRE[
+- LEGEND ------------------------+
| Label: Control........ |
| Label: Control........ |
+---------------------------------+
]PRE]
のような既定スタイルを持っています。枠線は[Q[窪み]]です。
(Windoze の設定 dialog box などでよくでてくる、
集団化のためのあれと同じ style です。)
[21]
[[Opnewave SDK]]では[[要素]]の上下に[CODE(HTMLe)@en[[[hr]]]]のような線が引かれるのが既定スタイルです。
([[名無しさん]] [sage])
[22]
>>9 は[[Microsoft Windows]]の ([[Windows 95]]以来の) [[GUI]]における[CODE(HTMLe)@en[[[fieldset]]]]相当の表現ですが、[[Microsoft Office]]は [WEAK[(確か97以来)]]
[PRE(aafig)[
LEGEND -------------------------
Label: Control........
Label: Control........
]PRE]
のようになっています。
([[名無しさん]] [sage])
[23]
>>9 は[[Microsoft Windows]]の ([[Windows 95]]以来の) [[GUI]]における[CODE(HTMLe)@en[[[fieldset]]]]相当の表現ですが、[[Microsoft Office]]は [WEAK[(確か97以来)]]
[PRE(aafig)[
LEGEND -------------------------
Label: Control........
Label: Control........
]PRE]
のようになっています。
([[名無しさん]] [sage])
[[#comment]]
** 実装
[4]
''iCabのぺ〜じ - A氏からの手紙(FIELDSETの扱いについて)''
[[#comment]]
** 不思議解釈
[1]
''地獄変00:blockquoteはもう古い〜fieldsetの伝説(legend)!!''
([[名無しさん]] [WEAK[2004-03-23 02:15:27 +00:00]])
[2]
>>1 は[[引用]]のために (特定 [[UA]] の見た目の理由から) [CODE(HTMLe)[fieldset]] + [CODE(HTMLe)[[[legend]]]] を使おうと提案して叩かれた例。
;; 著者が一日でこんなに叩かれましたと出してる URI がほとんど某方面なのが藁える。
[3]
だけど、 >>1 みたいなことを考える人が出てくるのって、
- [[HTML 3]] の [CODE(HTMLe)[[[credit]]]] や表の [CODE(HTMLe)[[[caption]]]] に相当する要素型が無い
- [CODE(HTMLe)[fieldset]] + [CODE(HTMLe)[legend]] の典型的レンダリング(謎)を CSS で気軽に(謎)実現する方法がない
のが原因でしょ。それが解決されない限りまた繰り返されるだろうなあ。
(Form control 以外の集団化・見出し付けのために [CODE(HTMLe)[fieldset]] + [CODE(HTMLe)[legend]] を使うというネタはたしか外出だし。)
[[#comment]]
** 他との関係
[12] [CODE(HTMLe)[[[legend]]]] 要素型は、必ず
[CODE(HTMLe)[fieldset]] 要素型とセットで使用します。
[13] [CODE(HTMLe)[[[input]]]] 要素や
[CODE(HTMLe)[[[button]]]] 要素 ([CODE(HTMLa)[[[type]]]]
が [CODE(HTML)[[[reset]]]]) を [CODE(HTMLe)[fieldset]]
要素内で使用すると、適用範囲 (初期化される範囲)
は [CODE(HTMLe)[fieldset]] 要素内に限定されます。
[14] [CODE(HTMLe)[input]] 要素 ([CODE(HTMLa)[type]]
が [CODE(HTML)[[[file]]]]) は典型的に
[CODE(HTMLe)[fieldset]] により (ブラウザ内部的に)
構造化されると [[ISO-HTML]] 利用者の指針
に書いてあります。
[[#comment]]
** 例
[19] 薬暦フォームの例 [SRC[HTML 4 17.10]]
[PRE(HTML)[
]PRE]
HTML 4 仕様書は、更にスタイル・シートやスクリプトで制御子の位置を揃えたり、
色を変えたり、 [Q[Current Medication]] で [Q[Yes]] と答えた場合のみ
[CODE(HTMLe)[textarea]] を有効にしたりすると更に利用者にとって分かりやすくなるであろうと指摘しています。
([CODE(HTMLe)[[[label]]]] も使った方が良いでしょう。)
[[#comment]]
** メモ
[[#comment]]
* メモ