语法中规定了属性选择器中空格的规则。这是选择器3 https://www.w3.org/TR/selectors-3/#w3cselgrammar属性选择器的产生(为了说明,一些标记被替换为它们的字符串等效项;S*
代表 0 个或多个空白字符):
attrib
: '[' S* [ namespace_prefix ]? IDENT S*
[ [ '^=' |
'$=' |
'*=' |
'=' |
'~=' |
'|=' ] S* [ IDENT | STRING ] S*
]? ']'
;
当然,对于那些想要了解如何理解的人来说,语法并不是很有用。write属性选择器,因为它是为那些实施选择器引擎。
这是一个简单的英语解释:
属性选择器之前的空格
上面的产生式中没有涵盖这一点,但第一个明显的规则是,如果您将属性选择器附加到另一个简单选择器或伪元素,don't使用空格:
a[href]::after
如果这样做,该空间将被视为后代组合器 https://www.w3.org/TR/selectors-3/#descendant-combinators相反,通用选择器隐含在属性选择器及其后面的任何内容上。换句话说,这些选择器彼此等效,但与上面不同:
a [href] ::after
a *[href] *::after
属性选择器内的空格
括号内和比较运算符周围是否有空格并不重要;我发现浏览器似乎将它们视为不存在(但我没有进行广泛的测试)。根据语法,这些都是有效的,并且据我所知,在所有情况下都有效modern浏览器:
a[href]
a[ href ]
a[ href="http://stackoverflow.com" ]
a[href ^= "http://"]
a[ href ^= "http://" ]
之间不允许有空格^
(或其他符号)和=
因为它们被视为单个令牌,并且令牌不能被分解。
如果 IE7 和 IE8 正确实现语法,它们也应该能够处理所有这些。
If a 命名空间前缀 https://www.w3.org/TR/selectors-3/#attrnmsp使用时,前缀和属性名称之间不允许有空格。
这些是不正确的:
unit[sh| quantity]
unit[ sh| quantity="200" ]
unit[sh| quantity = "200"]
这些是正确的:
unit[sh|quantity]
unit[ sh|quantity="200" ]
unit[sh|quantity = "200"]
属性值中的空格
但请注意上面属性值周围的引号;如果您忽略它们,并且尝试选择属性值中包含空格的内容,则会出现语法错误。
这是不正确的:
div[class=one two]
这是对的:
div[class="one two"]
这是因为不带引号的属性值被视为标识符,不包含空格(出于明显的原因),而带引号的值被视为字符串。看这个规格 https://www.w3.org/TR/CSS21/syndata.html#characters更多细节。
为了防止此类错误,我强烈建议始终引用属性值,无论是 HTML、XHTML(必需)、XML(必需)、CSS 还是 jQuery(一旦需要 https://stackoverflow.com/questions/9987068/do-you-use-quotes-in-jquery-when-searching-for-attribute-values/9987074#9987074).
属性值后的空格
从选择器 4 开始(在本答案最初发布之后),属性选择器可以接受属性值后面出现的标识符形式的标志。两个标志已被定义为字符大小写 https://drafts.csswg.org/selectors-4/#attribute-case,一个用于不区分大小写的匹配:
div[data-foo="bar" i]
还有一个用于区分大小写的匹配(其添加我曾参与过 https://github.com/whatwg/html/issues/4158,尽管由 WHATWG 代理):
ol[type="A" s]
ol[type="a" s]
语法已经是updated https://drafts.csswg.org/selectors-4/#grammar thus:
attrib
: '[' S* attrib_name ']'
| '[' S* attrib_name attrib_match [ IDENT | STRING ] S* attrib_flags? ']'
;
attrib_name
: wqname_prefix? IDENT S*
attrib_match
: [ '=' |
PREFIX-MATCH |
SUFFIX-MATCH |
SUBSTRING-MATCH |
INCLUDE-MATCH |
DASH-MATCH
] S*
attrib_flags
: IDENT S*
用简单的英语来说:如果属性值没有被引用(即它是一个标识符),则它和之间有空格attrib_flags
是必须的;否则,如果属性值被引用,则空格是可选的,但为了可读性强烈建议使用空格。之间的空白attrib_flags
右括号一如既往是可选的。