Tại sao thẻ <p> không thể chứa thẻ <div> bên trong thẻ?


169

Theo tôi biết, điều này đúng:

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

Nhưng điều này là sai:

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

Cái đầu tiên có thể vượt qua trình xác nhận W3C (XHTML 1.0), nhưng cái thứ hai thì không thể. Tôi biết rằng không ai sẽ viết mã như cái thứ hai. Tôi chỉ muốn biết tại sao.

Và những gì về mối quan hệ ngăn chặn của các thẻ khác?


9
Bởi vì <p>là một thành phần cấp độ khối và (được cho là) ​​được sử dụng để hiển thị văn bản, nó sẽ không cho phép các thành phần cấp độ khối khác bên trong nó, mà chỉ các yếu tố nội tuyến như <span><strong>.
Bojangles

22
JamWaffles: Đó plà một yếu tố cấp khối không có gì để làm với nó. divcũng là một và cho phép các khối khác.
Joey

bản sao có thể có của: stackoverflow.com/questions/4967976/, (không có câu trả lời): bất kỳ câu trả lời phù hợp nào sẽ trả lời cách đọc thông số HTML và do đó cũng trả lời câu hỏi này.
Ciro Santilli 郝海东 冠状 病 事件

Tuyên bố phong cách của div là nội tuyến cũng không hoạt động.
Triynko

Câu trả lời:


198

Một nơi có thẩm quyền để tìm kiếm các mối quan hệ ngăn chặn được phép là đặc tả HTML. Xem, ví dụ: http://www.w3.org/TR/html4/sgml/dtd.html . Nó chỉ định phần tử nào là phần tử khối và phần tử nào là nội tuyến. Đối với những danh sách đó, tìm kiếm phần được đánh dấu "mô hình nội dung HTML".

Đối với phần tử P, nó chỉ định các phần sau, cho biết các phần tử P chỉ được phép chứa các phần tử nội tuyến.

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

Điều này phù hợp với http://www.w3.org/TR/html401/struct/text.html#h-9.3.1 , nói rằng phần tử P "không thể chứa các phần tử cấp khối (bao gồm cả chính P)."


74
Tôi có thói quen tránh các thông số kỹ thuật, các tài liệu có thẩm quyền nhất mà chúng tôi có cho những thứ như thế này, vì chúng không thú vị để đọc. +1 để thực sự đọc chúng, hiểu chúng và sử dụng chúng để trả lời các câu hỏi.
Stoutie

3
Điều này có còn hợp lệ cho HTML 5 không? Thông số kỹ thuật được liên kết cụ thể tham chiếu HTML 4 và HTML 5 không có định nghĩa loại tài liệu .
Ajedi32

2
@ Ajedi32 Vâng, đây . HTML5 đã đổi tên rất nhiều thuật ngữ, nhưng "Nội dung được phép: nội dung cụm từ" có nghĩa giống như %inlinebit ở trên. Xem thêm câu trả lời của Oriol.
Ông Lister

@Stoutie Đúng với ya, đó là lý do Stack Overflow tồn tại.
Thuyền trưởng Hypertext

69

Nói tóm lại, không thể đặt một <div>phần tử bên trong một <p>DOM vì <div>thẻ mở sẽ tự động đóng <p>phần tử.


2
Ah, điều này giải thích tại sao có một không gian rộng lớn trước một div bên trong ap, bởi vì p thực sự kết thúc ngay trước div.
AaronLS

2
Bạn có thể đặt một divphần tử bên trong a p trong DOM , vd myP.appendChild(myDiv). Nhưng một trình phân tích cú pháp HTML sẽ không làm điều đó.
Oriol

1
Đừng làm vậy. Bạn không biết làm thế nào điều đó sẽ đáp ứng trong các trình duyệt trong tương lai. Công nghệ đang thay đổi liên tục. Có thể có một trình phân tích cú pháp html động sẽ làm cho một ngày không hợp lệ. Mục tiêu trong web dev là tạo ra những thứ có khả năng vừa mong muốn vừa có phần tương thích. Nếu bạn có thể bỏ qua những gì trình duyệt cho phép, có thể nói rằng bạn không thể đảm bảo rằng nó sẽ hoạt động mãi mãi. Chỉ cần sử dụng một span span ... Nếu bạn cần một div, hãy ngừng sử dụng thẻ p.

39

Theo HTML5, mô hình nội dung của divcác yếu tố là nội dung dòng chảy

Hầu hết các yếu tố được sử dụng trong phần thân của tài liệu và ứng dụng được phân loại là nội dung luồng.

Điều đó bao gồm pcác yếu tố, chỉ có thể được sử dụng ở nơi dự kiến nội dung dòng chảy .

Do đó, divcác yếu tố có thể chứa pcác yếu tố.


Tuy nhiên, mô hình nội dung của pcác yếu tố là nội dung Phrasing

Nội dung cụm từ là văn bản của tài liệu, cũng như các yếu tố đánh dấu văn bản đó ở cấp độ nội đoạn. Chạy các đoạn nội dung cụm từ .

Điều đó không bao gồm divcác yếu tố, chỉ có thể được sử dụng ở nơi dự kiến nội dung dòng chảy .

Do đó, pcác phần tử không thể chứa divcác phần tử.

thẻ kết thúc của pcác phần tử có thể được bỏ qua khi pphần tử ngay lập tức được theo sau bởi một divphần tử (trong số các phần tử khác), nên sau đây

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

được phân tích thành

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

và cuối cùng </p>là một lỗi.


Nhưng nếu trong CSS nếu tôi đặt div là nội tuyến thì tại sao nó không tôn trọng điều đó?
Sanjay

Vì các giá trị CSS được áp dụng sau khi phân tích cú pháp dom ... ngay cả khi chúng tôi div as inline in CSSkhông sử dụng, vì cấu trúc phân tích cú pháp mới <p>Text</p> <div>some words</div> <p></p> là sự hiểu biết của tôi có đúng không?
Sanjay

@Sanjay Vâng, có vẻ như bạn đúng. Và hơn nữa, trong các quan sát của tôi, nếu bạn đặt <span> bên trong <p> và sau đó đặt hiển thị của span thành "chặn", nó sẽ được hiển thị dưới dạng phần tử khối điển hình mà không có hiệu ứng như vậy.
Andrii Naumovych

-1

Sau X HTML, các quy ước đã được thay đổi và bây giờ nó là hỗn hợp các quy ước của XML và HTML, vì vậy đó là lý do tại sao cách tiếp cận thứ hai sai và trình xác nhận W3C chấp nhận những điều đúng theo các tiêu chuẩn và quy ước.


XHTML không thay đổi nhiều. Phần tử p chưa bao giờ được phép chứa phần tử div.
Quentin

-7

Bởi vì divthẻ có quyền ưu tiên cao hơn pthẻ. Các pthẻ đại diện cho một thẻ đoạn trong khi divthẻ đại diện cho một thẻ tài liệu.

Bạn có thể viết nhiều đoạn trong thẻ tài liệu, nhưng bạn không thể viết tài liệu trong một đoạn. Giống như một tệp DOC.


2
Trên thực tế, đó là sự phân chia. Nếu không thì sẽ là <doc>: D
Kyle

6
Ưu tiên không phải là một khái niệm áp dụng cho các phần tử html và div đại diện cho một bộ phận, như @KyleSevenoaks nói :)
SimplGy

Tệp DOC là gì? Một tập tin Microsoft Word ?
Peter Mortensen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.