【发布时间】:2020-09-20 00:50:27
【问题描述】:
在属性值中的 XML 空格中是 normalized to spaces。因此test="foo#xD#xAbar"(在foo和bar之间有一个CRLF)在解析时被规范化为test="foo bar"。
但是属性规范化是否也发生在 HTML 中——特别是 HTML5? HTML 5.2 spec on attributes 没有提到它。令人惊讶的是,在网络上搜索html5 normalization of attribute values 并没有立即发现任何关于此事的讨论。
我发现一个email on a W3C mailing list 似乎表明HTML4 规范了属性值,但HTML5 没有。它指向了 2011 年的 W3C HTML5 Bug 13709,它没有提供额外的信息。我还找到了 W3C ISSUE-87;这似乎是closed with prejudice,几乎没有讨论过。
让我给你一个应用的例子。我有几个以prefix- 开头的HTML5 CSS 类,包括(其中)prefix-foo 和prefix-bar。我想选择元素example,但前提是它不包含以prefix-开头的类——类似于|=和~=属性选择器的组合。
<example class="select">this will be blue</example>
<example class="do-not-select prefix-foo">this should not be blue</example>
<example class="prefix-bar do-not-select">this should not be blue</example>
<example class="select-prefix-is-not-a-prefix">but this <em>should</em> be blue</example>
请注意,最后一个示例有一个 prefix- 子字符串,但不是 CSS 类标记前缀。
我想出了以下选择器,它适用于上述示例:
example:not([class^="prefix-"]):not([class*=" prefix-"]):
background-color: blue;
;
我担心的是,如果源使用空格而不是空格,选择器是否仍然有效。例如:
<example class="do-not-select
prefix-foo">this should not be blue either</example>
令人惊讶的是,这在 Firefox 和 Chrome 上都有效。似乎属性源中的换行符正在规范化为 DOM 中的空间。或者可能没有发生规范化,但是一些 CSS 规范表明属性选择器中的空格应该匹配任何空格(即规范化是在匹配期间而不是在解析期间)。
现在我已经解释了我的用例,让我简化测试用例。采用这种 CSS 样式:
div[class*=" prefix-"] {
background-color: green;
;
并获取此 HTML:
<div class="select prefix-foo">this should be green</div>
<div class="select
prefix-foo">this should be green only if whitespace is normalized</div>
在 Firefox 和 Chrome 中,这两个对我来说都是绿色的。
HTML5 specification for class 表示该值为space-separated,其中包括任何space characters,包括制表符和换行符。不过,它没有说明标准化。
谁能解释一下,引用相关权威规范,HTML5是否规范了属性值; CSS 属性选择器中的空格是按字面意思匹配还是匹配任何空格?
【问题讨论】:
-
澄清一下,.select-prefix-is-not-a-prefix 应该是蓝色的(顾名思义),并且是。但是在我的测试中,类属性中带有换行符的示例也注册为蓝色。在 CSS 中,空白规范化只发生在字符串之外。
-
对,我把我的“选择”和“匹配”搞混了。也许我应该找到一种没有
not()的简化示例的方法。 (我正在复制我的特定用例。)我现在已经修正了错字。现在,BoltClock,关于空白规范化的任何想法?您的评论似乎暗示了属性的 CSS 规范化——但这个问题的全部主旨是:是否确实存在规范化,如果有,基于什么权威? -
据我所知,CSS 不会对属性值中的字符串中的空格进行规范化。除非您使用转义序列(例如 \a 换行),否则它将规范化字符串外部源中的换行符。见drafts.csswg.org/selectors/#case-sensitive 和w3.org/TR/CSS21/syndata.html#characters
-
那么,BoltClock,如果 CSS 不规范空白,那么为什么当前会按预期跳过带有换行符的类?
:not([class*=" prefix-"])不应该工作,除非换行符被规范化为空格,对吗?我将在问题中添加一个简化示例。 -
啊,BoltClock,我发现了问题。我可以看到为什么换行示例对您不起作用。我的源文件(正确地)被解释为 XHTML5,而不是 HTML5。你是对的:HTML 中似乎没有属性规范化。 (请参阅我的单独答案。)感谢您的讨论。
标签: html css css-selectors normalization