哪些字符在CSS类名/选择器中有效?

Dar*_*ein 1171 css css-selectors

CSS类选择器中允许使用哪些字符/符号?我知道以下字符无效,但哪些字符有效

~ ! @ $ % ^ & * ( ) + = , . / ' ; : " ? > < [ ] \ { } | ` #
Run Code Online (Sandbox Code Playgroud)

Tri*_*ych 1003

您可以直接检查CSS语法.

基本上1,名称必须以下划线(_),连字符(-)或字母(a- z)开头,后跟任意数量的连字符,下划线,字母或数字.有一个问题:如果第一个字符是连字符,则第二个字符必须是2个字母或下划线,并且名称长度必须至少为2个字符.

-?[_a-zA-Z]+[_a-zA-Z0-9-]*
Run Code Online (Sandbox Code Playgroud)

简而言之,之前的规则转换为以下内容,从W3C规范中提取.:

在CSS中,标识符(包括选择器中的元素名称,类和ID)只能包含字符[a-z0-9]和ISO 10646字符U + 00A1和更高,加上连字符( - )和下划线(_) ; 它们不能以数字开头,也不能以数字后跟连字符开头.标识符还可以包含转义字符和任何ISO 10646字符作为数字代码(请参阅下一项).例如,标识符"B&W?" 可以写成"B \&W \?" 或"B\26 W\3F".

以连字符或下划线开头的标识符通常保留用于特定于浏览器的扩展名,如-moz-opacity.

1通过包含转义的unicode字符(没有人真正使用),这一切都变得更加复杂.

