ChatGPT解决这个技术问题 Extra ChatGPT

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

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

~ ! @ $ % ^ & * ( ) + = , . / ' ; : " ? > < [ ] \ { } | ` #
utf8 字符呢?就像我可以输入希腊语一样
通过转义特殊字符可以在类名中使用 - 在 CSS 文件中,您可以通过转义反斜杠来定义 .hello/world 类:.hello\2fworldhello\2f worldhello\/world
另一个相关问题,不是关于“名称的语法”,而是关于 expressing multiple names 时的“类属性的语法”。
您也可以使用表情符号。 npmjs.com/package/postcss-modules-emoji-classname

V
Vlad Didenko

您可以直接在 CSS grammar 处查看。

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

-?[_a-zA-Z]+[_a-zA-Z0-9-]*

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

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

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

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

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


注意:W3C 表示,应该为特定供应商的 CSS 扩展(例如,Mozilla 浏览器实现的 -moz* 类)保留前导“-”或“_”的使用。
我添加了不以 _ 或字母开头但表情符号开头的示例。我不建议对类进行这样的命名,但它确实有效。很高兴知道一般的好奇心。 stackoverflow.com/a/69963534/1737158
As of 2022, the CSS spec defines a class-name(在 .css 规则的选择器中)作为 "." + ident,并且 ident 的词法扫描器规则特别允许在初始 { 之后的类名中 0x00-0x7F 之外的 任何字符 6} 字符,因此此处发布的 [_a-zA-Z0-9-]* 模式不正确。
R
Robert Siemer

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

除 NUL 之外的任何字符都可以在 CSS 中的 CSS 类名中使用。(如果 CSS 包含 NUL(是否转义),则结果未定义。[CSS-characters])

Mathias Bynens' answer 指向 explanationdemos 的链接,显示如何使用这些名称。 写在CSS代码中,类名可能需要转义,但这不会改变类名。例如,一个不必要的过度转义表示看起来与该名称的其他表示不同,但它仍然引用相同的类名。

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

请注意,在 HTML 中,无法将 space characters (space, tab, line feed, form feed and carriage return) 包含在 class name attribute 中,因为它们已经将类彼此分开。

因此,如果您需要将随机字符串转换为 CSS 类名:请注意 NUL 和空格,然后转义(针对 CSS 或 HTML)。完毕。


E
Eric

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

这篇文章还解释了如何在 CSS(和 JavaScript)中转义任何字符,我也为此制作了 a handy tool。从该页面:

如果你要给一个元素一个 ID 值 ~!@$%^&*()_+-=,./';:"?><[]{}|`#,选择器看起来像这样: CSS: <样式> #\~\!\@\$\%\^\&\*\(\)\_\+-\=\,\.\/\'\;\:\"\?\ >\<\[\]\\\{\}\|\`\# { 背景:hotpink; } JavaScript: