Является ли DIV внутри TD плохой идеей?

Кажется, я где-то слышал/читал, что <div> внутри <td> было нет-нет. Не то чтобы это не сработало, просто что-то в том, что они не совсем совместимы из-за типа дисплея. Не могу найти никаких доказательств, подтверждающих мою догадку, так что я могу быть совершенно неправ.


person jcollum    schedule 10.07.2009    source источник


Ответы (9)


Использование div внутри td ничем не хуже любого другого способа использования таблиц для компоновки. (Однако некоторые люди никогда не используют таблицы для компоновки, и я оказался одним из них.)

Если вы используете div в td, вы, тем не менее, попадете в ситуацию, когда может быть трудно предсказать размер элементов. По умолчанию для div определяется его ширина по его родительскому элементу, а по умолчанию для ячейки таблицы определяется ее размер в зависимости от размера ее содержимого.

Правила определения размера div четко определены в стандартах, но правила определения размера td не так четко определены, поэтому разные браузеры используют немного разные алгоритмы.

person Guffa    schedule 10.07.2009
comment
Подозреваю, что отсюда и пошла моя догадка. Спасибо за прояснение. - person jcollum; 13.07.2009
comment
Если ваши столбцы имеют заранее заданную ширину, это не должно быть проблемой. Просто не забудьте установить table-layout:fixed для таблицы, чтобы браузеры не переопределяли вашу ширину (что может привести к проблемам) - person Jens Roland; 29.02.2012
comment
Он никогда не говорил, что использует таблицы для макетов. - person texelate; 21.04.2016
comment
@texelate table-layout:fixed CSS — это не то, что вы думаете. Это уменьшает количество вычислений, которые браузеры выполняют при отображении таблиц, вычисляя только размер первой строки. - person SteveB; 30.09.2016

После проверки 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">
person Martin Liversage    schedule 10.07.2009
comment
Это конкретный ответ, который я искал. Так что спасибо большое. Думаю, сегодня я буду спать немного лучше. - person 3Dom; 14.02.2017
comment
Единственный ответ, подкрепленный pec. - person peterchaula; 13.05.2017
comment
Пожалуйста, поделитесь с нами, где в DTD это объясняется. Это не простой документ для чтения. Спасибо! - person redolent; 13.12.2017
comment
@redolent: я добавил в свой ответ соответствующие правила DTD. - person Martin Liversage; 13.12.2017
comment
Как насчет спецификации HTML5, которая не является XHTML? - person crush; 26.01.2019

Нет. Не обязательно.

Если вам нужно поместить DIV в TD, убедитесь, что вы правильно используете TD. Если вас не волнуют табличные данные и семантика, то в конечном итоге вам не будут интересны DIV в TD. Я не думаю, что это проблема — если вам должно это сделать, все в порядке.

Согласно спецификации HTML

<div> можно разместить там, где ожидается потоковое содержимое1, которая представляет собой <td> модель контента2.

person Sampson    schedule 10.07.2009
comment
Я всегда хотел ответить на вопрос да или нет ;) - person Jani Hartikainen; 10.07.2009
comment
+1 - очень хотел ответить поострее, но не получилось. - person karim79; 10.07.2009
comment
Несмотря на то, что это получило больше голосов, я думаю, что Гуффа поднял вопрос, который здесь не рассматривается (и может быть источником моей догадки) - person jcollum; 13.07.2009

Ячейка таблицы может законно содержать элементы блочного уровня, поэтому по своей сути это не бестактность. Внедрение браузера, конечно, оставляет это спекулятивно-теоретическое положение. Это может вызвать проблемы с макетом и ошибки.

Хотя таблицы использовались для макета, а иногда и используются до сих пор, я полагаю, что большинство браузеров будут правильно отображать содержимое. Даже ИЕ.

person David says reinstate Monica    schedule 10.07.2009
comment
Я подозреваю, что реализация браузера - это то, откуда я получил свое ожидание, это плохая идея. - person jcollum; 10.07.2009

Если вы хотите использовать position: absolute; в div с position: relative; на td вы столкнетесь с проблемами. FF, Safari и Chrome (хотя Mac, а не ПК) не будут позиционировать div относительно td (как и следовало ожидать), это также верно для div с display: table-whatever;, поэтому, если вы хотите сделать это, вам нужно два div, один для контейнер width: 100%; height: 100%; и без границы, поэтому он заполняет td без какого-либо визуального воздействия. а потом абсолютный.

кроме этого, почему бы просто не разделить ячейку?

person zeel    schedule 25.05.2011
comment
Единственный практичный, не холиварный ответ - person Antony Hatchkins; 17.01.2012

Я столкнулся с проблемой, поместив <div> внутри <td>.

