问题 HTML表格单元格的默认宽度是多少?


我一直无法找到这个问题的答案: 规范或UA文档中的默认宽度为a <td> 界定?

我搜索过了 HTML生活标准HTML5推荐标准和其他各种来源。

我的理解(基于使用和观察)是默认情况下,表格单元格将占据其所在列的整个宽度。如果列中存在其他单元格,则单元格的宽度不能与列不同。

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


2849
2017-08-10 18:47


起源

默认情况下,宽度是否还包括填充和边距? - onebree
默认宽度非常随意。现代浏览器通常会查看表中的所有数据(更重要的是,查看所述数据的宽度),并根据数据尽量调整列的大小(因此,列中的tds)。我怀疑这种行为在任何标准中都是正式的。 - Hayden Schiff
该 处理模型部分 可能就是你要找的东西。 - gilly3
@HunterStevens,默认情况下单元格会拉伸列的宽度。我想知道这是什么定义,无论填充/边距。为什么表格单元格不会根据内容进行扩展?为什么单个表格单元格不能占用它自己的宽度,而不考虑列中的其他单元格?我知道这是有正当理由的,我只是想知道UA在哪里得到他们的指导。 - Michael_B


答案:


表格单元格的物理/视觉宽度不是由HTML定义,而是由CSS定义。 CSS 2.1规范有一整页专门用于 表格布局 它补充了HTML对表格数据的描述。

此外,CSS本身 才不是 充分 确定 如何计算单元格的宽度。它使用固定表格布局算法:

在固定表格布局算法中,每列的宽度确定如下:

  1. “width”属性的值为“auto”的列元素设置该列的宽度。
  2. 否则,第一行中具有“width”属性的“auto”值以外的值的单元格将确定该列的宽度。如果单元格跨越多个列,则宽度将在列上分割。
  3. 任何剩余的列均等地划分剩余的水平表空间(减去边框或单元格间距)。

然后,表的宽度是表元素的'width'属性的值和列宽的总和(加上单元格间距或边框)的较大值。如果表格比列宽,则应在列上分配额外空格。

但它没有提供超出自动表格布局的粗略指导方针的任何内容,用户代理可以自由地遵循或偏离(它列出了与固定表格布局不同的逐步程序,但整个列表是非-normative)。 通常 你可以期待UAs中的一致行为   共同 场景 - 正如您所观察到的,自动调整大小的表格单元通常会占用内容所需的空间,而不会占用更多空间。但是深入研究边缘情况,你会发现各种各样的情况


8
2017-09-04 04:46





这是计算表格列宽度的W3C标准。基本上它由实现浏览器/代理。

如果作者未指定列的宽度信息,则为用户代理   可能无法逐步格式化表格,因为它必须等待   为了分配整个数据列而到达   适当的宽度。

如果列宽被证明对于a的内容来说太窄   特定的表格单元格,用户代理可以选择重排表格。

资源: http://www.w3.org/TR/html401/struct/tables.html#h-11.2.4.4

注意:这是HTML4文档。


4
2017-08-10 18:58



“这是HTML4文档” - 这些文档很老,并且被CSS文档取代。 - Quentin


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

表大小调整算法

默认大小调整算法需要两次遍历表数据。在第一遍中,自动换行被禁用,用户代理会跟踪每个单元格的最小和最大宽度。最大宽度由最宽的线给出。由于自动换行已被禁用,因此段落将被视为长行,除非被断开
 元素。最小宽度由最宽的单词或图像等给出,考虑到前导缩进和列表项目符号等。换句话说,如果要在单独的窗口中格式化单元格的内容,请确定可以使单元格的最小宽度。事物开始被修剪之前的窗口。

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

表格边框和单元间边距需要包含在分配步骤中。有三种情况:

  1. 最小表宽度等于或大于可用空间。在这种情况下,指定最小宽度并允许用户水平滚动。对于转换为盲文,有必要通过引用包含其全部内容的注释来替换单元格。按照惯例,这些出现在表格之前。
  2. 最大工作台宽度适合可用空间。在这种情况下,请将列设置为其最大宽度。
  3. 表的最大宽度大于可用空间,但最小表宽度较小。在这种情况下,找到可用空间和最小表宽度之间的差异,让我们称之为W.也可以调用D表格的最大和最小宽度之间的差异。

对于每列,令d为该列的最大和最小宽度之间的差异。现在将列的宽度设置为最小宽度加上D乘以D的D倍。这使得具有大量文本的列比具有较小量的列宽。

然后对嵌套表重复此分配步骤。在这种情况下,封闭表格单元格的宽度在上面的描述中扮演当前窗口大小的角色。对所有嵌套表以递归方式重复此过程。

如果COLSPEC属性明确指定列宽,则用户代理可以尝试使用这些值。如果随后,其中一个单元溢出其列宽,则可以调用两个传递机制以使用更合适的宽度重绘表。如果属性指定相对宽度,则始终需要两个传递模型。

然后修改列宽分配算法:

  • 在给定时,应使用COLSPEC属性的显式宽度,前提是它们大于最小列宽,否则应使用后者。
  • 对于相对宽度,如上定义的剩余空间W在列之间被适当地划分,确保每列被给予至少其最小宽度。如果W为零或负值,则应在最小宽度上增加列宽以满足相对宽度要求。

如果使用WIDTH属性指定表宽度,则用户代理会尝试设置列宽以匹配。如果这导致列小于其最小宽度,则应忽略WIDTH属性。


0
2017-08-10 18:59



这似乎取自HTML 3.0,它从未被任何主流浏览器实现,甚至不是Mosaic,并且在几年内被HTML 3.2和4.0取代。尽管HTML 3.0在某个时间点是真正的草案,但我不认为它是权威的参考。 - BoltClock♦