属性選択子

属性選択子

[5] 属性選択子 (attribute selector) は、要素属性を表します >>4

仕様書

意味

[6] 属性選択子は、それに一致する属性を持つ要素一致します >>4

[26] 属性がどのように与えられるかには依存しません。 DTDXML Schema利用者エージェントに組み込まれた語彙の知識などで間接的に既定値として与えられた属性であっても、 文書木に反映されていれば選択子の適用対象となり得ます。 >>4

[27] しかし XML では外部部分集合処理することが義務付けられていないなど、 必ずしも文書木にそのような属性が含まれているとは限りません。従って、 選択子既定値に左右されないように書くべきです >>4

[37] 実際にはWebブラウザー(XML 仕様上義務付けられている) 内部部分集合内の既定値(DOM に反映されるので) 選択子の処理で考慮しますが、外部部分集合引数実体内の既定値XML Schema その他のスキーマ言語既定値は考慮しませんし、 またスキーマ以外の根拠を持つ既定値も使いません。

[97] WebVTT ではWebVTT中間節点オブジェクトについて、 vlang は特定の属性だけが存在しているように、それ以外は属性が存在しないように扱うことになっています。 >>98

[99] c は対応する属性が規定されておらず、存在しません。クラス選択子を使う必要があります。
[100] また WebVTT節点オブジェクトのリストID選択子一致しますが、 要素に相当するものでは無いようで、属性に相当するものも (明記されていませんが) 存在しないようです。

属性選択子の種類

[7] 属性選択子には次の種類があります >>4

属性値なし

[12] 属性名だけの指定の場合、属性が存在していることを表します >>4

=

[13] =属性値が指定されている場合、完全一致で等しい値が指定されていることを表します >>4

~=

[14] ~=属性値が指定されている場合、当該属性の値を空白区切りにしたときに、 そのいずれかと値が一致することを表します。空白区切りの結果のいずれかと比較されるため、 選択子で指定した値が空白を含んでいる場合は、何とも一致しません。 >>4

[15] 例えば、

[tokens~="hoge"]
... は
<foo tokens="hoge  fuga abc  "/>
... と一致します。しかし、
[tokens~="hoge  fuga"]
[tokens~=""]
... とは一致しません。

[29] 空白の定義はいろいろありますが、ここでの空白空白 (CSS) です。マーク付け言語によっては違った空白の定義を採用しているかもしれません。
[32] class 属性にはクラス選択子があります。 ~= とほとんど同じですが詳細度が異なります。

空文字列

[57] 選択子で指定した値が空文字列である場合には、何とも一致しません >>4

[56] 属性値空文字列の場合について以前は仕様書は明記していませんでしたが、 当時の規定も文字通り解釈すれば、はどんな属性値とも一致しませし、 属性値はどんなとも一致しません。

[58] Firefox 2.0 も Opera 9 も、 >>56 の通りに実装しているようです。

空白

[59] Firefox 2.0 の空白U+000C は含まれていないようです。

[60] Opera 9 の空白~= では U+0020 だけ、 クラス選択子では通常の空白に加えて U+000B も含まれるようです。

[61] Opera 9 はなぜか \aU+000B と解釈します。

それ以外に改行正規化は行っていないようです。

[62] 属性値の先頭や末尾の空白が無視されるのかどうか仕様書は明記していません。

[63] Firefox 2.0 も Opera 9 も無視するようです。

[64] テスト:

|=

[16] |= の後に属性値が続く場合、その値と一致するか、またはその値の後に - が続くような属性値が指定されていることを表します。 >>4

[17] 例えば、

[lang|=ja]
... は
<foo lang="ja"/>
... や
<foo lang="ja-JP"/>
... と一致します。

[30] これは RFC 4647基本濾過と似ていますが、 * が使えない点が異なります。
[33] lang 属性には :lang 擬似クラスがあります。

空の値

[52] 仕様書には空文字列の場合について特に言及はありませんが、 文字通りに解釈すると、属性値空文字列の場合や - から始まる場合に一致することになります。

[53] Firefox 2.0 は >>52 のように解釈しますが、 Opera 9 は何とも一致しないと解釈するようです。

空白

[54] Firefox 2.0 でも Opera 9 でも、 属性値の中間の空白に関して比較の際に特に正規化は行われないようです。

