[7] [DFN[[RUBY[列挙属性][れっきょぞくせい]@en[enumerated attribute]]]]は、
幾つかの値の候補からいずれかを選んで[[指定]]できる[[属性]]です。

* 仕様書

[REFS[
- [9] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2017-06-16 08:10:52 +09:00]]) <https://html.spec.whatwg.org/#enumerated-attribute>
- [56] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2017-06-16 08:10:52 +09:00]]) <https://html.spec.whatwg.org/#reflect>
]REFS]

* 意味

[27] 
[[列挙属性]]は、[[キーワード]]の[[有限集合]]のいずれかの値を取ると定義されている[[属性]]です
[SRC[>>9]]。

-*-*-

[8] 
[[列挙属性]]の[[属性値]]となり得る値のことを、[DFN[[RUBYB[キーワード]@en[keyword]]]]といいます。

[28] 
[[列挙属性]]には、いくつかの[DFN[[RUBYB[状態]@en[state]]]]が定義されています。

[29] 
各[[キーワード][列挙属性]]には、どの[[状態][列挙属性]]に対応するかの[[写像]]が定義されています。
複数の[[キーワード][列挙属性]]が1つの[[状態][列挙属性]]に対応する場合もあります。
[SRC[>>9]]

[30] 
[[キーワード][列挙属性]]は、[[不適合]]とされていることもあります [SRC[>>9]]。

;; [31] 多くの場合、[[歴史的理由]]により同じ[[状態][列挙属性]]を表す複数の[[キーワード][列挙属性]]が存在しているものです。

[62] 
[[列挙属性]]の[[反映]]に関する処理で、[[キーワード][列挙属性]]の[RUBYB[[[大文字]]・[[小文字]]の正準形]@en[canonical case]]が使われることがあります
[SRC[>>56]]。
「正準形」とは[[仕様書]]で示されている[[大文字]]と[[小文字]]の表記のことと思われますが、
現在規定されているものはすべて[[小文字]]となっています。

-*-*-

[32] 
[[列挙属性]]には、
[DFN[[RUBYB[非妥当値既定値]@en[invalid value default]]]]が定義されていることがあります
[SRC[>>9]]。

[33] 
[[列挙属性]]には、
[DFN[[RUBYB[欠値既定値]@en[missing value default]]]]が定義されていることがあります
[SRC[>>9]]。

[52] 
これらの値は[[状態][列挙属性]]です。いずれかの[[キーワード][列挙属性]]が[[写像]]される[[状態][列挙属性]]のこともあれば、
専用の[[状態][列挙属性]]のこともあります。
[[非妥当値既定値]]と[[欠値既定値]]は同じことも多いですが、違うこともあります。

[60] 
[[欠値既定値]]が定義されていて[[非妥当値既定値]]が定義されていない場合、
実質的に[[欠値既定値]]と同じものが[[非妥当値既定値]]となります。
(明示的に両者が等しいと定義されている場合もあります。)

[53] 
[[非妥当値既定値]]が定義されていて[[欠値既定値]]が定義されていないこともあります。

* 属性値

[11] 
[[列挙属性]]の[[属性値]]は、
[[キーワード][列挙属性]]のいずれかと
[[ASCII大文字・小文字不区別]]で一致しなければ[MUST[なりません]] [SRC[>>9]]。

[34] ただし、[[不適合]]とされる[[キーワード][列挙属性]]であっては[MUST[なりません]]
[SRC[>>9]]。

;; [35] [[キーワード][列挙属性]]の前後に[[空白]]を挿入することは、
認められていません。

[54] 
なお、[[キーワード][列挙属性]]は[[空文字列]]となることもあります。

[55] 
[[キーワード][列挙属性]]の多くは[[ASCII英数字]]で構成されていますが、
[CODE[enctype]] [[属性]]のように[[記号]]が含まれることもあります。
[[非ASCII文字]]が現れる[[列挙属性]]はありません。

* 処理

[36] [[要素]][VAR[要素]]の[[列挙属性]][VAR[名前]]の[F[状態][列挙属性]]は、
次のようにして得られます [SRC[>>9]]。

