Будет ли CSS 3 по-прежнему позволять опустить конечные точки с запятой?

Кажется, что в спецификации уровня 3 модуля синтаксиса CSS происходит нарушение (т. е. обратно несовместимое) предстоящий проект: конечная точка с запятой после последнего объявления в блоке теперь, возможно, требуется.

сравните старую формулировку (W3C рабочий проект 13 августа 2003):

4.8. Наборы правил, блоки объявлений и селекторы
Блок объявления (также называемый {} - блоком в следующем тексте) начинается с левой фигурной фигурная скобка ({) и заканчивается соответствующей правой фигурной скобкой (}). Между ними должен быть список из нуля или более точкамиотделить (;) деклараций.

С Новым (редакторский проект 14 июня 2012):

2. Описание синтаксиса CSS
Правило начинается с селектора (определенного спецификацией селекторов), затем имеет {}-обернутый блок, содержащий последовательность объявлений. Селектор указывает, элементы деклараций будут применяться. Каждое объявление имеет имя свойства, за которым следует двоеточие и значение свойства и закончил с запятой.

(выделено мной).

Так что изящные короткие формы, например:

em { color: lime }

(в настоящее время это указано как допустимый пример в рекомендации уровня 3 модуля цвета CSS) больше не будет проверять?

может ли кто-то более осведомленный о всей коллекции черновиков уровня 3 пожалуйста, проверьте? Для будущих таблиц стилей нам действительно нужно пересмотреть существующие CSS-файлы (и вставить точки с запятой, если они отсутствуют) до завершения спецификации или я что-то неправильно понял?

3 ответов


похоже, что в настоящее время неопределенность в спец.

вы правильно указали, что 2. Раздел описания синтаксиса предписывает заканчивать каждое правило точкой с запятой:

каждое объявление имеет имя свойства, за которым следует двоеточие и значение свойства, и заканчивается точкой с запятой.

и в то же время описание разбора автомата в разделе 3.6.8. Режим объявления значения читает что закрывающая скобка без точки с запятой правильно завершает объявление и текущее правило одновременно:

} маркер

добавьте текущее объявление к значению текущего правила. Извлеките текущее правило из стека открытых правил и добавьте его к значению нового текущего правила. Переключитесь в режим содержимого текущего правила.

Так, по данным 3.6.8 точка с запятой необязательный.

Я не могу сказать о фактическом намерении авторов спецификации. Но нынешнюю ситуацию, вероятно, следует доложить и исправить. Скорее всего, у них нет намерения нарушать совместимость с CSS 2.1 и будет перефразировать их Описание Синтаксис раздел в окончательной версии.


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

на служба проверки W3C говорит, что пример без конечной точки с запятой является допустимым уровнем CSS 3.

однако я, как всегда, закончу каждое объявление точкой с запятой. Это хорошая практика, чтобы вы не забыли разделитель при добавлении дополнительных объявлений.


Это пример проблемы "разделитель-Терминатор". Очевидно, CSS 3 переместился из точки с запятой, являющейся разделителем, в точку с запятой, являющуюся Терминатором. Это означает, что он требуется после каждого элемента, а не только между элементами. Паскаль (разделитель) и C (Терминатор) предоставляют другие примеры. Это приводит к очевидным аномалиям в Паскале, таким как точка с запятой, являющаяся незаконной перед "else" или "until". Почему CSS 3 принял CSS-2-несовместимое правило вне меня, и являются ли реализации будет настаивать на этом-другое дело, но смысл цитаты ясен: это Терминатор и поэтому должен присутствовать на всех записях, включая последнюю.