[55] ただし Opera 9 ではU+000A がなぜか属性値U+000B一致します。

[5] Firefox 2.0 は属性値の先頭や末尾に個以上の U+0009, U+000A, U+000D の任意の組み合わせがあると、 無視して比較します。 むしろの先頭や末尾にこれらを明示しても一致しません。

^=, *=, $=

[18] ^=, *=, $= の後に属性値が続く場合、 それぞれ属性値の先頭、任意の位置、末尾にその値が含まれていることを表します。 >>4

構文

[19] 属性名CSS修飾名です。 >>4

[8] 属性値を指定する場合は CSS識別子または文字列として記述しなければなりません >>4

[74] 属性値数字からはじまると識別子ではなくとみなされてしまうので、 非妥当になります。

名前空間接頭辞

[20] 属性選択子既定名前空間を使いません。名前空間接頭辞| を省略すると、null名前空間を表します。 >>4

[21] 属性選択子名前空間接頭辞空文字列なら、null名前空間を表します。 >>4

[22] 属性選択子名前空間接頭辞* なら、任意の名前空間を表します。 >>4 これにはnull名前空間も含まれます。

[23] null名前空間については明記されていませんが、含まれるのでしょう。

[24] その他の名前空間接頭辞は、宣言されている名前空間URLを表します。 >>4

大文字と小文字

属性名

[9] 属性名大文字小文字を区別するかはマーク付け言語に依存します。 >>4

[10] HTML文書中のHTML要素では属性名大文字小文字を区別しません。 それ以外、すなわち HTML文書中の HTML 以外の要素XML文書では区別します。 >>77

[105] これは厳密には次のようにしなければならない >>77 と定義されています。

[109] すなわち、CSS 側の属性名の大文字と小文字の違いは無視されますが、 DOM 側の違いは無視されません。 (ただし HTML構文解析器によって作られた HTML属性はすべて小文字になっています。)

属性値

[76] 属性値大文字小文字を区別するかはマーク付け言語に依存します >>4

[93] XML文書では大文字小文字を区別します

[81] HTML文書では、一部のHTML要素ASCII大文字・小文字不区別となります。 それ以外は区別します。 >>77

歴史的には >>91 を参照。

[82] HTML Standard には type 属性のみ、 ul 要素ol 要素のとき大文字と小文字を区別する旨の注記がありますが、 実際には ChromeFirefox も、区別しないようにみえます。

名前空間接頭辞

[78] 名前空間接頭辞大文字小文字を区別します。詳しくはCSS名前空間の項を参照してください。

妥当性

[25] 宣言されていない名前空間接頭辞を使った属性選択子非妥当です。 >>4

変種

[1] jQuery: CSS <http://jquery.com/docs/CSS/>

JavaScript による選択子の実装ですが、 属性名の前には @ をつけなければなりません。 (名無しさん 2006-06-06 11:55:35 +00:00)

歴史

前史

[66] ここでは属性の存在を表す属性選択子= が提案されていましたが、 構文が少し違っていました。

[68] 次の >>67 では現在の構文になりますが、水準2に格下げ(?)されていました。

[70] その次の >>69 ではID選択子だけ水準1、それ以外は水準2となっています。 (この時はまだID選択子属性選択子の一種でした。)

[72] しかし >>71 の次の仕様案では CSS2 は削除されています。かわりに >>73 が発行されています。

属性選択子の誕生

[42] STTS2 では属性選択子として属性の存在、 = (完全一致)、 == (現在の ~=) が定義されていました。

[39] 属性選択子CSS2 で正式に選択子に導入されました。当初は STTS2 (>>41) を引き継ぎ、 >>42 の3種類が定義されていました。

[43] また属性名の前に ^ をつけることでその属性文書木から削除することを表していました。 STTS3 ではより一般的な形に拡張されています。

この機能は CSS には取り込まれていません。

|= の追加

[49] >>50 の次の PR である >>51|= が追加されました。

[38] CSS2名前空間の扱いを規定していませんでしたが、現実には属性選択子XML名前空間の両方に対応している CSS2 世代の利用者エージェントはありませんでした。

選択子3

