CSS标识符可以以两个连字符开头吗?

前端之家收集整理的这篇文章主要介绍了CSS标识符可以以两个连字符开头吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
CSS 2.1将 identifiers定义为

In CSS,identifiers can contain only the characters [a-zA-Z0-9] and
ISO 10646 characters U+00A0 and higher,plus the hyphen (-) and the
underscore (_); they cannot start with a digit,two hyphens,or a
hyphen followed by a digit. Identifiers can also contain escaped
characters and any ISO 10646 character as a numeric code.

因此,– 应该是无效的标识符,因此# – 不应该选择id =“ – ”的元素:

body { color: black }
#-- { color: red }
<p id="--">I should be black.</p>

attribute selectors年,

Attribute values must be identifiers or strings.

但是 – 似乎作为属性值的标识符,至少在Firefox上:

body { color: black }
[id=--] { color: red }
<p id="--">I am red on Firefox.</p>

此外,CSS.escape已被修改为允许 – :

Minor changes has been made in Firefox 32,to match the spec and the
evolution of the CSS Syntax. The identifier now can begin with --
and the second dash must not be escaped.

根据Wayback Machine,更改发生在2014年4月19日至30日之间:

> 6 Feb 2014 editor’s draft,存储于2014年4月19日.

If the character is the second character and is “-” (U+002D) and the
first character is “-” as well,then the escaped character.

> 30 Apr 2014 editor’s draft,存储于2014年5月4日.

If the character […] is “-” (U+002D) […],then the character
itself.

那么,有一些新的CSS3模块改变了标识符的定义,以便它们有时可以以 – 或者这里到底发生了什么?

解决方法

我不确定是否有明确的答案,但是对于它的价值,双连字符在 CSS Variables module中出现,它定义了自定义属性.这是一个例子(目前只适用于Firefox,这可能是它在CSS.escape()中工作的原因):
:root { --color: red; }
p { color: var(--color); }
<p>I am red on Firefox.</p>

有关此功能的浏览器支持的当前状态,请参阅CanIUse.comCSS Variables (Custom Properties).

虽然css-syntax-3的标识符定义似乎与CSS2.1的定义一致,但它确实对css变量本身进行了大量引用.但是,这些引用似乎都没有解决自定义属性名称使用的 – 前缀.

css变量本身says

A custom property is any property whose name starts with two dashes (U+002D HYPHEN-MINUS),like --foo. The <custom-property-name>
production corresponds to this: it’s defined as any valid identifier that starts with two dashes.

最后一个语句特别有趣,因为解释它与CSS2.1和css-Syntax-3中给出的定义不冲突的唯一方法是模糊性:“以两个破折号开头的标识符”可以表示两个短划线不是标识符的一部分,即:

<custom-property-name> = '-' '-' <ident>

或者它们是,这意味着自定义属性不受标识符的一般定义的约束. < custom-property-name>的语法没有帮助.生产无处可寻,不是在css语法中,也不是在css变量中,也不是在CSSOM中;这个平淡无奇的陈述是唯一可用的定义.

当然,这也没有解释为什么# – 被Chrome认为是有效的,特别是因为Chrome没有自定义属性的有效实现.

猜你在找的CSS相关文章