【问题标题】:How can I apply CSS selector to attribute values being case sensitive?如何将 CSS 选择器应用于区分大小写的属性值?
【发布时间】:2013-12-19 16:48:20
【问题描述】:

如果 CSS 和 HTML 都是不区分大小写的语言 (*),并且 the W3C 表示

选择器中的属性名称和值是否区分大小写取决于文档语言。

我怎样才能使选择器中的属性值区分大小写?例如,

div[title=TITLE] {color:green}

不会使该 HTML 的文本变为绿色:

<div title="title">This is a div</div>

Fiddle here

这是浏览器中的错误吗?当我说“浏览器”时,我指的是所有这些。还是我在看 CSS3 规范的未完成版本?这会很奇怪,因为同一行文本也在 CSS2 规范here

(*) 除了一些显式例外的特性,比如类和 ID 名称。请注意,此示例没有类或 ID 名称。

【问题讨论】:

标签: html css css-selectors


【解决方案1】:

您回答了自己的问题:

选择器中的属性名称和值是否区分大小写取决于文档语言。

但进一步,我相信这是因为对于浏览器来说,itIT 不是同一个字符串。对于浏览器来说,它们是两个不同的东西。

编辑--- 你在评论中提出了一些好东西。让我解释一下:HTML/CSS 解析器读取 HTML 和 CSS 时不区分大小写。那是因为他们是。但属性不是,因为它们是由用户定义的。因此,它将它们读取为区分大小写。基本上,HTML 和 CSS 是标准化的。属性不是。

再次编辑--- HTTP 方法是标准化的,(我认为)因此它们不必区分大小写。

【讨论】:

  • 是的,但 HTML 和 CSS 不区分大小写!事实上,如果您以大写形式编写标记名称或属​​性名称,同样的示例也可以工作。只是属性值有这个问题。
  • 这是有道理的。因为它是一个实际的value 而不是标记,所以它应该区分大小写。我不希望 doGSdogs 相等。
  • 此外,在标记中,这些值始终不区分大小写。你可以写&lt;form method="POST"...,它会工作,即使是在应该区分大小写的XHTML中。那么为什么 CSS 会有不同的想法呢?
  • 这个答案似乎暗示它完全取决于浏览器 - 虽然它是,但这并不自动意味着没有符合某种规范的概念,除非存在证据证明否则(例如,它没有在任何规范中定义它应该如何工作)。
  • Also:“但属性不是,因为它们是由用户定义的。因此,它会将它们读取为区分大小写。基本上,HTML 和 CSS 是标准化的。属性不是。”这是不正确的,除非您只指非标准属性。 HTML 对哪些属性区分大小写和哪些不区分大小写有非常明确的定义(HTML5 甚至考虑了自定义数据属性)。即使您指的是非标准属性,title 也不是这样的属性之一。
【解决方案2】:

HTML5 实际上包含一个entire section,专用于区分大小写以用于选择器匹配。以下是关于属性名称和值的说明:

为了选择器匹配的目的,HTML 文档中 HTML 元素的属性和元素 names 必须被视为不区分 ASCII 大小写。

其他所有内容(HTML 元素的属性值、无怪癖模式和受限怪癖模式下的 ID 和类,以及 XML 文档中的元素名称、属性名称和属性值)都必须区分大小写选择器匹配。

当然,HTML 4 没有说明与选择器互操作的任何内容,但它确实说明了the title attribute in particular is case-sensitive。由于选择器依赖于文档语言来确定是否区分大小写,因此这里没有区别。

XHTML 遵循与 XML 相同的规则集:所有属性值都应该区分大小写,因此选择器必须遵循这种区分大小写。同样,没有区别。

所以你看到的完全是设计的;没有浏览器或规格问题。