[FIG(steps)[
= [37] [VAR[要素]]に[VAR[名前]][[内容属性]]が指定されている場合、
== [38] [VAR[値]]を、[VAR[要素]]の[VAR[名前]][[属性値]]に設定します。
== [39] [VAR[要素]]の[VAR[名前]][[属性]]に[VAR[値]]と
[[ASCII大文字・小文字不区別]]で等しい[[キーワード][列挙属性]]がある場合、
=== [40] その[[キーワード][列挙属性]]に対応する[[状態][列挙属性]]を返します。
== [43] それ以外で、[[非妥当値既定値]]がある場合、
=== [44] その[[非妥当値既定値]]の[[状態][列挙属性]]を返します。
== [41] それ以外で、[[欠値既定値]]がある場合、
=== [42] その[[欠値既定値]]の[[状態][列挙属性]]を返します。
== [45] それ以外の場合、
=== [46] [CODE[null]] を返します。
= [47] それ以外の場合、
== [48] [[欠値既定値]]がある場合、
=== [49] その[[欠値既定値]]の[[状態][列挙属性]]を返します。
== [50] それ以外の場合、
=== [51] [CODE[null]] を返します。
]FIG]

* IDL 属性

[57] 
多くの[[列挙属性]]には、それを[[反映]] [SRC[>>56]] する [[IDL属性]]があります。


* 列挙属性の一覧

[12] 現在の [[HTML]] には次の[[列挙属性]]があります。

[FIG(table)[ [58] [[HTML]] の[[列挙属性]]
:attr: [[属性]]
:empty: [[空文字列]]
:non: [[不適合]][[キーワード][列挙属性]]
:missing: [[欠値既定値]]
:invalid: [[非妥当値既定値]]
:idl: [[IDL属性]]

:attr: [CODE(HTMLa)@en[as][<link as>]]
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[autocapitalize]]
:missing: あり
:invalid: あり
:idl: 特殊

:attr: [CODE(HTMLa)@en[autocomplete]]
:missing: あり
:invalid: [[欠値既定値]]
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[[[contenteditable]]]]
:empty: あり
:missing: 別
:invalid: [[欠値既定値]]
:idl: 特殊

:attr: [CODE(HTMLa)@en[crossorigin]]
:empty: あり
:missing: 別
:invalid: あり
:idl: [CODE[[[DOMString]][[?][nullable]]]]

:attr: [CODE(HTMLa)@en[decoding][<img decoding>]]
:invalid: [[欠値既定値]]
:missing: あり
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[[[dir]]]]
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[[[draggable]]]]
:missing: 別
:invalid: [[欠値既定値]]
:idl: 特殊

:attr: [CODE(HTMLa)@en[[[enctype]]]]
:invalid: あり
:missing: あり
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[[[formenctype]]]]
:invalid: あり
:#: no missing value default
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[inputmode]]
:missing: 別
:invalid: [[欠値既定値]]
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[kind][<track kind>]]
:invalid: あり
:missing: あり
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[[[method]]]]
:invalid: あり
:missing: あり
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[[[formmethod]]]]
:invalid: あり
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[preload]]
:missing: [[実装定義]]
:empty: あり
:invalid: [[欠値既定値]]
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[referrerpolicy]]
:missing: あり
:invalid: あり
:empty: あり
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[[[scope]]]]
:missing: 別
:invalid: [[欠値既定値]]
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[[[shape]]]]
:non: あり
:missing: あり
:invalid: [[欠値既定値]]
:idl: [CODE(IDL)@en[DOMString]]

:attr: [CODE(HTMLa)@en[[[spellcheck]]]]
:missing: 別
:empty: あり
:invalid: [[欠値既定値]]
:idl: 特殊

:attr: [CODE(HTMLa)@en[translate]]
:missing: 別
:empty: あり
:invalid: [[欠値既定値]]
:idl: 特殊

:attr: [CODE(HTMLa)@en[type][<button type>]] ([CODE(HTMLe)@en[[[button]]]])
:missing: あり
:invalid: [[欠値既定値]]
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[type][<input type>]] ([CODE(HTMLe)@en[[[input]]]])
:missing: あり
:invalid: [[欠値既定値]]
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[updateviacache]]
:missing: あり
:invalid: あり
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[workertype]]
:missing: あり
:invalid: 別
:idl: [[既知値のみに限定]]

:attr: [CODE(HTMLa)@en[[[wrap]]]]
:missing: あり
:non: あり
:invalid: [[欠値既定値]]
:idl: [CODE(IDL)@en[DOMString]]

:attr: [CODE(HTMLa)@en[[[behavior]]]]
:non: すべて
:missing: あり
:invalid: [[欠値既定値]]
:idl: [CODE(IDL)@en[DOMString]]

:attr: [CODE(HTMLa)@en[[[direction]]]]
:non: すべて
:missing: あり
:invalid: [[欠値既定値]]
:idl: [CODE(IDL)@en[DOMString]]
]FIG]


[25] 次の[[属性]]は、[[列挙属性]]ですが、[[仕様書]]上は状態と値を直接規定する通常の方法ではなく、
他の定義を参照する形となっています。 ([[仕様書]]の定義上は特別ですが、
利用上は特別な所はありません。)

