Чи погана ідея DIV всередині TD?


143

Здається, я десь чув / прочитав, що <div>всередині «a <td>-no» немає. Не те, що це не буде працювати, лише щось про них не є дійсно сумісним залежно від типу їх відображення. Не можу знайти жодних доказів, щоб підкріпити свою думку, тому я можу абсолютно помилятися.

Відповіді:


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.
петерчаула

Будь ласка, поділіться з нами, де в DTD це пояснюється. Непростий документ для читання. Дякую!
повторне

1
@redolent: Я відповів правилам DTD до своєї відповіді.
Мартін Ліверсанс

Що з специфікацією HTML5, яка не є XHTML?
розчавити

38

Ні. Не обов'язково.

Якщо вам потрібно розмістити DIV в TD, переконайтеся, що ви правильно використовуєте TD. Якщо ви не переймаєтесь табличними даними та семантикою, то в кінцевому рахунку ви не будете дбати про DIV в TD. Я не думаю, що існує проблема - якщо вам доведеться це зробити, ви все в порядку.

Відповідно до специфікації HTML

А <div>може бути розміщений там, де очікується вміст потоку 1 , що є <td>змістовою моделлю 2 .


2
Я завжди хотів відповісти на питання "так" чи "ні";
Jani Hartikainen

+1 - дуже хотів відповісти чимось дотепніше, але не вдалося.
karim79

Незважаючи на те, що це отримало більше результатів, я вважаю, що Гуффа підніс точку, на яку тут не звертаються (і може бути джерелом моєї
думки

14

Комірка таблиці може законно містити елементи рівня блоку, тому вона, по суті, не є штучною пасом. Звичайно, реалізація браузера залишає це умоглядно-теоретичне положення. Це може спричинити проблеми з компонуванням та помилки.

Хоча таблиці використовувались для компонування, а іноді все ще є, я думаю, що більшість браузерів візуалізуватиме вміст належним чином. Навіть IE.


Я підозрюю, що реалізація браузера - це те, звідки я отримав своє "почекай, це погана ідея".
jcollum

13

Якщо ви хочете використовувати позицію: абсолютна; на діві з position: relative;на td ви зіткнетеся з проблемами. FF, safari та chrome (mac, а не ПК) не будуть розміщувати div відносно td (як би ви очікували), це також стосується divs з, display: table-whatever;тому якщо ви хочете зробити це, вам потрібні два діви, один для контейнер width: 100%; height: 100%;і без кордону, тому він заповнює тд без візуального впливу. а потім абсолютний.

крім цього, чому б просто не розділити клітинку?


6
Єдина практична, не священна відповідь
Ентоні Хетчкінс

2

Я зіткнувся з проблемою, помістивши <div>всередину <td>.

Я не зміг ідентифікувати div, використовуючи, document.getElementById()якщо я розміщую його всередині TD. Але надворі це працювало чудово.


1

Як усі згадували, це може бути не дуже хорошою ідеєю для цілей компонування. Я прийшов до цього питання, тому що мені було цікаво те саме, і мені хотілося знати лише, чи дійсний це код.

Оскільки він дійсний, ви можете використовувати його для інших цілей. Наприклад, те, для чого я буду використовувати це, - це помістити кілька фантазійних "CSSed" дівок у рядки таблиці, а потім скористатися швидкою функцією jQuery, щоб користувач міг сортувати інформацію за ціною, назвою тощо. Таким чином, Тільки таблиця макетів дасть мені "вертикальний порядок", але я буду контролювати ширину, висоту, тло та ін. за допомогою CSS.



-4

Це порушує семантику , ось і все. Це добре працює, але можуть бути читачі екранів або щось на шляху, що не сподобається обробляти ваш HTML, якщо ви "зламаєте семантику".


13
@Greg, чому це порушує семантику? Діл - це просто роздільний рівень або підрозділ вмісту сторінки. Як таке, суттєво і безповоротно антисемантично розміщувати їх у комірці таблиці.
Девід каже повернути Моніку

2
Я намагався написати тобі кілька відповідей, які виправдовували мою відповідь, але я продовжував сходитися до особистої думки. : / Я здогадуюсь, моя найкраща відповідь - це те, що все, що є у вашій комірці, може бути краще представлено іншим тегом HTML. Якщо ви справді ділите свої клітини на компоненти, то, ймовірно, для початку ви не повинні використовувати таблицю, вам слід створити серію DIV для вашого макета. Не впевнений, чому я не можу сказати про це кращими словами ... припустіть це до ІМХО.
Грег

Хм, ти маєш на увазі, що TD - це семантично те саме, що і DIV, тому чому два з них підряд?
jcollum

2
@jcollum: Ні, я б не сказав, що вони семантично однакові. TD, безумовно, клітина в таблиці; це частина відомої структури: таблиця має рядки, рядок має комірки, комірки містять дані. DIV - це лише контейнер ... він може представляти що завгодно будь-де в будь-якому місці документа - ви повинні застосувати до нього стиль, щоб отримати будь-яку семантику з нього за призначенням у розмітці.
Грег

7
DIV є семантично безглуздим, тому я не бачу, як це колись може бути невірним.
Rex M
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.