【讨论】:

  • 好的。现在在测试时,我确实发现浏览器在处理 XHTML 标记中属性值的大小写敏感性方面存在一些异常;但这超出了这个问题的范围。无论如何,我看不出 HTML4 规范在哪里说标题是区分大小写的,但那可能只是我。
  • @Mr Lister: "title = text [CS]" CS 代表区分大小写。
  • 好的!所以回顾一下,我只是碰巧用错误的属性进行测试! title 恰好与 idclass 一样区分大小写。那是我的错误。 updated fiddle 表明我提到的另一个属性 method 在大小写不匹配时会应用 CSS。
  • @Mr Lister:method 是 [CI] w3.org/TR/html401/interact/forms.html#adef-method,这意味着不区分大小写,因此看起来浏览器确实像过去一样遵循原始规范。 HTML5 是否打算更改这样的规则(使 all 属性值对选择器匹配区分大小写)超出了我的范围,因为这样做会破坏大量页面。
  • 这就是我的意思,是的。我不知道更好,或者只有 id 和 class 区分大小写,所以这是一种启示。我应该更仔细地查看规格。无论如何,我认为您不必担心 HTML5 会破坏现有页面。浏览器一直在努力保持向后兼容性;如果这意味着违反正式规则,那就这样吧。
【解决方案3】:

属性选择器中的字符串在 HTML 中区分大小写,仅此而已。我不知道为什么他们不会——以name 为例。毕竟,name="foo"name="FoO" 以不同的方式发送到服务器。如果您希望ids 是区分大小写的,那么它们也可以区分大小写; this 可以正常工作并经过验证,而且它似乎应该符合规范(但我不相信它可以在任何地方工作)。

参见the specification(相关位在 HTML 的规范中,而不是 CSS 的):

选择器规范将 ID、类、元素名称、属性名称和属性值的大小写敏感性留给宿主语言定义。 [选择器]

为了匹配选择器的目的,文档中处于 quirks 模式的 HTML 元素的唯一标识符必须被视为不区分 ASCII 大小写。

为了选择器匹配的目的,文档中处于怪癖模式的 HTML 元素的 class 属性中的类必须被视为不区分 ASCII 大小写。

将 CSS 元素类型选择器与 HTML 文档中的 HTML 元素名称进行比较时,必须首先将 CSS 元素类型选择器转换为 ASCII 小写。同一个选择器在与其他元素进行比较时,必须根据其原始大小写进行比较。在这两种情况下,比较都区分大小写。

当比较 CSS 属性选择器的名称部分与 HTML 文档中 HTML 元素上无命名空间的属性名称时,必须首先将 CSS 属性选择器的名称部分转换为 ASCII 小写。同一个选择器在与其他属性进行比较时,必须根据其原始大小写进行比较。在这两种情况下,比较都区分大小写。

其他所有内容(HTML 元素的属性值、无怪癖模式和受限怪癖模式下的 ID 和类,以及 XML 文档中的元素名称、属性名称和属性值)都必须区分大小写选择器匹配。

【讨论】:

  • 不,不。如果您将小提琴中的 CSS 更改为 DIV[TITLE=title] {color:green},它确实使文本变为绿色。所以这就是 CSS 对属性 values 的响应方式。
【解决方案4】:

一些较新的浏览器支持这种语法

div[title=TITLE i] { color:green; }

div[title=TITLE I] { color:green; }

两者都匹配这个DIV:

<div title="title">This is a div</div>

注意:支持:版本:Chrome >= 49.0、Firefox (Gecko) >= 47.0、Safari >= 9

【讨论】:

  • 这没有得到广泛支持。您的“最新浏览器”仅限 Chrome。
  • 所有最新浏览器都支持此功能支持:版本:Chrome >= 49.0、Firefox (Gecko) >= 47.0、Safari >= 9
  • 分数:-1. 同时the same solution 另一个问题:29. 让我们停下来思考一下 SO 分数的质量和价值... ⦁ @MrLister:除了微软,“now”every browser。你没有通过时间的考验,@MrLister!但它会教你什么吗?还是你会继续活在当下,直到最后一口气?
  • @MrLister:不,我希望它们不会那么短暂。尤其是当这种短暂性以牺牲其他用户为代价时。您的担忧不再有效,但 +ankit 的负分仍然存在。
  • @MrLister:但这种特殊的发展是不可避免的。
猜你喜欢
  • 2011-08-05
  • 2011-08-10
  • 2013-10-28
  • 2019-04-05
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多