Які символи дійсні в іменах / селекторах класів CSS?


1203

Які символи / символи дозволені в селекторах класів CSS ?
Я знаю, що наступні символи недійсні , але які символи є дійсними ?

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

5
Пов'язані питання: stackoverflow.com/questions/2812072 / ...
BalusC

32
що з символами utf8? Як я можу набрати
грецьку мову

9
Спеціальні символи можуть використовуватися в іменах класів, тікаючи їх - у файлі CSS ви можете визначити .hello/worldклас, тікаючи зворотну косу рису: .hello\2fworld, hello\2f worldабоhello\/world
wyqydsyq

1
Ще одне пов'язане питання, не про "синтаксис імен", а про "синтаксис атрибута класу" при вираженні кількох імен .
Пітер Краусс

2
Ви також можете використовувати смайли. npmjs.com/package/postcss-modules-emoji-classname
Кевін

Відповіді:


1024

Ви можете перевірити безпосередньо в граматиці CSS .

В основному 1 , ім'я повинно починатися з підкреслення ( _), дефіса ( -) або літери ( a- z), після чого будь-яка кількість дефісів, підкреслення, букв чи цифр. Є улов: якщо перший символ є дефісом, другий символ повинен бути 2 буквою або підкресленням, а ім'я має бути не менше 2 символів.

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

Коротше кажучи, попереднє правило перекладається на наступне, витягнуте із специфікації W3C. :

У CSS ідентифікатори (включаючи назви елементів, класи та ідентифікатори у селекторах) можуть містити лише символи [a-z0-9] та ISO 10646 символів U + 00A1 і вище, плюс дефіс (-) та підкреслення (_) ; вони не можуть починатися цифрою або дефісом, за яким слідує цифра. Ідентифікатори також можуть містити пропущені символи та будь-який символ ISO 10646 як числовий код (див. Наступний пункт). Наприклад, ідентифікатор "B&W?" може бути записано як "B \ & W \?" або "B \ 26 W \ 3F".

Ідентифікатори, що починаються з дефісу або підкреслення, зазвичай зарезервовані для розширень, орієнтованих на браузер, як у -moz-opacity.

1 Все ускладнюється включенням уникнутих символів Unicode (які ніхто не використовує).

2 Зауважте, що згідно з граматикою, з якою я пов'язаний, правило, що починається з ДВАХ дефісів, наприклад --indent1, є недійсним. Однак я майже впевнений, що бачив це на практиці.


57
Примітка: W3C говорить, що використання провідних '-' або '_' має бути зарезервовано для специфічних для продавця розширень CSS (наприклад, класів -moz *, реалізованих браузерами Mozilla).
mipadi

3
\ -Escapes зазвичай використовуються, але, як правило, в основному для хаків CSS, виділяючи браузери, які їх не підтримують.
bobince

5
Щоб оновити коментар @Pim Jager через два роки, за даними w3counter.com/globalstats.php IE6 зараз використовується менш ніж 3% користувачів, за IE9 на 4%, IE7 на 9%, IE8 на 22%. Усі версії Firefox мають 28%, усі версії Chrome - 17%.
Даніель Ервікер

3
Я знаю, що це стара відповідь, але CSS (принаймні 2+) дозволяє будь -які символи {Non-ASCII} в ідентифікаторах.
користувач2864740

11
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--
уникати,

177

На мій подив, більшість відповідей тут неправильні. Виявляється, що:

У іменах класів CSS дозволено будь-який символ, крім NUL. (Якщо CSS містить NUL (відхилений чи ні), результат не визначений. [ CSS-символи ])

Відповіді Матіаса Байненса посилаються на пояснення та демонстрації демонстрацій, як показувати, як використовувати ці імена. Записаний у коді CSS, ім'я класу може знадобитися уникнути , але це не змінює ім'я класу. Наприклад, надмірно уникнене представлення буде виглядати відмінно від інших представлень цього імені, але воно все ще відноситься до того ж імені класу.

Більшість інших мов (програмування) не мають такої концепції уникнення імен змінних ("ідентифікатори"), тому всі представлення змінної повинні виглядати однаково. У CSS це не так.

Зауважте, що в HTML немає можливості включити символи пробілу (пробіл, вкладка, канал рядків, канал форми та повернення каретки) в атрибут імені класу , оскільки вони вже відокремлюють класи один від одного.

Отже, якщо вам потрібно перетворити випадкову рядок у назву класу CSS: подбайте про NUL та пробіл, і втечі (відповідно для CSS або HTML). Зроблено.


7
Перший рядок вашої відповіді повинен бути "більшість відповідей тут застаріли / стосуються лише CSS2".
Салман

7
@SalmanA Відповіді, на які я посилаюсь, спочатку були неправильними. Вони не застосовуються до CSS2.1, CSS2 або CSS1.
Роберт Сімер