2请注意,根据我链接的语法,以两个连字符开头的规则(例如--indent1)无效.但是,我很确定我在实践中已经看到了这一点.

  • 注意:W3C表示应该为特定于供应商的CSS扩展(例如,Mozilla浏览器实现的-moz*类)保留使用前导' - '或'_'. (56认同)
  • 一切都可以逃脱.http://mothereffingcssescapes.com/#--indent1 (48认同)
  • `在CSS中,标识符(包括选择器中的元素名称,类和ID)只能包含字符[a-zA-Z0-9]和ISO 10646字符U + 00A0及更高,加上连字符( - )和下划线(_); 它们不能以数字,两个连字符或连字符后跟数字开头.标识符还可以包含转义字符和任何ISO 10646字符作为数字代码(请参阅下一项).例如,标识符"B&W?" 可以写成"B \&W \?" 或"B\26 W\3F"`.所以 - `--indent1`无效,需要转义为`\ - indent1`(例如,` - `类在iOS上中断) (11认同)
  • [截至 2022 年,CS​​S 规范将类名定义为“”。+ ident`,并且`ident`的词法扫描器规则特别允许在类名中初始`[_A-Za-z]`字符之后使用`0x00-0x7F`之外的_任何字符_,因此`[_a-zA- Z0-9-]*` 此处发布的模式不正确。 (9认同)
  • 两年后更新@Pim Jager的评论,根据http://www.w3counter.com/globalstats.php,现在IE6用户不到3%,IE9仅占4%,IE7占9%,IE8在22%.所有版本的Firefox都有28%,所有版本的Chrome都有17%. (5认同)
  • \ -escapes是常用的,但通常主要用于CSS黑客的目的,隔离不支持它们的浏览器. (3认同)
  • 我知道这是一个老答案,但CSS(至少2+)允许标识符中的任何*{Non-ASCII}*字符. (2认同)

Rob*_*mer 167

令我惊讶的是,大多数答案都是错误的.事实证明:

CSS中的CSS类名允许除NUL之外的任何字符.(如果CSS包含NUL(转义或不转义),则结果未定义.[ CSS-characters ])

Mathias Bynens回答解释演示的链接,展示了如何使用这些名称.在CSS代码中,类名可能需要转义,但这不会改变类名.例如,不必要的过度转义表示将与该名称的其他表示看起来不同,但它仍然引用相同的类名.

大多数其他(编程)语言没有转义变量名称("标识符")的概念,因此变量的所有表示都必须看起来相同.CSS中不是这种情况.

请注意,在HTML中,无法在类名属性中包含空格字符(空格,制表符,换行符,换页符和回车符),因为它们已经将类彼此分开.

因此,如果您需要将随机字符串转换为CSS类名称:处理NUL和空间,并转义(相应地为CSS或HTML).完成.

  • 答案的第一行应该是"这里的大多数答案都已过时/只适用于CSS2". (7认同)
  • @SalmanA我所说的答案从一开始就错了.它们既不适用于CSS2.1,CSS2也不适用于CSS1. (7认同)

Jas*_*n S 68

阅读W3C规范.(这是CSS 2.1,找到适合您的浏览器假设的版本)

编辑:相关段落如下:

在CSS中,标识符(包括选择器中的元素名称,类和ID)只能包含字符[a-z0-9]和ISO 10646字符U + 00A1和更高,加上连字符( - )和下划线(_) ; 它们不能以数字开头,也不能以数字后跟连字符开头.标识符还可以包含转义字符和任何ISO 10646字符作为数字代码(请参阅下一项).例如,标识符"B&W?" 可以写成"B \&W \?" 或"B\26 W\3F".

编辑2:正如@mipadi在Triptych的回答中指出的那样,有一个警告,也在同一个网页中:

在CSS中,标识符可以以" - "(破折号)或"_"(下划线)开头.以" - "或"_"开头的关键字和属性名称保留给特定于供应商的扩展.此类特定于供应商的扩展应具有以下格式之一:

'-' + vendor identifier + '-' + meaningful name 
'_' + vendor identifier + '-' + meaningful name
Run Code Online (Sandbox Code Playgroud)

例子):

例如,如果XYZ组织添加了一个属性来描述显示器东侧边框的颜色,则可以将其称为-xyz-border-east-color.

其他已知的例子:

 -moz-box-sizing
 -moz-border-radius
 -wap-accesskey
Run Code Online (Sandbox Code Playgroud)

保证初始破折号或下划线永远不会被任何当前或未来的CSS级别用于属性或关键字.因此,典型的CSS实现可能无法识别这些属性,并且可能根据用于处理解析错误的规则来忽略它们.但是,因为初始短划线或下划线是语法的一部分,所以CSS 2.1实现者应始终能够使用符合CSS的解析器,无论它们是否支持任何特定于供应商的扩展.

作者应避免特定于供应商的扩展


Mat*_*ens 66

我已经在这里深入回答了你的问题:http://mathiasbynens.be/notes/css-escapes

本文还解释了如何在CSS(和JavaScript)中转义任何字符,我也为此做了一个方便的工具.从该页面:

如果您要为元素提供ID值~!@$%^&*()_+-=,./';:"?><[]{}|`#,则选择器将如下所示:

CSS:

<style>
  #\~\!\@\$\%\^\&\*\(\)\_\+-\=\,\.\/\'\;\:\"\?\>\<\[\]\\\{\}\|\`\#
  {
    background: hotpink;
  }
</style>
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

<script>
  // document.getElementById or similar
  document.getElementById('~!@$%^&*()_+-=,./\';:"?><[]\\{}|`#');
  // document.querySelector or similar
  $('#\\~\\!\\@\\$\\%\\^\\&\\*\\(\\)\\_\\+-\\=\\,\\.\\/\\\'\\;\\:\\"\\?\\>\\<\\[\\]\\\\\\{\\}\\|\\`\\#');
</script>
Run Code Online (Sandbox Code Playgroud)

  • @Darryl当然,这是一个非常极端的例子,但像[`class ="404-error"`](http://mothereffingcssescapes.com/#404-error)之类的东西可能很有用. (4认同)
  • +1,但为什么还要有一个名为that的类!:P (3认同)
  • 与生活中的大多数事情一样,在CSS中似乎"技术合法到极端"和"理智"之间存在差异. (3认同)

Gum*_*mbo 24

完整的正则表达式是:

-?(?:[_a-z]|[\200-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])(?:[_a-z0-9-]|[\200-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*
Run Code Online (Sandbox Code Playgroud)

因此,如果直接使用,则不允许使用除" -"和" _" 之外的所有列出的字符.但您可以使用反斜杠foo\~bar或使用unicode表示法对它们进行编码foo\7E bar.

  • @JamesDonnelly如果您认为需要更新,请随时编辑我的答案。 (2认同)

D.T*_*ate 10

对于那些寻找变通方法的人,可以使用属性选择器,例如,如果您的类以数字开头.更改:

.000000-8{background:url(../../images/common/000000-0.8.png);} /* DOESN'T WORK!! */
Run Code Online (Sandbox Code Playgroud)

对此:

[class="000000-8"]{background:url(../../images/common/000000-0.8.png);} /* WORKS :) */
Run Code Online (Sandbox Code Playgroud)

此外,如果有多个类,您需要在我认为的选择器中指定它们.

资料来源:

  1. https://benfrain.com/when-and-where-you-can-use-numbers-in-id-and-class-names/
  2. 是否有一种解决方法可以使名称以数字开头的CSS类有效?


Luk*_*kas 9

不建议使用除 Az、_- 和 0-9 之外的任何字符,而使用这些符号进行编码更容易。也不要以-while 这些类通常是浏览器特定的标志来启动类。为了避免 IDE 自动完成出现任何问题,当您出于某种原因可能需要使用其他代码生成这些类名时,可以降低复杂性。也许某些转译软件可能无法工作等等。

然而 CSS 在这方面却相当宽松。您可以使用任何符号,甚至表情符号也可以。

<style>
  . {
    border: 2px solid blue;
    width: 100px;
    height: 100px;
    overflow: hidden;
  }
</style>

<div class="">
  
</div>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Mar*_*ius 5

对于HTML5/CSS3类,ID可以从数字开始.

  • http://www.w3.org/TR/2003/WD-css3-syntax-20030813/#characters < - 仍然不允许领导号码等(即使它有效) (10认同)
  • HTML 5允许类和ID以数字开头(例如`class ="1a"`).但是,CSS标识符不能以数字开头(例如`.1a`将不起作用).你可以逃脱它,坚韧(例如`.\ 31 a`或`.\ 000031a`). (9认同)
  • @Ryan:这是一个资源:http://mathiasbynens.be/notes/html5-id-class (4认同)
  • 但 css 选择器仍然需要通过 unicode 代码点进行转义。例如:类 `10` 的 css 选择器需要是 `.\31 0` (2认同)

小智 5

我的理解是,下划线在技术上是有效的。查看:

https://developer.mozilla.org/en/underscores_in_class_and_id_names

“ ... 2001年初发布的规范的勘误表首次强调了合法性。”

上面链接的文章说,从不使用它们,然后给出了不支持它们的浏览器列表,至少就用户数量而言,所有浏览器都是冗长的。


dgk*_*nca 5

我们可以在类名中使用所有字符。#甚至像和 之类的字符.。我们只需要使用\(反斜杠)来转义它们。

.test\.123 {
  color: red;
}

.test\#123 {
  color: blue;
}

.test\@123 {
  color: green;
}

.test\<123 {
  color: brown;
}

.test\`123 {
  color: purple;
}

.test\~123 {
  color: tomato;
}
Run Code Online (Sandbox Code Playgroud)
<div class="test.123">test.123</div>
<div class="test#123">test#123</div>
<div class="test@123">test@123</div>
<div class="test<123">test<123</div>
<div class="test`123">test`123</div>
<div class="test~123">test~123</div>
Run Code Online (Sandbox Code Playgroud)