Почему тег<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.