Являются ли пустоты и пустые элементы одинаковыми?

Я писал HTML с 90-х годов, но я узнал об элементах colgroup и col. Согласно MDN, col является элементом void, а конечный тег запрещен.

Отсутствие тегов: начальный тег является обязательным, но, поскольку он является элементом void, использование концевого тега запрещено.

Я никогда раньше не слышал о элементе пустоты. MDN не имеет страницы на элементах void, но страница с пустыми элементами говорит:

Примечание. В очень редких случаях пустые элементы называются пустыми элементы. Это неправильное имя, и его следует избегать.

Однако спецификация W3 относится только к элементам void и никогда не упоминает пустые элементы:

Элемент void - это элемент, модель контента которого никогда не позволяет ему есть содержание при любых обстоятельствах. Элементы Void могут иметь атрибуты.

Итак, мне интересно:

  • Если это то же самое, должны ли они упоминаться как пустые элементы и никогда не быть пустыми элементами? В этом случае спецификация W3 устарела и не заслуживает доверия? Или должна ли иметь спецификацию W3, даже если она устарела?
  • Если это не одно и то же, синтаксис <col span="2" /> или должен быть <col span="2"> (без косой черты), потому что конечный тег запрещен? Возможно, у меня неправильная идея "конечного тега", но я всегда думал о том, что /> (как в <br /> и <img />) является конечным тегом.

Ответы

Ответ 1

Термин "пустой элемент" относится к SGML, на котором основывались стандарты HTML до HTML5, и где ключевое слово EMPTY используется для представления элементов с пустой моделью содержимого. Здесь, что HTML 4 spec говорит:

Разрешенный контент для элемента называется его моделью содержимого. Типы элементов, которые не имеют содержимого, называются пустыми элементами. Модель контента для таких типов элементов объявляется с использованием ключевого слова "EMPTY" .

С примером объявления для элемента img:

В этом примере показано объявление пустого типа элемента:

<!ELEMENT IMG - O EMPTY>
  • Объявленный тип элемента IMG.
  • Дефис и следующее "O" указывают, что конечный тег можно опустить, но вместе с моделью контента "EMPTY" это укрепится до правила, в котором конечный тег должен быть опущен.
  • Ключевое слово "EMPTY" означает, что экземпляры этого типа не должны иметь контент.

XML определяет "пустой элемент" совершенно иначе:

[Определение: элемент без содержимого называется пустой.]

Разница здесь в том, что XML не говорит, что "пустой элемент" - это "элемент, модель контента которого пуста". Вместо этого он просто говорит, что "пустой элемент" - это тот, у которого нет содержимого. Это независимо от того, определяет ли тип документа или схему XML конкретный элемент без необходимости по необходимости; Сам XML сам по себе не устанавливает таких ограничений.

Дополнительный термин "тег с пустыми элементами" используется для описания синтаксиса ярлыков />, обычно используемого для указания пустых элементов (опять же, независимо от того, являются ли они пустыми по определению). Это также обычно называют "самозакрывающимся" синтаксисом.

Термин "элемент void" является новым для HTML5. Он имеет то же определение, что и пред-HTML5-определение "пустой элемент" : элемент, который имеет только тег начала, без конечного тега и не может иметь никакого содержимого. Хотя спецификация W3C HTML5 не ссылается на термин "пустой элемент" , термин "тег с пустыми элементами", как описано в XML, используется в связанном документе:

В синтаксисе HTML элементы void являются элементами, которые всегда пусты и никогда не имеют концевого тега. Все элементы, перечисленные как void в спецификации HTML или в спецификации расширения, MUST в разметке polyglot имеют синтаксическую форму XML тег (<foo/>). Другие элементы НЕ ДОЛЖНЫ использовать синтаксис тега XML-элемента XML.

Кажется, что современные стандарты HTML теперь предпочитают определение XML и избегают прежнего определения. Это кажется подходящим, потому что современный HTML больше не является SGML-приложением, а сам язык разметки. (Это тоже не XML, а то, где вступает в действие разметка полиглота.)

Итак, суммируем:

  • пустой элемент - это тот, у которого нет содержимого, независимо от того, разрешено ли ему иметь контент в первую очередь.
  • Элемент void - это тот, который не может иметь никакого содержимого.

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

Отвечая на ваши вопросы:

  • Если это одно и то же, следует ли их называть пустыми элементами и никогда не быть пустыми элементами? В этом случае спецификация W3 устарела и не заслуживает доверия? Или следует ли иметь спецификацию W3, даже если она устарела?

    Элементы, такие как area, br, col и img, более точно обозначаются как элементы void, как в HTML5. Они также считаются пустыми, но только потому, что они не могут быть "непустыми".

    Я понятия не имею, почему в MDN есть статья, в которой говорится: "[Void elements]] является неправильным именем и его следует избегать". когда он использует имя в большинстве своих ссылок HTML в любом случае. Я не вижу причин не доверять официальным спецификациям.

  • Если это не одно и то же, синтаксис <col span="2" /> или должен быть <col span="2"> (без косой черты), потому что конечный тег запрещен? Возможно, у меня неправильная идея "конечного тега", но я всегда думал о том, что /> (как в <br /> и <img />) является конечным тегом.

    <col span="2" /> - это только допустимый синтаксис, потому что HTML5 признает его популярным способом маркировки элементов void благодаря XHTML, и, чтобы запретить его, бесполезно нарушить совместимость проверки со многими документами XHTML, которые в противном случае проверялись бы как HTML5. Сам HTML5 определяет /> как бессмысленный (с одним конкретным исключением, который здесь не имеет особого значения), поэтому на самом деле <col span="2" /> в HTML5 просто представляет a col с просто начальный тег и конечный тег, поэтому он идентичен <col span="2">, хотя XML-friendly.

Ответ 2

То, что вы цитируете как "спецификация W3", является не авторитетной ссылкой. Рекомендация W3C HTML 4.01 относится к пустым элементам как к элементам с EMPTY объявленным содержимым, то есть к элементам, которые не могут иметь никакого содержимого. Он вообще не использует фразу "void element".

В проектах HTML5 элементы, которые являются элементами emppty в HTML 4.01, имеют "пустую" модель контента, но на самом деле не определяют такую ​​модель. Вместо этого он упоминает элементы void и говорит, что они "не могут иметь никакого содержимого".

Итак, путаница в черновиках HTML5. Независимо от этого важно различать пустые/недействительные элементы, которые не могут (по спецификациям и действующим правилам синтаксического анализа) когда-либо иметь какой-либо контент и элементы, которые просто имеют пустой контент, например пустые элементы <p> плохая практика) и пустые элементы <td> (обычно это плохая практика, но действительная и иногда адекватная).