Какие символы допустимы в именах / селекторах классов CSS?

Какие символы / символы разрешены в селекторах класса CSS?
Я знаю, что следующие символы - это инвалид, но какие символы - это действительный?

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

Связанный вопрос: stackoverflow.com/questions/2812072/…

BalusC 07.07.2010 21:17

как насчет символов utf8? Как будто я могу напечатать на греческом

GorillaApe 27.11.2010 20:33

В именах классов можно использовать специальные символы, экранируя их - в вашем файле CSS вы можете определить класс .hello/world, экранировав обратную косую черту: .hello\2fworld, hello\2f world или hello/world

wyqydsyq 05.06.2012 04:18

Другой связанный вопрос, не о «синтаксисе имен», а о «синтаксисе атрибута класса» при выражение нескольких имен.

Peter Krauss 11.12.2012 07:41

@DarrylHein: неправильное предположение состоит в том, что селекторы классов CSS не могут содержать - или _.

chharvey 13.03.2015 03:07

Вы также можете использовать смайлики. npmjs.com/package/postcss-modules-emoji-classname

Kevin Suttle 04.10.2016 08:10

Вы даже можете использовать смайлики ?

Ric 22.07.2018 09:07
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
1 259
7
399 342
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

Вы можете проверить прямо на Грамматика CSS.

По сути1, имя должно начинаться с подчеркивания (_), дефиса (-) или буквы (az), за которыми следует любое количество дефисов, подчеркиваний, букв или цифр. Здесь есть одна загвоздка: если первый символ - дефис, второй символ 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).

mipadi 16.01.2009 02:44

\ -Экраны обычно используются, но в основном в целях взлома CSS, изоляции браузеров, которые их не поддерживают.

bobince 16.01.2009 02:59

@Paolo - если вы придерживаетесь правила использования символов подчеркивания только для расширений, специфичных для браузера, то игнорирование их в IE6 не причинит вреда.

Triptych 16.01.2009 03:02

Вы можете использовать escape-символы для представления разных символов. Это может быть полезно, например, для нацеливания на подчеркивание в качестве первого символа и для того, чтобы IE6 распознал его как таковой: \ _

arxpoetica 19.10.2010 23:16

Чтобы обновить комментарий @Pim Jager через два года, согласно w3counter.com/globalstats.php, IE6 сейчас используется менее чем 3% пользователей, за IE9 - 4%, IE7 - 9%, IE8 - 22%. Все версии Firefox имеют 28%, все версии Chrome - 17%.

Daniel Earwicker 15.06.2011 17:49

Я знаю, что это старый ответ, но CSS (как минимум 2+) допускает любой символ {Не-ASCII} в идентификаторах.

user2864740 12.02.2014 22:57

Что касается комментария @mipadi: я не думаю, что это проблема на практике (поправьте меня, если я ошибаюсь). Даже если я назову класс чем-то таким нетрадиционным, как «-moz-any» (что я не планирую делать), он все равно не будет конфликтовать с «: -moz-any», если только я не напишу неверный селектор.

Albin 14.05.2015 01:15

Правило, начинающееся с двух дефисов, - это переменная CSS, которая имеет особое значение и поддерживается Firefox.

Sheepy 02.06.2015 09:33
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 ломаются)
eithed 12.10.2015 16:51

По теме: ваша грамматика допускает односимвольную строку? Как вы думаете, как лучше всего это исправить?

bigOmega 03.03.2016 22:54

@ bigΩmega Я считаю, что односимвольные имена допустимы, если они начинаются с буквы или подчеркивания.

Triptych 04.03.2016 00:25

@Triptych, почему плюс после первого набора символов ([_a-zA-Z]+)? Если я правильно читаю спецификацию, это может произойти только один раз: либо как первый символ имени, либо как символ, следующий за открывающим дефисом.

typo 24.09.2019 05:44

Прочтите Спецификация 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 name