[45] 名前空間接頭辞をつけて名前空間に対応することが >>44 で提案され、 >>46 以後の選択子仕様に取り込まれています。

[36] >>47^=, $=, *= が追加されました。

HTML

[91] 選択子仕様書は大文字小文字の区別はマーク付け言語によるとして具体的には規定していませんでしたが、 かわりに HTML 仕様書が HTMLXML の場合を規定しました。

[11] 以前 (>>90 までの Web Applications 1,0 仕様と GeckoWebKitPresto) は HTML名前空間の一部の要素では属性値大文字小文字を区別しないことにしていました。

[2]

[3] Opera 9 は HTMLaccesskey属性値大文字小文字を区別します

Firefox 2.0 は HTMLaccesskey属性値大文字小文字を区別しません

[92] HTML5 は当初属性値についても特定の属性のみASCII大文字・小文字不区別とされていましたが、 >>90 によってすべて区別することになりました。

[80] その後 >>79 で2015年に元の仕様に戻されています。

選択子4

[95] 以前は HTML利用者エージェント・スタイル・シート大文字小文字の区別について注釈を使った特別な注記によって表していましたが、 i 記法の導入でこれを選択子だけで表現できるようになりました。

実装

[40] IE7 以下属性選択子に対応していなかったため、Webサイトでは長らく属性選択子は使えませんでした。

関連

[28] クラス選択子ID選択子:lang のような特定用途に特化した属性選択子と言えるような選択子もあります。

[31] 型選択子には普遍選択子がありますが、 属性選択子にはそれに相当するものがありません。

[96] [whatwg] [Selectors4] case-insensitive attribute value matching (in XML) ( 版) <http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-June/036284.html>

[101] IRC logs: freenode / #whatwg / 20121202 ( ( 版)) <http://krijnhoetmer.nl/irc-logs/whatwg/20121202>

[102] Introduction to CSSOM (1) - DOM ECMAScripting ( ( 版)) <http://domes.lingua.heliohost.org/dom/intro-cssom1.html#note-21>

[103] Bug 24005 – Attribute values can't always be matched case-sensitively ( ( 版)) <https://www.w3.org/Bugs/Public/show_bug.cgi?id=24005>

[104] Web Applications 1.0 r8253 Match reality better in terms of selector case-sensitivity ( ( 版)) <http://html5.org/tools/web-apps-tracker?from=8252&to=8253>

[110] Web Applications 1.0 r8764 Try to clarify case matching rules for selectors ( ( 版)) <http://html5.org/r/8764>

[35] Safari 9.0 ( 版) <https://developer.apple.com/library/safari/releasenotes/General/WhatsNewInSafari/Articles/Safari_9.html#//apple_ref/doc/uid/TP40014305-CH9-SW34>

The following CSS4 selectors are now fully supported by Safari.

Case-insensitive attribute selectors

[86] [selectors4] Spec for attribute value case-sensitivity is clearly to vague (Boris Zbarsky 著, 版) <https://lists.w3.org/Archives/Public/www-style/2016Jan/0166.html>

[87] Point out case-insensitivity of i in [foo=bar i] · w3c/csswg-drafts@498c104 ( 版) <https://github.com/w3c/csswg-drafts/commit/498c1042562fd7cb98065351c63b2620c3ddc7bf>

[88] Gloss the term "attribute selector" · whatwg/html@953b6f4 ( 版) <https://github.com/whatwg/html/commit/953b6f41dd1563a512195044d54b3c661293d2b6>

[89] [selectors] Remove the Selectors-specific tokens, rephrase in terms o… (tabatkins著, ) <https://github.com/w3c/csswg-drafts/commit/52554f80bac1d05be0067fff4a05d2ec126cb41f>

[111] Remove the Selectors-specific tokens, per WG resolution. (tabatkins著, ) <https://github.com/w3c/csswg-drafts/commit/177fc30c38029740a4dfdc4721fc3aa4a8273595>

[112] Selectors: attr name in any NS on HTML elements are case-insensitive (SimonSapin著, ) <https://github.com/whatwg/html/commit/822a91149c86f64ea86aaeb9f48d28ca75aa29ac>

[113] SVG should specify what CSS attribute selectors and class selectors match on · Issue #328 · w3c/svgwg () <https://github.com/w3c/svgwg/issues/328>