DIV ใน TD เป็นความคิดที่ไม่ดีหรือไม่?


143

ดูเหมือนว่าฉันได้ยิน / อ่านที่ไหนซักแห่งว่า<div>ภายใน<td>นั้นไม่มีอะไรเลย ไม่ใช่ว่ามันจะไม่ทำงานบางอย่างเกี่ยวกับพวกเขาที่ไม่เข้ากันได้กับประเภทการแสดงผลของพวกเขา ไม่พบหลักฐานใด ๆ ที่จะสำรองลางสังหรณ์ของฉันดังนั้นฉันอาจผิดทั้งหมด

คำตอบ:


144

การใช้divinstide a tdนั้นไม่ได้เลวร้ายไปกว่าวิธีอื่น ๆ ในการใช้ตารางสำหรับการจัดวาง (บางคนไม่เคยใช้ตารางสำหรับการจัดวาง แต่ฉันก็เป็นหนึ่งในนั้น)

หากคุณใช้ a divในtdคุณจะได้รับในสถานการณ์ที่มันอาจจะยากที่จะทำนายว่าองค์ประกอบจะมีขนาด ค่าเริ่มต้นสำหรับ div คือการกำหนดความกว้างจากพาเรนต์และค่าเริ่มต้นสำหรับเซลล์ตารางคือการกำหนดขนาดโดยขึ้นอยู่กับขนาดของเนื้อหา

กฎสำหรับวิธีการdivกำหนดขนาดควรถูกกำหนดไว้อย่างดีในมาตรฐาน แต่กฎสำหรับวิธีการtdกำหนดขนาดควรไม่ได้กำหนดไว้อย่างดีดังนั้นเบราว์เซอร์ที่แตกต่างกันจึงใช้อัลกอริทึมที่แตกต่างกันเล็กน้อย


ฉันสงสัยว่านี่คือที่มาของลางสังหรณ์ ขอบคุณที่ล้างมัน
jcollum

9
หากคอลัมน์ของคุณมีความกว้างที่ระบุไว้ล่วงหน้าก็ไม่น่าจะมีปัญหา ก็อย่าลืมชุดโต๊ะเค้าโครง: คงที่บนโต๊ะเพื่อให้เบราว์เซอร์ไม่ลบล้างความกว้างของคุณ (อาจนำไปสู่ปัญหา)
Jens Roland

6
เขาไม่เคยบอกว่าเขาใช้ตารางสำหรับการจัดหน้า
texelate

@texelate table-layout:fixedCSS ไม่ใช่สิ่งที่คุณคิด จะลดจำนวนเบราว์เซอร์การคำนวณทำเมื่อเรนเดอร์ตารางโดยการคำนวณขนาดของแถวแรกเท่านั้น
SteveB

73

หลังจากตรวจสอบXHTML DTDฉันค้นพบว่า <TD> - องค์ประกอบได้รับอนุญาตให้มีองค์ประกอบของบล็อกเช่นส่วนหัวรายการและยัง <DIV> - องค์ประกอบ ดังนั้นการใช้ <DIV> - องค์ประกอบภายใน <TD> - องค์ประกอบไม่ละเมิดมาตรฐาน XHTML ฉันค่อนข้างแน่ใจว่ารูปแบบที่ทันสมัยอื่น ๆ ของ HTML มีรูปแบบเนื้อหาที่เทียบเท่าสำหรับ <TD> - องค์ประกอบ

นี่คือกฎ DTD ที่เกี่ยวข้อง:

<!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
นี่คือคำตอบเฉพาะที่ฉันต้องการ ขอบคุณมาก ฉันคิดว่าฉันจะนอนหลับได้ดีขึ้นในคืนนี้เล็กน้อย
3Dom

คำตอบเดียวที่ได้รับการสนับสนุนโดย pec
peterchaula

โปรดแบ่งปันกับเราซึ่งใน DTD จะอธิบายสิ่งนี้ ไม่ใช่เอกสารที่อ่านง่าย ขอบคุณ!
redolent

1
@redolent: ฉันเพิ่มกฎ DTD ที่เกี่ยวข้องลงในคำตอบของฉัน
Martin Liversage

แล้ว HTML5 spec ที่ไม่ใช่ XHTML ล่ะ?
บดขยี้

38

ไม่จำเป็น

หากคุณต้องการวาง DIV ภายใน TD ตรวจสอบให้แน่ใจว่าคุณใช้ TD อย่างถูกต้อง หากคุณไม่สนใจข้อมูลตารางและความหมายคุณจะไม่สนใจ DIV ใน TD ฉันไม่คิดว่าจะมีปัญหา - ถ้าคุณต้องทำคุณก็สบายดี

ตามข้อกำหนดของ HTML

<div>สามารถวางที่เนื้อหาไหลคาดว่า1ซึ่งเป็น<td>รูปแบบเนื้อหา2


2
ฉันเคยต้องการที่จะตอบคำถามด้วยใช่หรือไม่ได้;)
จานี่ฮาร์ติไกเนน

+1 - ต้องการตอบด้วยสิ่งที่ฉลาดกว่า แต่ล้มเหลว
karim79

แม้ว่าสิ่งนี้จะมีผู้โหวตมากขึ้นฉันคิดว่า Guffa นำเสนอประเด็นที่ไม่ได้กล่าวถึงที่นี่ (และอาจเป็นแหล่งที่มาของลางสังหรณ์ของฉัน)
jcollum

14

ตารางเซลล์สามารถมีองค์ประกอบระดับบล็อกที่ถูกต้องตามกฎหมายดังนั้นจึงไม่ใช่ faux-pas แน่นอนว่าการฝังเบราว์เซอร์ทำให้ตำแหน่งนี้เป็นการเก็งกำไรทางทฤษฎี มันอาจทำให้เกิดปัญหารูปแบบและข้อบกพร่อง

