Могут ли идентификаторы CSS начинаться с двух дефисов?
в CSS 2.1 определяет коды as
в CSS коды может содержать только символы [a-zA - Z0-9] и ISO 10646 символов U + 00A0 и выше, плюс дефис (-) и подчеркивание ( _ ); они не могут начинаться с цифры, двух дефисов или дефис следуют цифры. Идентификаторы также могут содержать экранированные символы и любой символ ISO 10646 в виде числового кода.
таким образом, --
должен быть недопустимый идентификатор, а значит #--
не следует выбирать элемент с id="--"
:
body { color: black }
#-- { color: red }
<p id="--">I should be black.</p>
значения атрибутов должны быть идентификаторами или строками.
но --
кажется, работает как идентификатор для значений атрибутов, по крайней мере, в Firefox:
body { color: black }
[id=--] { color: red }
<p id="--">I am red on Firefox.</p>
кроме того, CSS.escape
был изменен, чтобы позволить --
:
незначительные изменения были внесены в Firefox 32, чтобы соответствовать спецификации и эволюция синтаксиса CSS. Идентификатор теперь может начинаться с
--
и второго рывка не избежать.
по словам Машина Wayback, изменение произошло между 19 и 30 Apr 2014:
-
6 февраля 2014 редакторский проект, хранится 19 апреля 2014 года.
если символ является вторым символом и является " - "(U+002D) и сначала символ" -", а затем сбежавший символ.
-
30 апр 2014 редакторский проект, хранится 4 мая 2014 года.
если символ [...] is " - "(U+002D) [...], то характер себя.
Итак, какой-то новый модуль CSS3 изменил определение идентификаторов, так что иногда они могут начинаться с --
, или что именно здесь происходит?
2 ответов
Я не уверен, есть ли окончательный ответ на это, но для чего это стоит, двойные дефисы появляются в модуль переменных CSS, который определяет пользовательские свойства. Вот пример (в настоящее время работает только в Firefox, что может быть причиной того, почему он работает там в CSS.escape()
):
:root { --color: red; }
p { color: var(--color); }
<p>I am red on Firefox.</p>
см.CanIUse.com для текущего состояния поддержки браузера этой функции:переменные CSS (Пользовательские Свойства).
пока css-синтаксис-3определение идентификаторов, по-видимому, согласуется с определением CSS2.1, он делает ряд ссылок на сами CSS-переменные. Ни одна из этих ссылок, похоже, не касается --
префикс, используемый именами пользовательских свойств.
css-переменные сами по себе говорит:
A свойства - любое свойство, имя которого начинается с двух тире (U + 002D дефис-минус), как
--foo
. The<custom-property-name>
производство соответствует этому: он определяется как любой допустимый идентификатор, который начинается с двух дефисов.
последнее утверждение особенно интересно, потому что единственный способ интерпретировать его, который не противоречит определениям, приведенным в CSS2.1 и css-синтаксис-3 является одним из неопределенностей: "идентификатор, который начинается с двух тире" может либо означать, что два тире не являются частью идентификатора, т. е.:
<custom-property-name> = '-' '-' <ident>
или are, что означает, что пользовательские свойства освобождаются от общего определения идентификатора. Это не помогает, что грамматика для <custom-property-name>
производство нигде не найдено, ни в CSS-синтаксисе, ни в css-переменных, ни в CSSOM; это прозаическое утверждение является единственным доступным определением.
конечно, ничто из этого не объясняет, почему #--
признается действительным Chrome, тем более, что Chrome не имеет рабочая реализация пользовательских свойств.
стандартный
эффективно, изменение синтаксического модуля CSS теперь позволяет идентификаторам начинаться с двух дефисов:
4.3.9. Проверьте, будут ли три кодовые точки запускать идентификатор
посмотрите на первую кодовую точку:
U + 002D ДЕФИС-МИНУС
если вторая кодовая точка является именем-start code point или U + 002D дефис-минус, или второй и третий кодовые действительный побег, вернуть true. В противном случае возвращает false.
, в 21 марта 2014 редакторский проект (изменений), и все еще не присутствует в текущей рекомендации кандидата, которая является 20 февраля 2014 CR.
это также описано в разделе изменения:
11.1. Изменениями от 20 февраля 2014 Рекомендация Кандидата
- измените определение идент-подобных маркеров, чтобы разрешить " -- " запускать идент.
причина
на www-style, the ...Давайте изменим синтаксис thread предложил изменить синтаксис переменные CSS:
- Таб Аткинс Младший предложил изменение синтаксиса пользовательских свойств на " любой идент, начинающийся с / содержащий подчеркивание".
- Крис Эпштайна Расположе не согласен, потому что
_property
является общим IE6 hack. - Брайан Карделл предложил
--
. -
Зак Вайнберг предупредил:
к сожалению, " -- " потребует изменения синтаксиса. Идент не разрешено начинать с двух тире подряд.
был длинный обсуждение того, что следует сделать.
- Таб Аткинс Младший сообщил они решили использовать
--
префикс для указания пользовательских свойств и других пользовательских вещей.
так на следующий день он commited изменение синтаксиса CSS на github (он является редактором спецификации).
реализации
в Firefox
Firefox позволяет идентификаторам начинаться с --
с Nightly 31 2014-04-03 (pushlog). Поведение было изменено в ошибка 985838:
ошибка 985838-изменить
var-
префикс переменных CSS в--
недавно принятые изменения в спецификации переменных CSS:
- префикс пользовательского свойства изменяется на
var-
до--
- внутри
var()
вы используете полный пользовательские имя свойства (т. е. с--
префикс)- пользовательское свойство, состоящее только из префикса
--
разрешено- твенное в парсере CSS теперь позволить такие вещи, как
--
и--0
изменение приземлилось на Firefox 31.0. С тех пор, [id=--]
строительство.
однако, #--
до сих пор не работает даже на последние ночные 41.
Я подал ошибка 1175192 in чтобы исправить это.
хром
хрома причине новый парсер CSS:
теперь мы разрешаем idents начать с
--
он был отправлен в этот коммит, который был частью этот commitlist, который был свернут в этот коммит. Таким образом, он был наконец реализован в build 44.0.2370.0 325166 (pushlog с 325152).
С тех пор Chromium позволяет оба [id=--]
и #--
.