Почему тег <p> не может содержать тег <div> внутри?

Насколько я знаю, это правильно

<div>
  <p>some words</p>
</div>

Но это неправильно

<p>
  <div>some words</div>
</p>

Первый может пройти валидатор W3C (XHTML 1.0), а второй - нет. Я знаю, что никто не напишет код, подобный второму. Я просто хочу знать почему.

А как насчет отношения сдерживания других тегов?

Ответ 1

Авторитетным местом для поиска разрешенных сдерживающих отношений является спецификация HTML. См., Например, http://www.w3.org/TR/html4/sgml/dtd.html. Он определяет, какие элементы являются блочными элементами и которые являются встроенными. Для этих списков найдите раздел с надписью "Модели содержимого HTML".

Для элемента P он задает следующее, что указывает на то, что элементам P разрешено содержать только встроенные элементы.

<!ELEMENT P - O (%inline;)*            -- paragraph -->

Это согласуется с http://www.w3.org/TR/html401/struct/text.html#h-9.3.1, в котором говорится, что элемент P "не может содержать элементы уровня блока (включая сам P)".

Ответ 2

Короче говоря, невозможно разместить элемент <div> внутри <p> в DOM, потому что открывающий тег <div> автоматически закроет элемент <p>.

Ответ 3

Согласно HTML5, контентная модель элементов div является потоковым контентом

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

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

Следовательно, элементы div могут содержать p элементов.


Тем не менее, модель содержимого элементов p является Phrasing content

Содержание фразы - это текст документа, а также элементы, которые размечают этот текст на уровне внутри параграфа. Запускает формулировку содержания абзацев формы.

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

Следовательно, p элементы не могут содержать элементы div.

Поскольку конечный тег p элементов может быть опущен, когда за p элементом сразу же следует элемент div (среди прочих), следующее

<p>
  <div>some words</div>
</p>

анализируется как

<p></p>
<div>some words</div>
</p>

и последнее </p> является ошибкой.

Ответ 4

После X HTML условные обозначения были изменены, и теперь это смесь условных обозначений XML и HTML, поэтому второй подход неверен, и валидатор W3C принимает правильные вещи в соответствии со стандартами и соглашениями.

Ответ 5

Поскольку тег div имеет более высокий приоритет, чем тег p. Тег p представляет тег абзаца, тогда как тег div представляет тег документа.

Вы можете написать много абзацев в теге документа, но вы не можете написать документ в абзаце. Так же, как файл DOC.