为什么colspan没有按照预期生效。

20

我有一个如下表格。第二行定义了三列,其中一个使用了colspan=8,其他两个使用了colspan=1。但是,这些单元格没有根据colspan属性来拉伸,第二个单元格宽度略大,而第三个单元格最宽。

<table class="floating simpletable">
    <tbody>
        <tr><td colspan="10">1st row</td></tr>
        <tr><td colspan="8">Column 1 -&gt; Least wide</td><td colspan="1">2nd</td><td colspan="1">3rd</td></tr>
        <tr><td colspan="10">3rd row</td></tr>
        <tr><td colspan="1">1st cell</td><td colspan="9">4th row</td></tr>
    </tbody>
</table>

问题是什么,如何修复?


1
包含10个单元格的行在哪里? - ZippyV
那是第一行。我需要用某种方式定义有10个单元格的行吗? - Nicsoft
3个回答

27

单元格的宽度取决于单元格内容、HTML和CSS中的设定、浏览器以及可能还有月相。而colspan属性仅指定单元格占据的列数(因此,表格中有多少个网格槽位)。

如果你看到第2行的最后一个单元格最宽,那么原因可能是该单元格有最多的内容(或者有宽度设置)。您的演示代码没有展示这种行为。

如果您不想让列宽度根据单元格大小要求自动调整,请在CSS(或HTML)中显式设置宽度。在此之前,最好从表格结构中删除所有不必要的复杂性。如果您的演示代码反映了整个结构,则第2到8列是不必要的分割,即它们可以合并成一列。下面是示例(为了明确起见使用了低劣风格的像素宽度):

<table class="floating simpletable" border>
    <col width=100><col width=100><col width=100>
    <tbody>
        <tr><td colspan="4">1st row</td></tr>
        <tr><td colspan="2">span 1</td><td>span 2</td><td>span 3 </td></tr>
        <tr><td colspan="4">3rd row</td></tr>
        <tr><td>span</td><td colspan="3">other span</td></tr>
    </tbody>
</table>

如果不进行重写,我担心您的表格将违反HTML的表格模型,因为目前没有单元格从第3列或第4列开始...


我的示例是实际上不起作用的。但是你的建议为每列添加一个<col...>标签解决了这个问题。我添加了十个并为每个设置了宽度=10%。谢谢!但是在你的示例中,你只添加了三个<col>,难道不应该是四个吗?因为你使用了colspan=4。 - Nicsoft
在我的演示中,最后一列只取所需。为了实现您想要的目标,您可以使用(使用我的标记时)<col width=10%><col width=70%><col width=10%><col width=10%>。您每个宽度为10%的十列的方法可能不够健壮,因为它没有解决表格模型问题。 - Jukka K. Korpela
好的,我理解为什么你省略了最后一列。但是在阅读表格模型的相关资料时,客户端应该使用<col>来决定列数,所以我认为每列都有一个<col>并不是错误的。您能否解释一下为什么我的方法不如您的方法健壮?也许我对表格模型的理解还有欠缺... - Nicsoft
HTML5的表格模型相当复杂和正式:http://www.whatwg.org/specs/web-apps/current-work/multipage/tabular-data.html#table-model 但是,如果您使用验证器http://validator.w3.org检查最初发布的代码,并在开头插入`<!doctype html>,它会说:“由td元素建立的范围为3…8的表列没有单元格开始。”注意:我的建议标记不符合HTML5草案,因为它们需要第四个<col>`元素(出于逻辑原因-您不需要设置其宽度,而HTML5甚至不允许在HTML中这样做)。 - Jukka K. Korpela
1
和可能的月相。 - Flavius Frantz

8

colspan决定了一个单元格横跨的列数,而不是这些列的大小。使用CSS的width属性来指定事物的宽度。


其实我所说的并不是单元格的数量,只是我的措辞可能有点不清楚。我会改正它。 - Nicsoft

1

只有 display: table-cell 实现了 colspan 的行为,因此应用任何其他的 display 值都会导致该属性被忽略。


如果你想要使用其他的显示算法来展示单元格的内容,你可以使用一个包装器:

<td colspan="2"> <!-- the cell is still `display: table-cell` -->

  <div style="display: grid"> <!-- the wrapper can have any `display` rule you need -->

    <!-- the cell content -->

  </div>

</td>

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