Example(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-accesskey

An 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

Я имел в виду вашу вторую правку, касающуюся ведущих дефисов и подчеркиваний, но забыл прояснить это. Извините за путаницу.

Albin 14.05.2015 04:25

Полное регулярное выражение:

-?(?:[_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.

flying sheep 11.07.2014 17:46
\377 здесь на самом деле не так. В разделе «Грамматика лексического сканера CSS2.1» есть примечание, в котором говорится: «\ 377» представляет собой максимальное количество символов, с которым могут работать текущие версии Flex (десятичное 255). Его следует читать как «\ 4177777» ( decimal 1114111), что является наивысшей возможной кодовой точкой в ​​Unicode / ISO-10646 ». Он также должен быть от \240, а не от \377. Думаю, ему сейчас 7 лет, так что с тех пор, вероятно, все немного изменилось.
James Donnelly 18.03.2016 17:50

Я считаю, что более точным регулярным выражением было бы -?(?:[_a-z]|(?![\u0000-\u0239]).*|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])(?:[_a-z0-9-]|(?![\u0000-\u023‌​9]).*|\\[0-9a-f]{1,6‌​}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*.

James Donnelly 18.03.2016 19:06

@JamesDonnelly Пожалуйста, не стесняйтесь редактировать мой ответ, если считаете, что он нуждается в обновлении.

Gumbo 18.03.2016 21:12

Для HTML5 / CSS3 классы и идентификаторы могут начинаться с цифр.

У вас есть источник для этого? Возможно, мне что-то не хватает, но Спецификация селекторов CSS3 ссылается на определение идентификаторов в спецификации CSS 2.1, которая не допускает ведущих чисел.

Ryan 28.11.2010 00:45
w3.org/TR/2003/WD-css3-syntax-20030813/#characters <- все еще не разрешает начальные числа и т. д. (Хотя это работает)
Jamie Pate 16.04.2013 02:04

HTML 5 позволяет классам и идентификаторам начинаться с числа (например, class = "1a"). Однако идентификатор CSS не может начинаться с числа (например, .1a не будет работать). Вы можете избежать этого, тяжело (например, .\31 a или .\000031a).

Oriol 16.02.2015 22:43

Хотя он обычно работает и в CSS, но похоже, что он все еще не официальный. «Имена свойств и имена правил at-всегда являются идентификаторами, которые должны начинаться с буквы или дефиса, за которым следует буква, а затем могут содержать буквы, числа, дефисы или символы подчеркивания». - w3.org/TR/css3-syntax/#syntax-description

Stickers 28.02.2015 00:15

@Pangloss Но имена классов не являются именами свойств или именами правил.

Bennett McElwee 15.07.2015 02:30

Не уверен, что вы имеете в виду под этим @BennettMcElwee, но посмотрите эта демонстрация.

Stickers 15.07.2015 04:37

Я думаю, что OP также попросил имена @BennettMcElwee «Какие символы допустимы в именах / селекторах классов CSS?», также мы комментируем этот конкретный ответ. Я согласен с вами в отношении селекторов атрибутов, и ваша демонстрация работает.

Stickers 15.07.2015 16:06

Ведущие числа не работают. jsfiddle.net/tst1rbv1 пробовал в IE11, FF39, Chrome44

jawo 18.08.2015 10:00

Насколько я понимаю, символ подчеркивания технически действителен. Проверить:

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", могут быть полезны.

Mathias Bynens 07.07.2011 19:12

У меня есть пример: я конвертирую вывод системы подсветки синтаксиса в CSS. он имеет такие имена классов, как «ISO C++: Типы (_t /_type)». если я заменяю только пробелы, у меня есть допустимые имена классов.

flying sheep 11.07.2014 17:44

На своем веб-сайте вы говорите, что пробел можно экранировать с помощью обратной косой черты. Когда я пробую использовать это в имени класса, я не могу заставить его работать. Я заметил, что в этом примере нет места. Является ли это возможным?

Adamarla 14.12.2016 19:31

@Adamarla <p class = "foo bar"> добавляет к элементу p два класса: foo и bar. Нет способа (который я могу придумать) добавить имя класса, содержащее пробелы, в элемент HTML. Информация о том, как экранировать пробельные символы, была включена, потому что полезно экранировать такие символы в других контекстах идентификатора, например названия семейств шрифтов.

Mathias Bynens 22.12.2016 11:22

Как и в большинстве случаев в жизни, в CSS кажется, что существует разница между «технически законным до крайности» и «нормальным».

Volksman 28.01.2017 00:14

@MathiasBynens Я был бы очень признателен, если бы вы могли взглянуть на мой вопрос stackoverflow.com/questions/50812118/…, связанный с этим, поскольку вы действительно, кажется, глубоко понимаете спецификацию.

Peter T. 13.06.2018 10:54

К моему удивлению, большинство ответов здесь неверны. Оказывается, что:

В именах классов CSS в CSS разрешен любой символ, кроме NUL. (если CSS содержит NUL (экранированный или нет), результат не определен. [CSS-символы])

Ответ Матиаса Биненса ссылается на объяснение и демонстрации, показывая, как использовать эти имена. Записанный в коде CSS, имя класса может потребоваться побег, но это не меняет имя класса. Например. излишне экранированное представление будет отличаться от других представлений этого имени, но по-прежнему относится к тому же имени класса.

В большинстве других языков программирования (программирования) нет такой концепции экранирования имен переменных («идентификаторов»), поэтому все представления переменных должны выглядеть одинаково. В CSS этого нет.

Обратите внимание, что в HTML нет возможности включить пробелы (пробел, табуляция, перевод строки, перевод страницы и возврат каретки) в атрибут имени класса, потому что они уже отделяют классы друг от друга.

Итак, если вам нужно превратить случайную строку в имя класса CSS: позаботьтесь о NUL и пробеле и экранируйте (соответственно для CSS или HTML). Сделанный.

Первая строка вашего ответа должна быть такой: «Большинство ответов здесь устарело / применимо только к CSS2».

Salman A 22.11.2014 19:18

@SalmanA Ответы, о которых я говорю, были неправильными с самого начала. Они не применимы ни к CSS2.1, ни к CSS2, ни к CSS1.

Robert Siemer 23.11.2014 02:37

@RobertSiemer хороший замечание, я переместил свой комментарий в stackoverflow.com/questions/50812118/… (который тем не менее относится к этой теме)

Peter T. 12.06.2018 11:03

И реализация JavaScript: github.com/mathiasbynens/CSS.escape/blob/master/css.escape.j‌ s

Duarte Cunha Leão 07.11.2019 19:22

Для всех, кому интересно: Common Lisp - это пример языка программирования, который позволяет экранировать символы в идентификаторах.

texdr.aft 09.02.2021 18:53

Для тех, кто ищет обходной путь, вы можете использовать селектор атрибутов, например, если ваш класс начинается с числа. Изменять:

.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 :) */

Кроме того, если есть несколько классов, я думаю, вам нужно будет указать их в селекторе.

Источники:

  1. https://benfrain.com/when-and-where-you-can-use-numbers-in-id-and-class-names/
  2. Есть ли обходной путь, чтобы сделать классы CSS с именами, начинающимися с цифр, действительными?

Исходя из ответа @ 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>

Другие вопросы по теме