Ответ 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 просто представляет acol
с просто начальный тег и конечный тег, поэтому он идентичен<col span="2">
, хотя XML-friendly.