@RobertSiemer Хороший момент, я перемістив свій коментар до stackoverflow.com/questions/50812118/… (що ніколи не менш пов'язане з цією темою)
Пітер Т.


71

Я детально відповів на ваше запитання тут: http://mathiasbynens.be/notes/css-escapes

У статті також пояснюється, як уникнути будь-якого символу в CSS (і JavaScript), і я також зробив зручний інструмент для цього. З цієї сторінки:

Якби ви призначили елементу значення ідентифікатора ~!@$%^&*()_+-=,./';:"?><[]{}|`#, селектор виглядатиме так:

CSS:

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

JavaScript:

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

4
@Darryl Звичайно, це досить екстремальний приклад, але подібні речі class="404-error"можуть бути корисними.
Mathias Bynens

у мене є приклад: я перетворюю вихідний сигнал синтаксису в CSS. він має назви класів, як "ISO C ++: типи ( _t / _type)". якщо я замінюю лише пробіли, у мене є дійсні імена класів.
літаючі вівці

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

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

3
Як і у більшості речей у житті, у CSS здається, що існує різниця між "технічно законним до крайнього" та "розумним".
Фолксман

69

Читати специфікацію W3C . (це CSS 2.1, знайдіть відповідну версію для вашого припущення для браузерів)

редагувати: відповідний параграф наступний:

У CSS ідентифікатори (включаючи назви елементів, класи та ідентифікатори у селекторах) можуть містити лише символи [a-z0-9] та ISO 10646 символів U + 00A1 і вище, плюс дефіс (-) та підкреслення (_) ; вони не можуть починатися цифрою або дефісом, за яким слідує цифра. Ідентифікатори також можуть містити пропущені символи та будь-який символ ISO 10646 як числовий код (див. Наступний пункт). Наприклад, ідентифікатор "B&W?" може бути записано як "B \ & W \?" або "B \ 26 W \ 3F".

редагуйте 2: як @mipadi вказує у відповіді Триптиха, є цей застереження , також на тій же веб-сторінці:

У CSS ідентифікатори можуть починатися з '-' (тире) або '_' (підкреслення). Ключові слова та назви властивостей, що починаються з '-' або '_', зарезервовані для розширень, що стосуються конкретного виробника. Такі розширення, що стосуються конкретного постачальника, повинні мати один із наступних форматів:

'-' + vendor identifier + '-' + meaningful name 
'_' + vendor identifier + '-' + meaningful name

Приклад (и):

Наприклад, якщо організація XYZ додала властивість описувати колір межі на східній стороні дисплея, вони можуть назвати його кольором -xyz-border-east-color.

Інші відомі приклади:

 -moz-box-sizing
 -moz-border-radius
 -wap-accesskey

Початковий тире або підкреслення гарантується, що ніколи не буде використовуватися у властивості чи ключовому слові жодним поточним чи майбутнім рівнем CSS. Таким чином, типові реалізації CSS можуть не розпізнавати такі властивості та можуть ігнорувати їх відповідно до правил обробки помилок розбору. Однак, оскільки початковий тире або підкреслення є частиною граматики, реалізатори CSS 2.1 повинні завжди мати можливість використовувати аналізатор, що відповідає CSS, незалежно від того, підтримують вони чи ні розширення, що стосуються конкретного постачальника.

Автори повинні уникати розширень, що стосуються конкретного постачальника


Я мав на увазі вашу другу редакцію про провідні тире та підкреслення, але забув уточнити це. Вибачте за непорозуміння.
Альбін

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])*

Тому всі перелічені символи, крім " -" та " _", заборонені при використанні безпосередньо. Але ви можете кодувати їх за допомогою зворотної косої риски foo\~barабо за допомогою позначення unicode foo\7E bar.


чому [\200-\377]? [\178-\1114112]дозволено без нагляду в CSS 3.
літаючі вівці

\377тут насправді неправильно. У розділі "Граматика лексичного сканера CSS2.1" є грамота, в якій зазначається: "" \ 377 "являє собою найбільше число символів, з яким можуть працювати нинішні версії Flex (десятковий 255). Його слід читати як" \ 4177777 "( десяткова 1114111), що є найвищою можливою точкою коду в Unicode / ISO-10646. " Це також повинно бути з \240, а не \377. Я думаю, це вже 7 років, хоча так, мабуть, з тих пір справи дещо змінилися.
Джеймс Доннеллі

1
Я вважаю, що більш точним регулярним виразом було б -?(?:[_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])*.
Джеймс Доннеллі

2
@JamesDonnelly Будь ласка, не соромтесь відредагувати мою відповідь, якщо ви вважаєте, що це потребує певного оновлення.
Гумбо

11

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

.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 з іменами, що починаються з чисел, дійсними?

5

Я розумію, що підкреслення є технічно достовірним. Перевіряти:

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

"... Еррата специфікації, опублікована на початку 2001 року, вперше зробила підкреслення законними."

У наведеній вище статті йдеться про те, що вони ніколи не використовують їх, а потім надають список веб-переглядачів, які не підтримують їх, і всі вони, принаймні, за кількістю користувачів, надовго зайвими.


4

Для HTML5 / CSS3 класи та ідентифікатори можуть починатися з чисел.


1
У вас є джерело для цього? Можливо, мені щось не вистачає, але CSS3 селектори специфікують посилання на визначення ідентифікаторів у специфікації CSS 2.1, що не дозволяє провідні числа.
Райан

11
w3.org/TR/2003/WD-css3-syntax-20030813/#characters <- все ще не дозволяє провідні цифри тощо (хоча це працює)
Jamie Pate

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

Хоча зазвичай він працює і в CSS, але схоже, що це все ще не офіційно. "Імена властивостей і назви правил завжди - це ідентифікатори, які повинні починатися з літери або дефіса, а потім букви, а потім можуть містити літери, цифри, дефіси або підкреслення." - w3.org/TR/css3-syntax/#syntax-description
Наклейки

@Pangloss Але імена класів не є іменами властивостей або іменами правила.
Bennett McElwee

1

Виходячи з відповіді @ Триптиха, ви можете використовувати наступні 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 : '';
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.