Мне не удалось идентифицировать div с помощью document.getElementById(), если я поместил его внутрь td. Но снаружи все работало нормально.

person Himaja    schedule 12.07.2011

Как уже упоминалось, это может быть не очень хорошей идеей для целей макета. Я пришел к этому вопросу, потому что мне было интересно то же самое, и я только хотел знать, будет ли это действительным кодом.

Поскольку он действителен, вы можете использовать его для других целей. Например, я собираюсь использовать его для того, чтобы поместить несколько причудливых «CSS-элементов» внутри строк таблицы, а затем использовать быструю функцию jQuery, чтобы позволить пользователю сортировать информацию по цене, имени и т. д. Таким образом, только таблица макетов даст мне «вертикальный порядок», но я буду контролировать ширину, высоту, фон и т. д. div с помощью CSS.

person Juan Ignacio    schedule 07.07.2011

Два способа справиться с этим

  1. поместите div внутри тега tbody
  2. поместите div внутри тега tr

Оба подхода действительны, если вы видите ссылку: https://stackoverflow.com/a/23440419/2305243

person Alan Dong    schedule 03.11.2016

Это нарушает семантику, вот и все. Он отлично работает, но могут быть программы чтения с экрана или что-то еще, что не понравится обрабатывать ваш HTML, если вы «нарушите семантику».

person Greg    schedule 10.07.2009
comment
@ Грег, почему это нарушает семантику? Div — это просто блочное разделение или подразделение содержимого страницы. Таким образом, размещение их в ячейке таблицы не является по существу и бесповоротно антисемантическим. - person David says reinstate Monica; 10.07.2009
comment
Я пытался написать Вам несколько ответов, обосновывающих мой ответ, но все время сводился к личному мнению. :/ Я думаю, что мой лучший ответ будет заключаться в том, что все, что находится в вашей ячейке, вероятно, может быть лучше представлено другим тегом HTML. Если вы действительно делите свои ячейки на компоненты, то вам, вероятно, не следует использовать таблицу для начала, вы должны стилизовать серию DIV для своего макета. Не уверен, почему я не могу выразить это словами получше... думаю, списать это на ИМХО. - person Greg; 10.07.2009
comment
Хм, вы имеете в виду, что TD семантически то же самое, что и DIV, так зачем их два подряд? - person jcollum; 10.07.2009
comment
Да, я не совсем согласен с тем, что элементы <div> вообще предлагают или изменяют какую-либо семантическую информацию. Они несут примерно ту же смысловую информацию, что и пустое место, только в другом направлении. - person SingleNegationElimination; 10.07.2009
comment
@Грег; Я полностью согласен с вашим мнением, оно кажется неправильным. А также я согласен, если в ячейке таблицы требуются подразделения, то содержимое, вероятно, представлено ненадлежащим образом. Но это по-прежнему не является по своей сути технически, этически или семантически неверным. Я знаю, что буду чувствовать себя грязным... =] - person David says reinstate Monica; 10.07.2009
comment
@jcollum: Нет, я бы не сказал, что они семантически одинаковы. TD определенно является ячейкой таблицы; это часть известной структуры: в таблице есть строки, в строке есть ячейки, ячейки содержат данные. DIV - это просто контейнер ... он может представлять что угодно в любое время в любом месте документа - вы должны применить к нему стиль, чтобы получить от него какую-либо семантику с точки зрения цели в разметке. - person Greg; 10.07.2009
comment
DIV семантически бессмысленен, поэтому я не понимаю, как он может быть неправильным. - person Rex M; 10.07.2009
comment
Вы не найдете здесь никого более рьяного просемантика, чем я, и div внутри td абсолютно не нарушает никакой семантики, особенно если учесть, что семантическое значение div — это лишь логическое разделение. Это может быть совершенно избыточным раздуванием тегов в конкретном случае, но это нормально в абстрактном плане. - person annakata; 10.07.2009
comment
Я чувствую, что если вы используете DIV для разделения содержимого в ячейке таблицы, то вам следует использовать дополнительные ячейки таблицы. Думайте об этом как о базе данных — каждая ячейка должна иметь один фрагмент данных. - person DisgruntledGoat; 13.07.2009
comment
Например... скажем (как в моем примере здесь).. У меня есть куча таблиц размеров джинсов, которые появляются из модальных окон. Теперь в столбце заголовков для всех строк... TD выглядит следующим образом: ‹td›Size........‹/td›. Проблема в том, как заставить .... расширяться и сжиматься внутри TD. Теперь вы понимаете, почему мы спрашиваем. вам нужно DIV и установить фон с настройкой отключения переполнения ... или вот что я сейчас пытаюсь сделать этот регулируемый TD на основе размера контента. - person John Drefahl; 29.11.2011