Là một DIV trong TD là một ý tưởng tồi?


143

Có vẻ như tôi đã nghe / đọc ở đâu đó rằng <div>bên trong của một <td>là không. Không phải là nó không hoạt động, chỉ là một cái gì đó về chúng không thực sự tương thích dựa trên loại màn hình của chúng. Không thể tìm thấy bất kỳ bằng chứng nào để sao lưu linh cảm của tôi, vì vậy tôi có thể hoàn toàn sai.

Câu trả lời:


144

Sử dụng một divinstide a tdkhông tệ hơn bất kỳ cách sử dụng bảng nào khác để bố trí. (Một số người không bao giờ sử dụng bảng để bố trí và tôi tình cờ là một trong số họ.)

Nếu bạn sử dụng một divtrong tdbạn sẽ tuy nhiên nhận được trong một tình huống mà nó có thể là khó dự đoán như thế nào các yếu tố sẽ được kích thước. Mặc định cho div là để xác định chiều rộng của nó từ cha của nó và mặc định cho một ô của bảng là để xác định kích thước của nó tùy thuộc vào kích thước của nội dung của nó.

Các quy tắc về cách divkích thước nên được xác định rõ trong các tiêu chuẩn, nhưng các quy tắc về cách tdkích thước nên không được xác định rõ, do đó các trình duyệt khác nhau sử dụng các thuật toán hơi khác nhau.


Tôi nghi ngờ đây là nơi linh cảm của tôi đến từ. Cảm ơn đã xóa nó lên.
jcollum

9
Nếu các cột của bạn có chiều rộng được chỉ định trước, thì đó không phải là vấn đề. Chỉ cần nhớ đặt bố cục bảng: cố định trên bảng để trình duyệt không ghi đè chiều rộng của bạn (có thể dẫn đến sự cố)
Jens Roland

6
Anh ấy không bao giờ nói rằng anh ấy đang sử dụng bàn để bố trí.
texelate

@texelate table-layout:fixedCSS không như bạn nghĩ. Nó giảm số lượng trình duyệt tính toán thực hiện khi kết xuất bảng bằng cách chỉ tính kích thước của hàng đầu tiên.
SteveB

73

Sau khi kiểm tra XHTML DTD, tôi phát hiện ra rằng một phần mềm <TD> được phép chứa các thành phần khối như tiêu đề, danh sách và cả các phần tử <DIV>. Do đó, sử dụng phân vùng <DIV> bên trong phân vùng <TD> không vi phạm tiêu chuẩn XHTML. Tôi khá chắc chắn rằng các biến thể hiện đại khác của HTML có mô hình nội dung tương đương cho phân tầng <TD>.

Dưới đây là các quy tắc DTD có liên quan:

<!ELEMENT td %Flow;>
<!-- %Flow; mixes block and inline and is used for list items etc. -->
<!ENTITY %Flow "(#PCDATA | %block; | form | %inline; | %misc;>
<!ENTITY %block "p | %heading; | div | %lists; | %blocktext; | fieldset | table">

1
Đây là câu trả lời cụ thể mà tôi đang tìm kiếm. Vì vậy, cảm ơn bạn vui lòng. Tôi tưởng tượng tối nay tôi sẽ ngủ ngon hơn một chút.
3Dom

Câu trả lời duy nhất được hỗ trợ bởi pec.
peterchaula

Hãy chia sẻ với chúng tôi nơi DTD giải thích điều này. Nó không phải là một tài liệu dễ đọc. Cảm ơn!
hương thơm

1
@redolent: Tôi đã thêm các quy tắc DTD có liên quan vào câu trả lời của mình.
Martin Liversage

Điều gì về thông số HTML5 không phải là XHTML?
nghiền nát

38

Không nhất thiết.

Nếu bạn cần đặt DIV trong TD, hãy chắc chắn rằng bạn đang sử dụng TD đúng cách. Nếu bạn không quan tâm đến dữ liệu dạng bảng và ngữ nghĩa, thì cuối cùng bạn sẽ không quan tâm đến DIV trong TD. Tôi không nghĩ rằng có một vấn đề mặc dù - nếu bạn phải làm điều đó, bạn ổn.

Theo đặc tả kỹ thuật HTML

A <div>có thể được đặt trong đó nội dung luồng được mong đợi 1 , đó là <td>mô hình nội dung 2 .


2
Tôi đã luôn muốn trả lời một câu hỏi bằng cách có hoặc không;)
Jani Hartikainen

+1 - thực sự muốn trả lời với một cái gì đó khôn ngoan hơn, nhưng không thành công.
karim79

Mặc dù điều này nhận được nhiều sự ủng hộ hơn nhưng tôi nghĩ rằng Guffa đã đưa ra một điểm không được đề cập ở đây (và có thể là nguồn gốc của linh cảm của tôi)
jcollum

