TD内的DIV是个坏主意吗?


143

似乎我在某处听到/读到了a的<div>内部禁忌<td>。并不是说它不起作用,只是基于它们的显示类型,关于它们的兼容性不佳。找不到任何证据来支持我的预感,所以我可能完全错了。

Answers:


144

使用divinstide a td并不比使用表进行布局的任何其他方式差。(尽管有些人从不使用表格进行布局,而我恰好是其中之一。)

如果您使用divtd,你会得到但在一种情况,它可能是很难预测的因素将如何调整大小。div的默认值是从其父对象确定其宽度,而表格单元格的默认值是根据其内容的大小确定其大小。

标准中如何div定义a 大小的规则td没有很好地定义,但是对于a 应当如何大小的规则没有很好的定义,因此不同的浏览器使用略有不同的算法。


我怀疑这是我的直觉来自何处。感谢您清理它。
jcollum

9
如果您的列有预先指定的宽度,那应该没问题。只需记住设置表格布局:固定在表格上即可,这样浏览器就不会覆盖您的宽度(可能会导致麻烦)
Jens Roland

6
他从未说过他正在使用表格进行布局。
texelate '16

@texelate table-layout:fixedCSS不是您认为的那样。通过仅计算第一行的大小,它减少了浏览器渲染表时的计算量。
史蒂夫·布(SteveB)2016年

73

检查XHTML DTD后,我发现允许<TD>元素包含标题,列表以及<DIV>元素之类的块元素。因此,在<TD>元素内使用<DIV>元素不会违反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 '17

佩奇支持的唯一答案。
peterchaula

请与我们分享在DTD中对此进行解释的地方。这不是一个容易阅读的文档。谢谢!
redolent

1
@redolent:我在答案中添加了相关的DTD规则。
Martin Liversage

那么不是XHTML的HTML5规范呢?
暗恋

38

不,不一定。

如果需要在TD内放置DIV,请确保正确使用TD。如果您不关心表格数据和语义,那么您最终将不会关心TD中的DIV。我认为这没有问题-如果必须这样做,就可以了。

根据HTML规范

<div>可以将A 放置在预期的流内容1处,即<td>内容模型2


2
我一直想用是或否来回答问题;)
Jani Hartikainen 2009年

+1-确实想用更有趣的方式回答,但失败了。
karim79

尽管这得到了更多的upvotes我认为Guffa长大这里没有讨论(可能是我的预感源)的一个点
jcollum

14

表格单元可以合法地包含块级元素,因此,从本质上讲,它不是虚假的。当然,浏览器的功能使它处于推测理论的位置。这可能会导致布局问题和错误。

尽管使用表格进行布局-有时仍然是-我想大多数浏览器会正确呈现内容。甚至是IE。


我怀疑浏览器的实现正是我的“等待,这是个坏主意”。
jcollum

13

如果要使用位置:绝对;在div和position: relative;td上您会遇到问题。FF,safari和chrome(虽然不是Mac,但不是Mac,但mac)不会将div相对于td定位(就像您期望的那样),对于div也是如此,display: table-whatever;因此,如果要执行此操作,则需要两个div,一个用于容器width: 100%; height: 100%;,没有边框,因此它填充了td,而没有任何视觉影响。然后是绝对的。

除此之外,为什么不分裂细胞呢?


6
唯一可行的,非
圣战的

2

我已经通过放置<div>内部来解决这个问题<td>

document.getElementById()如果我将其放在td中,则无法识别div 。但是在外面,一切正常。


1

就像每个人都提到的那样,出于布局目的,这可能不是一个好主意。我到达这个问题是因为我想知道同样的事情,我只想知道它是否是有效的代码。

由于它是有效的,因此您可以将其用于其他目的。例如,我将使用它的是在表行中放置一些精美的“ CSSed” div,然后使用快速jQuery函数允许用户按价格,名称等对信息进行排序。唯一的布局表会给我“垂直顺序”,但是我将通过CSS控制div的宽度,高度,背景等。


0

两种处理方式

  1. div里面tbody的标签
  2. div里面tr的标签

如果您喜欢,两种方法都有效:https ://stackoverflow.com/a/23440419/2305243


-4

它破坏了语义,仅此而已。它可以正常工作,但是如果您“破坏语义”,可能会有屏幕阅读器或其他无法享受处理HTML的功能。


13
@Greg,为什么会破坏语义?div只是页面内容的块级划分或细分。因此,将它们放置在表格单元中并不是本质上和不可撤销的反义词。
戴维说恢复莫妮卡(Monica)2009年

2
我试图给您写一些答案来证明我的回答是正确的,但是我一直坚持个人观点。:/我想我最好的回答是,您的单元格中的任何内容都可以用另一个HTML标签更好地表示。如果将单元格真正地划分为组件,则可能不应该使用表格作为开始,而应该为布局设计一系列DIV。我不确定为什么我不能用更好的词来形容……将其归类为恕我直言。
格雷格,

嗯,您是说TD在语义上与DIV相同吗,为什么要连续两个呢?
jcollum

2
@jcollum:不,我不会说它们在语义上是相同的。TD绝对是表中的单元格;它是已知结构的一部分:表包含行,行包含单元格,单元格包含数据。DIV只是一个容器,它可以随时随地表示文档中的任何内容-您必须对其应用样式,以根据标记的目的从中获取任何语义。
格雷格,

7
DIV在语义上是没有意义的,因此我看不出它怎么可能是不正确的。
Rex M
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.