DIV внутри TD - плохая идея?

143

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

Jcollum
источник

Ответы:

147

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

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

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

Гуффа
источник
Я подозреваю, что отсюда и пришла моя догадка. Спасибо, что прояснили это.
jcollum
9
Если ваши столбцы имеют заранее заданную ширину, это не должно быть проблемой. Просто не забудьте установить table-layout: fixed в таблице, чтобы браузеры не переопределяли вашу ширину (что может привести к проблемам)
Йенс Роланд,
6
Он никогда не говорил, что использует таблицы для макетов.
texelate
@texelate table-layout:fixedCSS - это не то, что вы думаете. Это уменьшает количество вычислений, которые браузеры выполняют при визуализации таблиц, вычисляя только размер первой строки.
SteveB
75

После проверки 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 это объясняется. Читать этот документ непросто. Благодарность!
благоухает
1
@redolent: я добавил к своему ответу соответствующие правила DTD.
Мартин Ливерсаж,
А как насчет спецификации HTML5, которая не является XHTML?
давка
38

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

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

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

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

Sampson
источник
2
Я всегда хотел ответить на вопрос «да» или «нет»;)
Яни Хартикайнен
+1 - очень хотел ответить более остроумным, но не удалось.
karim79
Несмотря на то, что это получило больше голосов, я думаю, что Гуффа поднял вопрос, который здесь не рассматривается (и может быть источником моих
догадок
14

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

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

Дэвид просит восстановить Монику
источник
Я подозреваю, что реализация браузера - это то, откуда я получил свое «подождите, это плохая идея».
jcollum
13

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

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

зель
источник
6
Единственный практический ответ, не связанный с холиваром
Энтони Хэтчкинс
2

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

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

Химаджа
источник
1

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

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

Хуан Игнасио
источник
0

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

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

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

Алан Донг
источник
-5

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

Грег
источник
13
@ Грег, почему это нарушает семантику? Div - это просто подразделение на уровне блока или подраздел содержимого страницы. По сути, размещение их в ячейке таблицы не является принципиально и бесповоротно антисемантическим.
Дэвид требует восстановить Монику на работе
2
Я пытался написать вам несколько ответов, оправдывающих мой ответ, но все время приходил к личному мнению. : / Думаю, лучшим ответом будет то, что все, что находится в вашей ячейке, вероятно, лучше представить другим тегом HTML. Если вы действительно разделяете свои ячейки на компоненты, то вам, вероятно, не следует использовать таблицу для начала, вам следует стилизовать серию DIV для вашего макета. Не уверен, почему я не могу выразить это лучше ... полагаю, это связано с ИМХО.
Грег,
Хм, вы имеете в виду, что TD семантически то же самое, что DIV, так зачем иметь два из них подряд?
jcollum
2
@jcollum: Нет, я бы не сказал, что они семантически одинаковы. TD определенно является ячейкой в ​​таблице; это часть известной структуры: в таблице есть строки, в строке есть ячейки, ячейки содержат данные. DIV - это просто контейнер ... он может представлять что угодно в любое время в любом месте документа - вы должны применить к нему стиль, чтобы получить от него любую семантику с точки зрения цели в разметке.
Грег,
7
DIV семантически бессмысленен, поэтому я не понимаю, как он может быть неправильным.
Rex M