CSS 2.1将标识符定义为
在CSS中, 标识符 只能包含字符[a-zA-Z0-9]和ISO 10646字符U + 00A0及更高版本,以及连字符(-)和下划线(_);它们不能以数字,两个连字符或连字符后跟数字开头。标识符还可以包含转义字符和任何ISO 10646字符作为数字代码。
因此,--应该是一个无效的标识符,因此#--不应使用来选择元素id="--":
--
#--
id="--"
body { color: black } #-- { color: red } <p id="--">I should be black.</p>
在属性选择器中,属性值必须是标识符或字符串。
但--似乎可以用作属性值的标识符,至少在Firefox上:
body { color: black } [id=--] { color: red } <p id="--">I am red on Firefox.</p>
而且,CSS.escape已被修改为允许--:
CSS.escape
Firefox 32中进行了较小的更改,以符合CSS语法的规范和演变。标识符现在可以以开头,-- 并且第二个破折号不能转义。
根据Wayback Machine的说法,更改发生在2014年4月19日至30日之间:
如果该字符是第二个字符,并且是“-”(U + 002D),并且第一个字符也是“-”,则转义字符。
如果字符[…]是“-”(U + 002D)[…],则字符本身。
那么,是否有一些新的CSS3模块更改了标识符的定义,以使它们有时可以以开头--,或者到底发生了什么?
标准
实际上,CSS语法模块中的更改现在允许标识符以两个连字符开头:
4.3.9。 检查三个代码点是否会以一个标识符开头 看一下第一个代码点: U + 002D减号 如果第二个代码点是名称-开始代码点 或U + 002D HYPHEN-MINUS ,或者第二个和第三个代码点是有效的转义符,则返回true。否则,返回false。
4.3.9。 检查三个代码点是否会以一个标识符开头
看一下第一个代码点:
如果第二个代码点是名称-开始代码点 或U + 002D HYPHEN-MINUS ,或者第二个和第三个代码点是有效的转义符,则返回true。否则,返回false。
更改中也对此进行了描述:
11.1。 与2014年2月20日候选推荐书相比的变化 更改类似ident的标记的定义,以允许“-”启动一个ident。
11.1。 与2014年2月20日候选推荐书相比的变化
在www风格中,…让我们更改建议的语法线程以更改CSS Variables的语法:
Tab Atkins Jr. 建议将“自定义属性”的语法更改为“以下划线开头/包含下划线的任何标识”。 克里斯·埃普斯坦(Chris Eppstein)不同意,因为这_property是常见的IE6黑客。 布赖恩•卡德尔( Brian Kardell)提议–。 扎克·温伯格(Zack Weinberg)警告:
不幸的是,“-”需要更改语法。IDENT不允许以两个破折号开头。
对于应该做什么进行了长时间的讨论。
Tab Atkins Jr. 告知他们决定使用–前缀来指示定制属性和其他定制事物。 于是第二天,他COMMITED CSS语法到GitHub上的变化(他是规范的编辑器)。
实作 火狐浏览器
Firefox允许标识符–从Nightly 31 2014-04-03(pushlog)开始。该行为已在错误985838中更改:
错误985838- var-将CSS变量的前缀更改为–
最近决定对CSS变量规范进行的更改:
但是,#–即使在最新的Nightly 41上也无法使用。为了解决该问题,我提交了错误1175192。
Chrome
Chromium构建了一个新的CSS解析器:
现在,我们允许身份以 –
它被运在此承诺,这是一部分这一commitlist,这是在推出这一承诺。因此,它最终在build 44.0.2370.0 325166中实现(自325152起,推送日志)。
从那时起,Chromium允许[id=–]和#–。