[FIG(short list)[
- [CODE(HTMLa)@en[referrerpolicy]]
- [CODE(HTMLa)@en[as][<link as>]]
- [CODE(HTMLa)@en[workertype][<link workertype>]]
- [CODE(HTMLa)@en[updateviacache][<link updateviacache>]]
]FIG]

[61] 
[CODE(HTMLa)@en[wrap]] [[属性]]は、どの[[キーワード][列挙属性]]とも異なる ([[不適合]]の) 値
[CODE[off][wrap]] が[[レンダリング]]上意味を持つことになっています。
([[列挙属性]]としては[[非妥当値既定値]] (がないので[[欠値既定値]]) が選択されていることになりますが、
他の値の場合と挙動が異なります。)

[63] 
[CODE(HTMLa)@en[preload][preload=""]] [[属性]]の[[欠値既定値]]は、
[[利用者エージェント]]依存とされています。ただし推奨される値は規定されています。

[HISTORY[
[13] [[廃止]]された[[属性]]にも、[[列挙属性]]だったものが少なくありませんでした。
[[廃止]]された[[属性]]の一部 (例えば [CODE(HTMLa)@en[align]] [[属性]])
は現在も[[Webブラウザー]]の[[レンダリング]]時には参照されることになっていますが、
[[仕様書]]上は[[利用者エージェントスタイルシート]]として記述されており、
形式的には[[列挙属性]]とされていません。

[64] 
かつての [CODE(HTMLe)@en[keygen]] [[要素]]の [CODE(HTMLa)@en[keytype]]
[[属性]]は、[[欠値既定値]]が[[利用者エージェント]]依存とされていました。

[65] 
かつての [CODE(HTMLe)@en[menu]] [[要素]]の [CODE(HTMLa)@en[type][<menu type>]]
[[属性]]は、[[欠値既定値]]が[[親要素]]依存とされていました。
([[親要素]]次第でどこまでも[[祖先]]方向に遡っていくことがありました。)


]HISTORY]


[19] [CODE(HTML)@en[<ol type>]]は、[[列挙属性]]に近いですが、
[[大文字]]と[[小文字]]を区別します。

[HISTORY[
[22] [[廃止]]された [CODE(HTML)@en[<li type>]] と [CODE(HTML)@en[<dir type>]]
は、[[列挙属性]]である [CODE(HTML)@en[<ul type>]] と[[大文字]]・[[小文字]]を区別する
[CODE(HTML)@en[<ol type>]] の両方の[[属性値]]を指定できることになっていました。

[21] [CODE(HTMLa)@en[autocomplete]] は、かつては[[列挙属性]]でしたが、
その後の拡張で独自の構文となりました。

[20] [CODE(HTML)@en[<link as>]] は、[[列挙属性]]に近いですが、
[[大文字]]と[[小文字]]を区別します。[[反映]]する[[IDL属性]]は
[[Web IDL]]の[[列挙型]] [CODE[RequestDestination]] として定義されています。
]HISTORY]

* 歴史

** 列挙型 (SGML)

[1] [[WebSGML]] では同じ[[要素型]]の複数の列挙型の[[属性]]で、選択肢として同じ[[名前字句]]が含まれていてもかまいません。

例 : (素の SGML では不当、 Web SGML では妥当)
[PRE[
<!ATTLIST block
   align (left|center|right) #IMPLIED
  valign (top|center|bottom) #IMPLIED>
]PRE]

しかしながら、この場合、重複した値が使われる[[属性指定]]では[[属性名]]の省略ができなくなります。
(K.4.4.2 参照。)
例 :
-○ [SAMP(SGML)[<block left/>]]
-○ [SAMP(SGML)[<block bottom/>]]
-× [SAMP(SGML)[<block center/>]]
-○ [SAMP(SGML)[<block left bottom/>]]
-× [SAMP(SGML)[<block center center/>]]

** 90年代の HTML

[10] [[HTML]] の[[列挙属性]]は [[SGML]] の[[列挙型]]の[[属性]]に遡ります。
[[HTML4]] までの [[HTML]] 仕様は [[SGML DTD]] を使って記述されていましたので、
[[SGML]] で[[属性型]]が[[列挙型]]で規定されているものが[[列挙属性]]とされていました。
それらは後に [[XHTML]] でも [[XML DTD]] 上で[[列挙型]]として記述されました。

** Web Forms 2.0

[2]
[[Web Forms 2.0]] では、いくつかの[[属性]]が、
決められた値のうちのいずれかを取ると定義されていました。
従来の版の [[HTML]] では[[列挙型]]の[[属性]]や[[ブール型属性]]と呼ばれていたものがそれにふくまれました。

