Dlaczego tag <p> nie może zawierać w sobie tagu <div>?


169

O ile wiem, to prawda:

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

Ale to jest złe:

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

Pierwsza z nich może przejść przez walidator W3C (XHTML 1.0), ale druga nie. Wiem, że nikt nie napisze takiego kodu jak ten drugi. Chcę tylko wiedzieć, dlaczego.

A co z relacjami zawierania innych tagów?


9
Ponieważ <p>jest to element blokowy i jest (powinien być) używany do wyświetlania tekstu, nie zezwala na umieszczanie w nim innych elementów blokowych, ale tylko elementy wbudowane, takie jak <span>i <strong>.
— Bojangles

22
JamWaffles: To pjest element blokowy, który nie ma z tym nic wspólnego. divjest również jednym i pozwala na inne bloki.
— Joey,

możliwy duplikat: stackoverflow.com/questions/4967976/… (nieoflagowane): każda przyzwoita odpowiedź na to odpowie, jak czytać specyfikację HTML, a tym samym również na to.
— Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Zadeklarowanie stylu div jako inline również nie działa.
— Triynko

Odpowiedzi:


198

Autorytatywnym miejscem do wyszukiwania dozwolonych relacji zawierania jest specyfikacja HTML. Zobacz na przykład http://www.w3.org/TR/html4/sgml/dtd.html . Określa, które elementy są elementami blokowymi, a które wstawiane. W przypadku tych list wyszukaj sekcję oznaczoną „Modele treści HTML”.

W przypadku elementu P określa to, co następuje, co oznacza, że ​​elementy P mogą zawierać tylko elementy wbudowane.

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

Jest to zgodne z http://www.w3.org/TR/html401/struct/text.html#h-9.3.1 , który mówi, że element P „nie może zawierać elementów blokowych (w tym samego P)”.


74
Mam zwyczaj unikania specyfikacji, najbardziej autorytatywnych dokumentów, jakie mamy, ponieważ nie są one przyjemne w czytaniu. +1 za ich przeczytanie, zrozumienie i używanie ich do odpowiadania na pytania.
— Stoutie

3
Czy to nadal dotyczy HTML 5? Link do specyfikacji odnosi się konkretnie do HTML 4, a HTML 5 nie ma definicji typu dokumentu .
— Ajedi32

2
@ Ajedi32 Tak, tutaj . W HTML5 zmieniono nazwy wielu terminów, ale „Dozwolona zawartość: zawartość fraz” oznacza to samo, co %inlinefragment powyżej. Zobacz także odpowiedź Oriol.
— Pan Lister

@Stoutie Racja z tobą, dlatego istnieje Stack Overflow.
— Captain Hypertext

69

Krótko mówiąc, niemożliwe jest umieszczenie <div>elementu wewnątrz a <p>w DOM, ponieważ otwierający <div>tag automatycznie zamknie <p>element.


2
Ach, to wyjaśnia, dlaczego jest ogromna przestrzeń przed div wewnątrz ap, ponieważ p tak naprawdę kończy się tuż przed div.
— AaronLS

2
Państwo mogą umieścić divelementu Wewnątrz p w DOM , np myP.appendChild(myDiv). Ale parser HTML tego nie zrobi.
— Oriol

1
Nie rób tego. Nie masz pojęcia, jak to zareaguje w przyszłych przeglądarkach. Technologia ciągle się zmienia. Może istnieć dynamiczny parser html, który pewnego dnia unieważni to. Celem tworzenia stron internetowych jest tworzenie rzeczy, które mogą być zarówno pożądane, jak i nieco kompatybilne. Jeśli możesz ominąć to, na co pozwala przeglądarka, można śmiało powiedzieć, że nie możesz zagwarantować, że będzie działać wiecznie. Po prostu użyj facetów z zakresu ... Jeśli potrzebujesz elementu div, przestań używać tagu p.

39

Zgodnie z HTML5, model zawartości z divelementów jest zawartość przepływu

Większość elementów używanych w treści dokumentów i aplikacji jest klasyfikowana jako zawartość przepływu.

Że zawiera pelementy, które mogą być wykorzystane wyłącznie w których zawartość przepływu oczekuje.

Dlatego divelementy mogą zawierać pelementy.


Jednak model zawartości z pelementów jest zawartość frazowania

Zawartość fraz to tekst dokumentu, a także elementy, które zaznaczają ten tekst na poziomie wewnątrz akapitu. Przebiegi frazowania zawartości formularza pkt .

Który nie zawiera divelementów, które mogą być wykorzystane wyłącznie w których zawartość przepływu oczekuje.

Dlatego pelementy nie mogą zawierać divelementów.

Ponieważ znacznik końca z pelementów może być pominięty, gdy pelement jest bezpośrednio za pomocą divelementu (między innymi), Następujący

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

jest analizowany jako

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

a ostatnia </p>to błąd.


Ale jeśli w CSS, jeśli ustawię div jako inline, dlaczego tego nie przestrzega?
— Sanjay,

Ponieważ wartości CSS są stosowane po analizie dom ... nawet jeśli sprawimy, że div as inline in CSSjest to bezużyteczne, ponieważ nowa przeanalizowana struktura jest <p>Text</p> <div>some words</div> <p></p> prawidłowa?
— Sanjay,

@Sanjay Tak, wygląda na to, że masz rację. Co więcej, podczas moich obserwacji, jeśli umieścisz <span> wewnątrz <p>, a następnie ustawisz wyświetlanie span na "blok", zostanie on wyrenderowany jako typowy element blokowy bez takiego efektu.
— Andrii Naumovych

-1

Po X HTML konwencja została zmieniona i teraz jest to mieszanka konwencji XML i HTML, dlatego drugie podejście jest błędne i walidator W3C akceptuje rzeczy poprawne, zgodne ze standardami i konwencjami.


XHTML nie zmienił się zbytnio. Element p nigdy nie mógł zawierać elementu div.
— Quentin

-7

Ponieważ divtag ma wyższy priorytet niż ptag. pTag reprezentuje znacznik akapitu natomiast divtag reprezentuje znacznik dokumentu.

Możesz napisać wiele akapitów w znaczniku dokumentu, ale nie możesz napisać dokumentu w akapicie. To samo, co plik DOC.


2
Właściwie to podział. W przeciwnym razie byłoby <doc>: D
— Kyle,

6
Pierwszeństwo nie jest pojęciem odnoszącym się do elementów html, a div reprezentuje podział, jak mówi @KyleSevenoaks :)
— SimplGy

Co to jest plik DOC? Plik programu Microsoft Word ?
— Peter Mortensen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.