Вложение ‹p› не будет работать, а вложение ‹div› будет?

Обычно я не буду вкладывать <p> вот так:

<p>The following:
    <p>one</p>
    <p>two</p>
</p>

и я буду вкладывать так, используя вместо этого <div>. Но сегодня я использовал <p>, но кажется, что и Emacs, и Google Chrome считают, что внешний <p> закрыт, как только он увидит, что новый <p> запущен. (DOCTYPE соответствует HTML 4.01 Strict).

Я думал, что <p> - это не более чем <div>, но только с заранее определенными отступами и отступами, но правда ли, что <p> не может быть вложенным? Если да, то какое правило говорит, что нельзя?


person nonopolarity    schedule 18.08.2012    source источник


Ответы (2)


Потому что абзац есть абзац... и именно так определяется HTML (а HTML не XML).

Любой <p> (или другой элемент уровня блока) неявно закроет любой открытый <p>.

Согласно 9.3.1 Абзацы: элемент P спецификации HTML 4.01:

Элемент P представляет абзац. Он не может содержать элементы блочного уровня (включая сам P).


Обратите внимание, что именно так разбирается HTML и что даже символ <div> неявно закрыл бы абзац!

Однако <span> с display:block; не закрывал бы <p>, поскольку <span> не является элементом уровня блока.

То есть CSS нерелевантен на данном этапе обработки HTML, а CSS нерелевантен для DOM/парсера при определении того, является ли элемент блочным или нет. Рассмотрим случай, когда CSS применяется динамически или через еще не загруженную таблицу стилей: примененный CSS не изменяет DOM.


Хотя спецификация HTML5 (рабочий проект) не включает язык, указанный выше в спецификации HTML4, в ней абзац определяется как контейнер для поэтапное содержание и, кроме того, имеет раздел по абзацам.

Принятый ответ на список элементов HTML5, которые могут быть вложенным внутрь элемента P? говорит, что элементы <p> не могут быть вложены в HTML5. Ключевая фраза из документации: «Отрывки фразового контента [который не включает <p> элементов] образуют абзацы». Кроме того, HTML5, пытающийся обеспечить обратную совместимость во многих аспектах, имеет обоснование на "Ограничения на модели контента и значения атрибутов":

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

На это поведение ссылается вики-запись рабочей группы HTML5 о потоковом содержании:

Ограничения HTML5 на вложенность элементов p и на то, что могут содержать элементы p, обусловлены, цитата: «особенностями синтаксического анализатора», которые вызывают автоматическое закрытие p ..

person Community    schedule 18.08.2012

Из раздела 9.3.1 HTML 4.01.

Элемент P представляет абзац. Он не может содержать элементы блочного уровня (включая сам P).

person Antimony    schedule 18.08.2012
comment
так что <p> похож на <div>, но в особом случае? - person nonopolarity; 18.08.2012
comment
Нет, это (p) не div. - person ; 18.08.2012
comment
На самом деле, я думаю, что <div> задуман как более общий элемент для использования с CSS. <p> — наследие старых времен, когда люди форматировали HTML вручную. - person Antimony; 18.08.2012
comment
<p> не является устаревшим, он определяет семантический смысл — неудивительно, что это абзац. Если <p> определяется как legacy, то мы также должны избавиться от элементов <hX> .. в конце концов, они могут быть представлены с помощью <div> .. - person ; 18.08.2012
comment
@pst <p> является блочным элементом, как и <div>, и имеет поля, отступы, границу ... и соответствует стандартной блочной модели ... так что в этих аспектах это не совсем похоже на <div>? - person nonopolarity; 18.08.2012
comment
@pst, то есть вы имеете в виду, что вообще не рассматриваете CSS, а просто смотрите на него чисто семантически, что <div> является общим контейнером, а <p> очень конкретно говорит о абзаце? - person nonopolarity; 18.08.2012
comment
Я говорю, что разбор HTML не связан с CSS. (Я оговорился, поскольку именно является блочным элементом, <p> не может быть вложенным, так как он не может содержать блочные элементы. Но это происходит во время синтаксического анализа; не макет. Например, <span> с display:block не закрыли бы элемент абзаца.) - person ; 18.08.2012
comment
@pst, но я думал, что <div> также является блочным элементом, и этот блочный элемент может быть вложенным - person nonopolarity; 18.08.2012
comment
Пожалуйста, смотрите спецификацию. Очередной раз. Он (P) не может содержать элементы блочного уровня (включая сам P). - person ; 18.08.2012
comment
@pst хорошо, блочный элемент - не единственная причина, по которой <p> не может быть вложенным. Причина в том, что это блочный элемент, а также в том, что <p> не может содержать другой блочный элемент. Эти два объединены как причина, а не только потому, что это блочный элемент - person nonopolarity; 18.08.2012
comment
Единственная причина, по которой <p> не может быть вложенным, заключается в потому что именно так он определен. Ни больше ни меньше. Если этого небольшого предложения не было в спецификации, оно могло быть вложенным... но тогда это не было бы спецификацией HTML 4.01. - person ; 18.08.2012
comment
@pst на самом деле, я чувствую, почему абзац не может содержать блочный элемент? В обычном использовании у нас может быть абзац, и этот абзац может цитировать короткую строку, а затем продолжаться, поэтому эта цитата более логично является частью этого абзаца как единое целое, а не отдельной сущностью за пределами этого абзаца. Но, конечно, если это так, то люди должны проектировать в соответствии с этим правилом. - person nonopolarity; 18.08.2012