属性选择器中的未加引号的连字符

时间:2016-01-13 16:02:57

标签: css css-selectors

我最近遇到了一个奇怪的错误,选择器在缩小后停止工作(使用csswring 3.0.7)。有问题的选择器匹配数据属性包含连字符的元素。它在开发中有效但在所有测试的浏览器(Chrome,Firefox,IE11,Edge)上都没有生产。

在查看缩小的样式表后,我发现选择器已从[data-attr*="-"]转换为[data-attr*=-]。报价已被删除,浏览器拒绝了该报价。

问题是,我无法找到任何说明单个连字符需要引号的来源。显然,minifier-authors找到了我所拥有的相同资源。

This page详细说明了规范的相关部分。

  

因此,CSS中有效的不带引号的属性值是任何不是空字符串的文本字符串,由完全匹配/[-_\u00A0-\u10FFFF]/的转义字符和/或字符组成,并且不以一两个数字开头连字符或连字符后跟数字。

在这种情况下,单个连字符似乎完全有效。

Here is a jsfiddle测试不同的场景。只有在尝试匹配一个单独的,不带引号的连字符时,选择器才会失败。

我错过了什么吗?难道这不是一个有效的选择器吗?

1 个答案:

答案 0 :(得分:5)

以下是文章中引用的CSS2.1规范本身的准确文本:

  

在CSS中,标识符(包括选择器中的元素名称,类和ID)只能包含字符[a-zA-Z0-9]和ISO 10646字符U + 00A0及更高,加上连字符( - )和下划线(_);它们不能以数字,两个连字符或连字符后跟数字开头。

如您所见,这似乎并未解决有关单个连字符的情况。

但是,查看section 4.1.1中的语法,我们发现了以下对标识的标记:

[-]?{nmstart}{nmchar}*

{nmstart}[_a-z]|{nonascii}|{escape}表示,在ident中是必需的。前面的连字符是可选的,但由于连字符没有出现在{nmstart}中,这意味着单个连字符不是有效的CSS标识符。

因此,选择器[data-attr*=-]确实无效,并且必须引用单个连字符才能被视为字符串。