Какие символы / символы разрешены в селекторах классов CSS ?
Я знаю, что следующие символы недопустимы , но какие символы допустимы ?
~ ! @ $ % ^ & * ( ) + = , . / ' ; : " ? > < [ ] \ { } | ` #
css
css-selectors
Дэррил Хейн
источник
источник
.hello/world
класс, убегая обратную косую черту:.hello\2fworld
,hello\2f world
илиhello\/world
Ответы:
Вы можете проверить прямо в грамматике CSS .
В основном 1 , имя должно начинаться с символа подчеркивания (
_
), дефиса (-
) или буквы (a
-z
), за которым следует любое количество дефисов, символов подчеркивания, букв или цифр. Есть загвоздка: если первый символ является дефисом, второй символ должен быть 2 буквой или подчеркиванием, а имя должно быть длиной не менее 2 символов.Короче говоря, предыдущее правило переводится в следующее, извлеченное из спецификации W3C. :
Идентификаторы, начинающиеся с дефиса или подчеркивания, обычно зарезервированы для специфичных для браузера расширений, как в
-moz-opacity
.1 Все это немного усложняется включением экранированных символов Юникода (которые никто в действительности не использует).
2 Обратите внимание, что в соответствии с грамматикой, с которой я связан, правило, начинающееся с ДВУХ дефисов, например
--indent1
, является недействительным. Тем не менее, я уверен, что видел это на практике.источник
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
(--
классы перерыв на прошивкой, например)К моему удивлению, большинство ответов здесь неверны. Оказывается, что:
Любой символ, кроме NUL, допускается в именах классов CSS в CSS. (Если CSS содержит NUL (экранированный или нет), результат не определен. [ CSS-символы ])
Ответ Матиаса Биненса содержит ссылки на объяснения и демонстрации, показывающие, как использовать эти имена. Записанное в коде CSS, имя класса может нуждаться в экранировании , но это не меняет имя класса. Например, излишне избыточно экранированное представление будет отличаться от других представлений с таким именем, но оно все равно ссылается на то же имя класса.
Большинство других (программных) языков не имеют этой концепции экранирования имен переменных («идентификаторов»), поэтому все представления переменной должны выглядеть одинаково. Это не так в CSS.
Обратите внимание, что в HTML нет способа включить символы пробела (пробел, табуляцию, перевод строки, перевод формы и возврат каретки) в атрибут имени класса , поскольку они уже отделяют классы друг от друга.
Итак, если вам нужно превратить случайную строку в имя класса CSS: позаботьтесь о NUL и пробеле, и экранируйте (соответственно для CSS или HTML). Выполнено.
источник
Я подробно ответил на ваш вопрос здесь: http://mathiasbynens.be/notes/css-escapes
В статье также объясняется, как избежать любого символа в CSS (и JavaScript), и я также создал удобный инструмент для этого. С этой страницы:
источник
class="404-error"
могут быть полезны.<p class="foo bar">
добавляет два класса кp
элементу:,foo
иbar
. Нет способа (о котором я могу думать) добавить имя класса, содержащее пробел, к элементу HTML. Была включена информация о том, как экранировать пробельные символы, потому что полезно экранировать такие символы в других контекстах идентификаторов, например, в именах семейств шрифтов.Прочитайте спецификацию W3C . (это CSS 2.1, найдите подходящую версию для вашего браузера)
изменить: соответствующий абзац следующий:
изменить 2: как @mipadi указывает в ответе Триптиха, есть это предостережение , также на той же веб-странице:
источник
Полное регулярное выражение:
Таким образом, все ваши перечисленные символы, кроме «
-
» и «_
», не допускаются, если используются напрямую. Но вы можете закодировать их, используя обратную косую чертуfoo\~bar
или кодировку Unicodefoo\7E bar
.источник
[\200-\377]
?[\178-\1114112]
в CSS 3 разрешено не покинуть\377
здесь на самом деле не так. В грамматике раздела «Лексический сканер» CSS2.1 есть примечание: «\ 377» представляет наибольшее число символов, с которым могут работать текущие версии Flex (десятичное число 255.). Оно должно читаться как «\ 4177777» ( десятичное число 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])*
.Для тех, кто ищет обходной путь, вы можете использовать селектор атрибута, например, если ваш класс начинается с числа. Изменить:
к этому:
Кроме того, если есть несколько классов, вам нужно будет указать их в селекторе, я думаю.
Источники:
источник
Насколько я понимаю, подчеркивание является технически обоснованным. Проверять, выписываться:
https://developer.mozilla.org/en/underscores_in_class_and_id_names
«... ошибки в спецификации, опубликованной в начале 2001 года, впервые подчеркнули законность».
В статье, приведенной выше, говорится, что никогда не используйте их, затем приведен список браузеров, которые их не поддерживают, и все они, по крайней мере с точки зрения количества пользователей, являются избыточными.
источник
Для HTML5 / CSS3 классы и идентификаторы могут начинаться с цифр.
источник
class="1a"
). Однако идентификатор CSS не может начинаться с цифры (например.1a
, не будет работать). Вы можете избежать этого, жестко (например,.\31 a
или.\000031a
).Исходя из ответа @ Triptych, вы можете использовать следующие 2 совпадения регулярных выражений, чтобы сделать строку допустимой:
Это обратное совпадение, при котором выбирается все, что не является буквой, цифрой, тире или подчеркиванием для легкого удаления.
Это соответствует 0 или 1 тире, за которыми следуют 1 или более цифр в начале строки, также для легкого удаления.
Как я использую это в PHP:
источник