HTML表格单元格<td>的默认宽度是多少?

14

我无法找到这个问题的答案: <td> 的默认宽度在规范或UA文档中是在哪里定义的?

我已经搜索了HTML Living Standard, HTML5 Recommendation和其他各种来源。

根据我的理解(基于使用和观察),表格单元格默认情况下将占据所在列的全部宽度。如果该列中存在其他单元格,则该单元格不能被赋予不同的宽度。

我正在寻找官方确认此行为的资料,最好是W3C或用户代理文档。但任何权威的参考资料都可以接受。


默认情况下,宽度是否包括填充和边距? - onebree
1
默认宽度相当随意。现代浏览器通常会查看表格中的所有数据(更重要的是,数据的宽度),并尝试根据数据大小调整列宽(因此也就是列内的td元素)。我怀疑这种行为在任何标准中都不是官方的。 - Hayden Schiff
处理模型部分可能是您正在寻找的内容。 - gilly3
@HunterStevens,默认情况下,单元格会拉伸到列的宽度。我想知道这是在哪里定义的,不考虑填充/边距。为什么表格单元格不能根据内容自动扩展?为什么一个单独的表格单元格不能拥有自己的宽度,而不考虑列中的其他单元格?我知道这样做有合理的原因,我只是想知道UA从哪里获取指导。 - Michael Benjamin
3个回答

11
表格单元格的物理/可视宽度由CSS定义,而非HTML。CSS2.1规范有一个专门的章节来补充HTML对表格数据的描述,称为表格布局
此外,CSS本身并未完全定义单元格宽度的计算方式。只有使用固定表格布局算法时才有:
在固定表格布局算法中,每列的宽度如下确定: 1. 带有除'auto'以外值的'width'属性的列元素设置该列的宽度。 2. 否则,第一行中带有除'auto'以外值的'width'属性的单元格决定该列的宽度。如果该单元格跨越多列,则将其宽度分配到各列中。 3. 剩余的任何列平均分配剩余的水平表格空间(减去边框或单元格间距)。 表格的宽度是表格元素'width'属性的值和列宽之和(加上单元格间距或边框)的大者。如果表格比列还宽,则额外的空间应分配到列上。

但它并没有提供除了自动表格布局的粗略指南之外的任何内容,这些用户代理可以遵循或偏离(它列出了一种类似于固定表格布局的逐步过程,但整个列表都是非规范性的)。通常情况下,您可以期望UAs在常见的场景下表现一致 - 就像您观察到的那样,自动调整大小的表格单元格通常占用其内容所需的空间,而不会超过更多。但是在极端情况下,你会发现各种疯狂的情况。


4
这里介绍了W3C关于计算表格列宽的标准。基本上由实现浏览器/代理决定。
如果作者没有为列指定宽度信息,则用户代理可能无法逐步格式化表格,因为它必须等待整个数据列到达才能分配适当的宽度。
如果列宽对于特定表格单元格的内容来说太窄,用户代理可以选择重新排列表格。
来源:http://www.w3.org/TR/html401/struct/tables.html#h-11.2.4.4 注:这是HTML4文档。

2
这是HTML4文档,它们非常古老,并已被CSS文档所取代。 - Quentin

0
表格单元格的最小宽度为0或该单元格中最大单词或图像的大小。

表格大小算法

默认的大小调整算法需要通过两次表格数据。在第一次遍历中,禁用了自动换行,用户代理会追踪每个单元格的最小和最大宽度。最大宽度由最宽的行给出。由于禁用了自动换行,段落将被视为长行,除非其被
元素打断。最小宽度由最宽的单词、图片等给出,考虑到首行缩进和列表标志等。换句话说,如果你要在窗口中格式化单元格的内容,请确定在开始裁剪之前可以使窗口的最小宽度。

然后使用最小和最大单元格宽度来确定相应的列的最小和最大宽度。这些转而用于找到表格的最小和最大宽度。请注意,单元格可以包含嵌套的表格,但这不会显着复杂代码。下一步是根据当前窗口大小(更准确地说是左右边距之间的宽度)分配列宽。

表格边框和单元格间距需要在分配过程中包括在内。有三种情况:

  1. 最小表格宽度等于或大于可用空间。在这种情况下,分配最小宽度并允许用户水平滚动。为了转换成盲文,将需要将单元格替换为包含其完整内容的注释的引用。按照惯例,这些出现在表格之前。
  2. 最大表格宽度适合可用空间。在这种情况下,设置列的最大宽度。
  3. 表格的最大宽度大于可用空间,但表格的最小宽度较小。在这种情况下,请找出可用空间和最小表格宽度之间的差异,我们称其为 W。也可以称 D 为表格最大宽度与最小宽度之间的差异。

对于每一列,让 d 是该列的最大宽度和最小宽度之间的差。现在将该列的宽度设置为最小宽度加上 d 乘以 W 除以 D。这使得具有大量文本的列比具有较少内容的列更宽。

然后针对嵌套表格重复此分配过程。在这种情况下,封闭表格单元格的宽度发挥以上描述中当前窗口大小的作用。对于所有嵌套表格,将递归地重复此过程。

如果 COLSPEC 属性显式指定了列宽度,则用户代理可以尝试使用这些值。如果随后,其中一个单元格溢出其列宽,则可能会调用两次传递机制以重新绘制具有更合适的宽度的表格。如果该属性指定相对宽度,则始终需要进行两次传递模型。

然后修改列宽分配算法:

  • 在给定明确宽度的情况下,应使用来自 COLSPEC 属性的显式宽度,前提是它们大于最小列宽度,否则应使用后者。
  • 对于相对宽度,如上定义的剩余空间 W 将根据列适当地划分,确保每个列都至少具有其最小宽度。如果 W 为零或

3
这似乎是从HTML 3.0中提取的,但该版本从未被任何主流浏览器(甚至包括Mosaic)实现,而且在几年内就被HTML 3.2和4.0所取代。虽然HTML 3.0曾经是一个真正的草案,但我不认为它是权威参考资料。 - BoltClock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接