14

Một ô bảng có thể chứa các phần tử mức khối một cách hợp pháp, do đó, về bản chất nó không phải là giả. Tất nhiên, hàm ý trình duyệt để lại vị trí lý thuyết đầu cơ này. Nó có thể gây ra vấn đề bố trí và lỗi.

Mặc dù các bảng được sử dụng để bố trí - và đôi khi vẫn vậy- Tôi tưởng tượng rằng hầu hết các trình duyệt sẽ hiển thị nội dung chính xác. Ngay cả IE.


Tôi nghi ngờ việc thực hiện trình duyệt là nơi tôi nhận được "chờ đợi, đó là một ý tưởng tồi".
jcollum

13

Nếu bạn muốn sử dụng vị trí: tuyệt đối; trên div với position: relative;trên td bạn sẽ gặp vấn đề. FF, safari và chrome (mac, không phải PC) sẽ không định vị div tương đối với td (như bạn mong đợi) điều này cũng đúng với div display: table-whatever;vì vậy nếu bạn muốn làm điều đó thì bạn cần hai div, một cho container width: 100%; height: 100%;và không có đường viền để nó lấp đầy td mà không có bất kỳ tác động trực quan nào. và sau đó là một trong những tuyệt đối.

khác hơn tại sao không chỉ phân chia tế bào?


6
Câu trả lời thực tế duy nhất, không phải là thánh chiến
Antony Hatchkins

2

Tôi đã phải đối mặt với vấn đề bằng cách đặt một <div>bên trong <td>.

Tôi không thể xác định div sử dụng document.getElementById()nếu tôi đặt nó bên trong td. Nhưng bên ngoài, nó đã hoạt động tốt.


1

Như mọi người đã đề cập, nó có thể không phải là một ý tưởng tốt cho mục đích bố trí. Tôi đã đến câu hỏi này bởi vì tôi đã tự hỏi tương tự và tôi chỉ muốn biết nếu nó sẽ là mã hợp lệ.

Vì nó hợp lệ, bạn có thể sử dụng nó cho các mục đích khác. Ví dụ, những gì tôi sẽ sử dụng nó là đặt một số div "CSSed" ưa thích bên trong các hàng của bảng và sau đó sử dụng hàm jQuery nhanh để cho phép người dùng sắp xếp thông tin theo giá, tên, v.v. Cách này, chỉ bảng bố cục sẽ cho tôi là "thứ tự dọc", nhưng tôi sẽ kiểm soát chiều rộng, chiều cao, nền, v.v. của div bằng CSS.



-4

Nó phá vỡ ngữ nghĩa , đó là tất cả. Nó hoạt động tốt, nhưng có thể có trình đọc màn hình hoặc thứ gì đó không được xử lý HTML của bạn nếu bạn "phá vỡ ngữ nghĩa".


13
@Greg, tại sao nó phá vỡ ngữ nghĩa? Một div chỉ đơn giản là một phân chia cấp khối hoặc phân chia phụ của nội dung trang. Như vậy, về cơ bản và không thể hủy bỏ ngữ nghĩa để đặt chúng trong một ô của bảng.
David nói phục hồi Monica

2
Tôi đã cố gắng viết một số câu trả lời cho bạn để biện minh cho câu trả lời của tôi, nhưng tôi tiếp tục đưa ra ý kiến ​​cá nhân. : / Tôi đoán phản hồi tốt nhất của tôi sẽ là bất cứ điều gì trong tế bào của bạn có thể được thể hiện tốt hơn bằng một thẻ HTML khác. Nếu bạn thực sự chia các ô của mình thành các thành phần, thì có lẽ bạn không nên sử dụng bảng để bắt đầu, bạn nên tạo kiểu cho một loạt DIV cho bố cục của mình. Không chắc tại sao tôi không thể nói điều này thành những từ tốt hơn ... tôi cho rằng đó là IMHO.
Greg

Hmm, bạn có nghĩa là một TD về mặt ngữ nghĩa giống như một DIV vậy tại sao có hai trong số chúng liên tiếp?
jcollum

2
@jcollum: Không, tôi sẽ không nói họ giống nhau về mặt ngữ nghĩa. TD chắc chắn là một tế bào trong một bảng; đó là một phần của cấu trúc đã biết: bảng có hàng, hàng có ô, ô chứa dữ liệu. DIV chỉ là một thùng chứa ... nó có thể đại diện cho mọi thứ mọi lúc mọi nơi trong tài liệu - bạn phải áp dụng phong cách cho nó để có được bất kỳ ngữ nghĩa nào từ nó về mặt mục đích trong đánh dấu.
Greg

7
Một DIV là vô nghĩa về mặt ngữ nghĩa, vì vậy tôi không thấy nó có thể không chính xác như thế nào.
Rex M
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.