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

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

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

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

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

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

6 ответов

Решение

Авторитетным местом для поиска разрешенных защитных отношений является спецификация 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, в которой говорится, что элемент P "не может содержать элементы уровня блока (включая сам P)".

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

Согласно HTML5, модель контента div элементы содержимого потока

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

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

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


Тем не менее, модель содержания p элементы фразового содержания

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

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

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

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

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

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

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

и последнее </p> это ошибка.

Посмотрите на этот пример из спецификации HTML

      <!-- Example of data from the client database: -->
<!-- Name: Stephane Boyera, Tel: (212) 555-1212, Email: sb@foo.org -->

<DIV id="client-boyera" class="client">
<P><SPAN class="client-title">Client information:</SPAN>
<TABLE class="client-data">
<TR><TH>Last name:<TD>Boyera</TR>
<TR><TH>First name:<TD>Stephane</TR>
<TR><TH>Tel:<TD>(212) 555-1212</TR>
<TR><TH>Email:<TD>sb@foo.org</TR>
</TABLE>
</DIV>

Вы что-то заметили? : Отсутствовал закрывающий тег элемента. ошибка в характеристиках? нет .

Совет № 1: закрывающий тег НЕОБЯЗАТЕЛЬНО

Вы можете спросить : Но как тогда элемент узнает, где остановиться?

Из w3docs:

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

Проще говоря : a — это блочный элемент, и его открывающий тег приведет к закрытию родителя, поэтому он никогда не может быть вложен внутрь.

НО как насчет обратной ситуации? вы можете спросить

хорошо ...

Совет № 2: Закрывающий тег элемента ОБЯЗАТЕЛЬНО

Согласно Карманному справочнику O'Reilly HTML и XHTML, четвертое издание (стр. 50)

<div> . . . </div>Начальные/конечные теги Обязательный/Обязательный

Это<div>конец элемента будет определяться только его закрывающим тегом</div>следовательно<p>элемент внутри НЕ сломает его.

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

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

Другие вопросы по тегам