[REFS[
- [3] [[Web Forms 2.0]]
-- [CSECTION@en[2.3. Changes to existing controls]] <http://www.whatwg.org/specs/web-forms/current-work/#changes>
]REFS]

[4] '''大文字と小文字''':
[[属性値]]の[[比較]]は、[[大文字・小文字不区別]]で行います。
[SRC@en[WF2 2.3]]

[5] '''空白''':
[[Web Forms 2.0]] では、 [[HTML 4]] の定義とは異なり、
[[空白]]の削除は[['''してはなりません''']]。
[SRC@en[WF2 2.3]]

;; 但し、使用している [[DTD]] によっては、
[[XML]] の規則に従い、 [[HTML]] レベルの処理以前に[[属性値]]の[[空白]]の[[正規化]]が行われているかもしれません。

[6] 従って、 [[HTML文書]]
[PRE(HTML invalid example code)[
<input type=" text ">
]PRE]
は[[不適合]]です。

** HTML5

[59] 
[CODE(HTMLa)@en[[[contenteditable]]]] は[[空文字列]]も[[キーワード]]である点で [[HTML5]] より前の[[列挙属性]]の定義には合致しませんでした。
[CODE(HTMLa)@en[[[method]]]] や [CODE(HTMLa)@en[[[formmethod]]]] も「/」が[[キーワード]]に含まれているため
[[HTML5]] より前の[[列挙属性]]の定義には合致しませんでした。

[14] [CITE['''['''whatwg''']''' IDL attribute reflecting enumerated attributes not limited to only know values]]
([TIME[2010-08-07 19:04:28 +09:00]] 版)
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2010-August/027697.html>

[15] [CITE[''''''[''''''whatwg'''''']'''''' IDL attribute reflecting enumerated attributes not limited to only know values]]
( ([TIME[2010-08-27 06:22:34 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2010-August/028201.html>

[16] [CITE@en[Web Applications 1.0 r5537     Match UAs better for 'limited to known values' reflection.Fixing http://www.w3.org/Bugs/Public/show_bug.cgi?id=10380]]
( ([TIME[2010-09-29 08:11:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5536&to=5537>


[17] [CITE@en-US[XBL 2.0]]
( ([TIME[2012-05-03 02:23:03 +09:00]] 版))
<http://dev.w3.org/2006/xbl2/Overview.html#attributes-containing-keywords>

[18] [CITE@en-US[XML Binding Language (XBL) 2.0]]
( ([TIME[2007-03-16 22:20:16 +09:00]] 版))
<http://www.w3.org/TR/2007/CR-xbl-20070316/#state>

[23] [CITE@en[Case-sensitive as="" for <link> is weird · Issue #1665 · whatwg/html]]
([TIME[2016-08-15 13:38:23 +09:00]])
<https://github.com/whatwg/html/issues/1665>

[24] [CITE@en[Do not repeat the referrer policies]]
([[domenic]]著, [TIME[2016-08-26 06:33:48 +09:00]])
<https://github.com/whatwg/html/commit/4c228d3fd9e61dee2c45ee0cd7722e1671f6ca9f>

[26] [CITE@en[Make <link>'s as="" attribute case-insensitive]]
([[domenic]]著, [TIME[2017-04-26 05:59:59 +09:00]])
<https://github.com/whatwg/html/commit/9c7da4998f005c1799b04f452cb6c4a618f2d42e>

[66] [CITE@en[Limit crossOrigin reflection to only known values]]
([[ayg]]著, [TIME[2017-08-21 22:07:53 +09:00]])
<https://github.com/whatwg/html/commit/d967dc0120c137d0eb22808d4eaac0726cd8ea78>

[67] [CITE@en[Editorial: always state invalid value default]]
([[GloverDonovan]]著, [TIME[2018-03-05 13:36:29 +09:00]])
<https://github.com/whatwg/html/commit/7e941ae96b264d4743ea0afac00c3b3209ab0cde>

[68] [CITE@en[Be explicit about missing value default & invalid value default · Issue #173 · whatwg/html]]
([TIME[2018-03-06 17:40:26 +09:00]])
<https://github.com/whatwg/html/issues/173>

[69] [CITE@en[Be explicit about missing value default and invalid value default by GloverDonovan · Pull Request #3526 · whatwg/html]]
([TIME[2018-03-06 17:40:37 +09:00]])
<https://github.com/whatwg/html/pull/3526>

[70] [CITE@en[Do not allow http-equiv values curated via wiki]]
([[domenic]]著, [TIME[2017-12-14 07:27:41 +09:00]])
<https://github.com/whatwg/html/commit/72d084b81fa94915518b9cf279afef87d835e88e>