rowspan本质是删除指令而非样式指令,需写在起始行且值≤剩余行数,被跨行对应列必须彻底删除td标签,跨thead/tbody时列坐标需对齐,复杂场景须先画草图标定覆盖区域。

直接说结论:rowspan 不是“让单元格变高”,而是“告诉浏览器:从这一行开始,下面 n−1 行的同一列位置,你别再渲染任何 <td> 了”。写错位置、漏删后续 <code><td>、跨行数超限,这三件事占了 90% 的错位问题。
<h3>rowspan 必须写在起始行,且值不能超过剩余行数</h3>
<p>很多人把 <code>rowspan="3" 写在最后一行,结果什么都没发生——因为没地方可跨。浏览器只认“当前行往下还能排几行”,不看表格总行数。
-
rowspan值必须 ≤ 从当前行到或结束之间的行数(含当前行) - 比如
<tbody> 里共 5 行,你在第 4 行写 <code>rowspan="2"→ 错误,只剩 2 行(第 4、5 行),但rowspan="2"需要占用第 4 和第 5 行,刚好够;写在第 5 行则只能用rowspan="1" - 动态生成时,得先遍历数据算出连续重复值的跨度,再决定在哪一行写
rowspan,而不是每行都判断 - 如果
<thead> 最后一行用了 <code>rowspan,<tbody> 开头几行对应列都要同步跳过,哪怕只是空数据 <h3>同时用 <code>rowspan和colspan时,先画草图再编码二维合并会让行列总数变成隐式约束条件,靠脑子推很容易漏掉某一行少写一个
<td>,或某列多塞一个。 <ul> <li>动手前,在纸上标出每个单元格的起始 <code>(row, col)和rowspan/colspan值,算出它覆盖的矩形区域 - 每行真实列数 = 所有
<td> 的 <code>colSpan之和(没写默认为 1);所有<tr> 这个和必须相等 <li>调试时打开开发者工具,选中合并单元格,看 box model 是否跨行渲染;再手动检查下一行同列 DOM 节点是否存在</li> <p>复杂点不在属性本身,而在它强制你把“视觉合并”翻译成“DOM 删除动作”。只要记住:rowspan 是删除指令,不是样式指令,就避开了大多数坑。</p> </tr>


