แม้ว่าเป็นตารางที่ใช้สำหรับเค้าโครง - และบางครั้งก็ยังคงเป็น - ฉันจินตนาการว่าเบราว์เซอร์ส่วนใหญ่จะแสดงเนื้อหาอย่างถูกต้อง แม้แต่ IE


ฉันสงสัยว่าการติดตั้งเบราว์เซอร์เป็นที่ที่ฉันได้รับ "การรอนั่นเป็นความคิดที่ไม่ดี"
jcollum

13

หากคุณต้องการใช้ตำแหน่ง: สัมบูรณ์; ใน div ด้วยposition: relative;บน td คุณจะพบปัญหา FF, ซาฟารีและโครเมี่ยม (mac ไม่ใช่พีซีแม้ว่า) จะไม่วาง div เทียบกับ td (อย่างที่คุณคาดหวัง) นี่ก็เป็นจริงสำหรับ divs ด้วยdisplay: table-whatever;ดังนั้นหากคุณต้องการทำเช่นนั้นคุณต้องมีสอง divs หนึ่งสำหรับ ภาชนะwidth: 100%; height: 100%;และไม่มีขอบจึงเติม td โดยไม่มีผลกระทบต่อภาพใด ๆ แล้วอันที่แน่นอน

นอกเหนือจากนั้นทำไมไม่แยกเซลล์?


6
คำตอบที่ใช้ได้จริงและไม่ใช่คำตอบ
Antony Hatchkins

2

ฉันได้ประสบปัญหาโดยการวางภายใน<div><td>

ฉันไม่สามารถระบุ div ที่ใช้ได้document.getElementById()หากฉันวางไว้ข้างใน td แต่ข้างนอกมันใช้ได้ดี


1

ตามที่ทุกคนพูดถึงมันอาจจะไม่ใช่ความคิดที่ดีสำหรับวัตถุประสงค์ในการจัดวาง ฉันมาถึงคำถามนี้เพราะฉันสงสัยเหมือนกันและฉันแค่อยากจะรู้ว่ามันจะเป็นรหัสที่ถูกต้องหรือไม่

เนื่องจากถูกต้องคุณสามารถใช้เพื่อวัตถุประสงค์อื่น ตัวอย่างเช่นสิ่งที่ฉันจะใช้เพื่อใส่ divs "CSSed" ที่สวยงามในแถวของตารางแล้วใช้ฟังก์ชัน jQuery ด่วนเพื่อให้ผู้ใช้เรียงลำดับข้อมูลตามราคาชื่อ ฯลฯ ด้วยวิธีนี้ ตารางเลย์เอาต์เท่านั้นที่จะให้ฉันคือ "ลำดับแนวตั้ง" แต่ฉันจะควบคุมความกว้างความสูงพื้นหลังและอื่น ๆ ของ div ด้วย CSS



-4

มันแบ่งความหมายนั่นคือทั้งหมดที่ มันใช้งานได้ดี แต่อาจมีโปรแกรมอ่านหน้าจอหรือบางอย่างที่ไม่สนุกกับการประมวลผล HTML ของคุณหากคุณ "หยุดความหมาย"


13
@ เกรปทำไมมันแตกความหมาย? div เป็นเพียงการแบ่งระดับบล็อกหรือส่วนย่อยของเนื้อหาของหน้า เช่นนี้มันไม่ได้ต่อต้านความหมายโดยหลักแล้วและเอาคืนไม่ได้เพื่อวางไว้ในเซลล์ตาราง
David กล่าวว่าคืนสถานะโมนิก้า

2
ฉันพยายามที่จะเขียนคำตอบให้คุณหลายข้อที่ให้เหตุผลกับคำตอบของฉัน แต่ฉันก็ยังลงความเห็นส่วนตัว : / ฉันเดาว่าคำตอบที่ดีที่สุดของฉันคือสิ่งใดก็ตามที่อยู่ในเซลล์ของคุณอาจแสดงได้ดีกว่าด้วยแท็ก HTML อื่น หากคุณแบ่งเซลล์ของคุณออกเป็นส่วนประกอบอย่างแท้จริงคุณอาจไม่ควรใช้ตารางเพื่อเริ่มต้นด้วยคุณควรจัดแต่งชุด DIV สำหรับเค้าโครงของคุณ ไม่แน่ใจว่าทำไมฉันไม่สามารถใส่คำนี้ลงไปในคำที่ดีกว่าได้
เกร็ก

อืมคุณหมายความว่า TD มีความหมายเหมือนกับ DIV หรือไม่ดังนั้นทำไมจึงมีสองอันติดต่อกัน?
jcollum

2
@jcollum: ไม่ฉันจะไม่พูดว่าพวกเขามีความหมายเหมือนกัน TD เป็นเซลล์ในตารางแน่นอน มันเป็นส่วนหนึ่งของโครงสร้างที่รู้จัก: ตารางมีแถว, แถวมีเซลล์, เซลล์มีข้อมูล DIV เป็นเพียงคอนเทนเนอร์ ... มันสามารถแสดงอะไรก็ได้ทุกที่ทุกเวลาในเอกสาร - คุณต้องใช้สไตล์กับมันเพื่อให้ได้ความหมายใด ๆ จากมันในแง่ของวัตถุประสงค์ในมาร์กอัป
เกร็ก

7
DIV ไม่มีความหมายทางความหมายดังนั้นฉันจึงไม่เห็นว่ามันจะผิดพลาดได้อย่างไร
Rex M
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.