Какие символы / символы разрешены в селекторах класса CSS?
Я знаю, что следующие символы - это инвалид, но какие символы - это действительный?
~ ! @ $ % ^ & * ( ) + = , . / ' ; : " ? > < [ ] \ { } | ` #
как насчет символов utf8? Как будто я могу напечатать на греческом
В именах классов можно использовать специальные символы, экранируя их - в вашем файле CSS вы можете определить класс .hello/world, экранировав обратную косую черту: .hello\2fworld, hello\2f world или hello/world
Другой связанный вопрос, не о «синтаксисе имен», а о «синтаксисе атрибута класса» при выражение нескольких имен.
@DarrylHein: неправильное предположение состоит в том, что селекторы классов CSS не могут содержать - или _.
Вы также можете использовать смайлики. npmjs.com/package/postcss-modules-emoji-classname
Вы даже можете использовать смайлики ?






Вы можете проверить прямо на Грамматика CSS.
По сути1, имя должно начинаться с подчеркивания (_), дефиса (-) или буквы (a – z), за которыми следует любое количество дефисов, подчеркиваний, букв или цифр. Здесь есть одна загвоздка: если первый символ - дефис, второй символ 2 должен быть буквой или знаком подчеркивания, а имя должно состоять не менее чем из 2 символов.
-?[_a-zA-Z]+[_a-zA-Z0-9-]*
Короче говоря, предыдущее правило преобразуется в следующее, извлеченное из Спецификация W3C.:
In CSS, identifiers (including element names, classes, and IDs in selectors) can contain only the characters [a-z0-9] and ISO 10646 characters U+00A0 and higher, plus the hyphen (-) and the underscore (_); they cannot start with a digit, or a hyphen followed by a digit. Identifiers can also contain escaped characters and any ISO 10646 character as a numeric code (see next item). For instance, the identifier "B&W?" may be written as "B&W?" or "B\26 W\3F".
Идентификаторы, начинающиеся с дефиса или подчеркивания, обычно зарезервированы для расширений браузера, как в -moz-opacity.
1 Все немного усложняется включением экранированных символов Юникода (которые на самом деле никто не использует).
2 Обратите внимание, что в соответствии с грамматикой, которую я связал, правило, начинающееся с ДВУХ дефисов, например --indent1, недействителен. Однако я почти уверен, что видел это на практике.
NB: W3C утверждает, что использование начальных знаков "-" или "_" должно быть зарезервировано для расширений CSS, зависящих от поставщика (например, классов -moz *, реализованных браузерами Mozilla).
\ -Экраны обычно используются, но в основном в целях взлома CSS, изоляции браузеров, которые их не поддерживают.
@Paolo - если вы придерживаетесь правила использования символов подчеркивания только для расширений, специфичных для браузера, то игнорирование их в IE6 не причинит вреда.
Вы можете использовать escape-символы для представления разных символов. Это может быть полезно, например, для нацеливания на подчеркивание в качестве первого символа и для того, чтобы IE6 распознал его как таковой: \ _
Чтобы обновить комментарий @Pim Jager через два года, согласно w3counter.com/globalstats.php, IE6 сейчас используется менее чем 3% пользователей, за IE9 - 4%, IE7 - 9%, IE8 - 22%. Все версии Firefox имеют 28%, все версии Chrome - 17%.
Я знаю, что это старый ответ, но CSS (как минимум 2+) допускает любой символ {Не-ASCII} в идентификаторах.
Что касается комментария @mipadi: я не думаю, что это проблема на практике (поправьте меня, если я ошибаюсь). Даже если я назову класс чем-то таким нетрадиционным, как «-moz-any» (что я не планирую делать), он все равно не будет конфликтовать с «: -moz-any», если только я не напишу неверный селектор.
Правило, начинающееся с двух дефисов, - это переменная CSS, которая имеет особое значение и поддерживается Firefox.
In CSS, identifiers (including element names, classes, and IDs in selectors) 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 (see next item). For instance, the identifier "B&W?" may be written as "B\&W\?" or "B\26 W\3F". Итак - --indent1 недействителен и должен быть экранирован как \--indent1 (например, классы -- в iOS ломаются)
По теме: ваша грамматика допускает односимвольную строку? Как вы думаете, как лучше всего это исправить?
@ bigΩmega Я считаю, что односимвольные имена допустимы, если они начинаются с буквы или подчеркивания.
@Triptych, почему плюс после первого набора символов ([_a-zA-Z]+)? Если я правильно читаю спецификацию, это может произойти только один раз: либо как первый символ имени, либо как символ, следующий за открывающим дефисом.
Прочтите Спецификация W3C. (это CSS 2.1, найдите подходящую версию для вашего предположения о браузерах)
изменить: соответствующий абзац следует:
In CSS, identifiers (including element names, classes, and IDs in selectors) can contain only the characters [a-z0-9] and ISO 10646 characters U+00A1 and higher, plus the hyphen (-) and the underscore (_); they cannot start with a digit, or a hyphen followed by a digit. Identifiers can also contain escaped characters and any ISO 10646 character as a numeric code (see next item). For instance, the identifier "B&W?" may be written as "B\&W\?" or "B\26 W\3F".
изменить 2: как указывает @mipadi в ответе Триптиха, есть этот предостережение, также на той же веб-странице:
In CSS, identifiers may begin with '-' (dash) or '_' (underscore). Keywords and property names beginning with '-' or '_' are reserved for vendor-specific extensions. Such vendor-specific extensions should have one of the following formats:
'-' + vendor identifier + '-' + meaningful name '_' + vendor identifier + '-' + meaningful nameExample(s):
For example, if XYZ organization added a property to describe the color of the border on the East side of the display, they might call it -xyz-border-east-color.
Other known examples:
-moz-box-sizing -moz-border-radius -wap-accesskeyAn initial dash or underscore is guaranteed never to be used in a property or keyword by any current or future level of CSS. Thus typical CSS implementations may not recognize such properties and may ignore them according to the rules for handling parsing errors. However, because the initial dash or underscore is part of the grammar, CSS 2.1 implementers should always be able to use a CSS-conforming parser, whether or not they support any vendor-specific extensions.
Authors should avoid vendor-specific extensions
Я имел в виду вашу вторую правку, касающуюся ведущих дефисов и подчеркиваний, но забыл прояснить это. Извините за путаницу.
Полное регулярное выражение:
-?(?:[_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])*
Таким образом, все перечисленные вами символы, кроме «-» и «_», не допускаются при прямом использовании. Но вы можете закодировать их, используя обратную косую черту foo\~bar или используя нотацию Unicode foo\7E bar.
почему [\200-\377]? [\178-\1114112] разрешен без экранирования в CSS 3.
\377 здесь на самом деле не так. В разделе «Грамматика лексического сканера CSS2.1» есть примечание, в котором говорится: «\ 377» представляет собой максимальное количество символов, с которым могут работать текущие версии Flex (десятичное 255). Его следует читать как «\ 4177777» ( decimal 1114111), что является наивысшей возможной кодовой точкой в Unicode / ISO-10646 ». Он также должен быть от \240, а не от \377. Думаю, ему сейчас 7 лет, так что с тех пор, вероятно, все немного изменилось.
Я считаю, что более точным регулярным выражением было бы -?(?:[_a-z]|(?![\u0000-\u0239]).*|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])(?:[_a-z0-9-]|(?![\u0000-\u0239]).*|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*.
@JamesDonnelly Пожалуйста, не стесняйтесь редактировать мой ответ, если считаете, что он нуждается в обновлении.
Для HTML5 / CSS3 классы и идентификаторы могут начинаться с цифр.
У вас есть источник для этого? Возможно, мне что-то не хватает, но Спецификация селекторов CSS3 ссылается на определение идентификаторов в спецификации CSS 2.1, которая не допускает ведущих чисел.
HTML 5 позволяет классам и идентификаторам начинаться с числа (например, class = "1a"). Однако идентификатор CSS не может начинаться с числа (например, .1a не будет работать). Вы можете избежать этого, тяжело (например, .\31 a или .\000031a).
Хотя он обычно работает и в CSS, но похоже, что он все еще не официальный. «Имена свойств и имена правил at-всегда являются идентификаторами, которые должны начинаться с буквы или дефиса, за которым следует буква, а затем могут содержать буквы, числа, дефисы или символы подчеркивания». - w3.org/TR/css3-syntax/#syntax-description
@Pangloss Но имена классов не являются именами свойств или именами правил.
Не уверен, что вы имеете в виду под этим @BennettMcElwee, но посмотрите эта демонстрация.
Я думаю, что OP также попросил имена @BennettMcElwee «Какие символы допустимы в именах / селекторах классов CSS?», также мы комментируем этот конкретный ответ. Я согласен с вами в отношении селекторов атрибутов, и ваша демонстрация работает.
Ведущие числа не работают. jsfiddle.net/tst1rbv1 пробовал в IE11, FF39, Chrome44
Насколько я понимаю, символ подчеркивания технически действителен. Проверить:
https://developer.mozilla.org/en/underscores_in_class_and_id_names
«... исправления в спецификации, опубликованной в начале 2001 года, впервые сделали символы подчеркивания законными».
В приведенной выше статье говорится, что никогда не используйте их, а затем приводится список браузеров, которые их не поддерживают, и все они, по крайней мере, с точки зрения количества пользователей, давно избыточны.
Я подробно ответил на ваш вопрос здесь: http://mathiasbynens.be/notes/css-escapes
В статье также объясняется, как экранировать любой символ в CSS (и JavaScript), и я также сделал для этого удобный инструмент. С этой страницы:
If you were to give an element an ID value of
~!@$%^&*()_+-=,./';:"?><[]{}|`#, the selector would look like this:CSS:
<style> #\~\!\@\$\%\^\&\*\(\)\_\+-\=\,\./\'\;\:\"\?\>\<\[\]\\\{\}\|\`\# { background: hotpink; } </style>JavaScript:
<script> // document.getElementById or similar document.getElementById('~!@$%^&*()_+-=,./\';:"?><[]\\{}|`#'); // document.querySelector or similar $('#\\~\\!\\@\\$\\%\\^\\&\\*\\(\\)\\_\\+-\\=\\,\\.\/\\\'\\;\\:\\"\\?\\>\\<\\[\\]\\\\\\{\\}\\|\\`\\#'); </script>
@Darryl Конечно, это довольно экстремальный пример, но такие вещи, как class = "404-error", могут быть полезны.
У меня есть пример: я конвертирую вывод системы подсветки синтаксиса в CSS. он имеет такие имена классов, как «ISO C++: Типы (_t /_type)». если я заменяю только пробелы, у меня есть допустимые имена классов.
На своем веб-сайте вы говорите, что пробел можно экранировать с помощью обратной косой черты. Когда я пробую использовать это в имени класса, я не могу заставить его работать. Я заметил, что в этом примере нет места. Является ли это возможным?
@Adamarla <p class = "foo bar"> добавляет к элементу p два класса: foo и bar. Нет способа (который я могу придумать) добавить имя класса, содержащее пробелы, в элемент HTML. Информация о том, как экранировать пробельные символы, была включена, потому что полезно экранировать такие символы в других контекстах идентификатора, например названия семейств шрифтов.
Как и в большинстве случаев в жизни, в CSS кажется, что существует разница между «технически законным до крайности» и «нормальным».
@MathiasBynens Я был бы очень признателен, если бы вы могли взглянуть на мой вопрос stackoverflow.com/questions/50812118/…, связанный с этим, поскольку вы действительно, кажется, глубоко понимаете спецификацию.
К моему удивлению, большинство ответов здесь неверны. Оказывается, что:
В именах классов CSS в CSS разрешен любой символ, кроме NUL. (если CSS содержит NUL (экранированный или нет), результат не определен. [CSS-символы])
Ответ Матиаса Биненса ссылается на объяснение и демонстрации, показывая, как использовать эти имена. Записанный в коде CSS, имя класса может потребоваться побег, но это не меняет имя класса. Например. излишне экранированное представление будет отличаться от других представлений этого имени, но по-прежнему относится к тому же имени класса.
В большинстве других языков программирования (программирования) нет такой концепции экранирования имен переменных («идентификаторов»), поэтому все представления переменных должны выглядеть одинаково. В CSS этого нет.
Обратите внимание, что в HTML нет возможности включить пробелы (пробел, табуляция, перевод строки, перевод страницы и возврат каретки) в атрибут имени класса, потому что они уже отделяют классы друг от друга.
Итак, если вам нужно превратить случайную строку в имя класса CSS: позаботьтесь о NUL и пробеле и экранируйте (соответственно для CSS или HTML). Сделанный.
Первая строка вашего ответа должна быть такой: «Большинство ответов здесь устарело / применимо только к CSS2».
@SalmanA Ответы, о которых я говорю, были неправильными с самого начала. Они не применимы ни к CSS2.1, ни к CSS2, ни к CSS1.
@RobertSiemer хороший замечание, я переместил свой комментарий в stackoverflow.com/questions/50812118/… (который тем не менее относится к этой теме)
И реализация JavaScript: github.com/mathiasbynens/CSS.escape/blob/master/css.escape.j s
Для всех, кому интересно: Common Lisp - это пример языка программирования, который позволяет экранировать символы в идентификаторах.
Для тех, кто ищет обходной путь, вы можете использовать селектор атрибутов, например, если ваш класс начинается с числа. Изменять:
.000000-8{background:url(../../images/common/000000-0.8.png);} /* DOESN'T WORK!! */
к этому:
[class = "000000-8"]{background:url(../../images/common/000000-0.8.png);} /* WORKS :) */
Кроме того, если есть несколько классов, я думаю, вам нужно будет указать их в селекторе.
Источники:
Исходя из ответа @ Triptych, вы можете использовать следующие 2 совпадения регулярных выражений, чтобы сделать строку действительной:
[^a-z0-9A-Z_-]
Это обратное совпадение, при котором выбираются все, кроме букв, цифр, тире или подчеркивания, для легкого удаления.
^-*[0-9]+
Это соответствует 0 или 1 дефису, за которым следует 1 или несколько чисел в начале строки, также для легкого удаления.
Как я использую это в PHP:
//Make alphanumeric with dashes and underscores (removes all other characters)
$class = preg_replace("/[^a-z0-9A-Z_-]/", "", $class);
//Classes only begin with an underscore or letter
$class = preg_replace("/^-*[0-9]+/", "", $class);
//Make sure the string is 2 or more characters long
return 2 <= strlen($class) ? $class : '';
Мы можем использовать все символы в качестве имени класса. Даже как # и .. Просто нам нужно избежать этого с помощью \.
.test\.123 {
color: red;
}
.test\#123 {
color: blue;
}
.test\@123 {
color: green;
}
.test\<123 {
color: brown;
}
.test\`123 {
color: purple;
}
.test\~123 {
color: tomato;
}<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>
Связанный вопрос: stackoverflow.com/questions/2812072/…