HTML表格跨行合并本质是“占位+跳过”,需严格同步rowspan位置、数值及被跨行的td删除;rowspan仅作用于当前td,被跨行必须彻底移除对应td标签,否则结构错乱。

HTML 表格跨行合并不是“合并”,是“占位 + 跳过”——rowspan 写在哪一行、值设多少、后续哪几行要删掉 <td>,三者必须严格同步,差一点就错位。
<h3>rowspan 必须写在起始行的 <code><td> 或 <code><th> 上
<p>它只对当前标签生效,不向上追溯,也不向下“自动延续”。比如你想让第 2 行第 1 列跨 3 行(覆盖第 2、3、4 行),就必须把 <code>rowspan="3" 明确写在第 2 行那个 <td> 里。
<ul>
<li>写在第 1 行 → 第 1 行被拉高,但第 2 行仍存在该列,视觉重叠</li>
<li>写在第 3 行 → 只影响第 3、4 行,第 2 行空缺,左侧塌陷</li>
<li>写在第 4 行 → 没有后续行可跨,<code>rowspan="3" 被浏览器静默截断为 rowspan="1"
被跨过的行必须彻底删除对应列的 <td>
<p>不是留空,不是写 <code><td></td>,是整行 HTML 里根本不能出现这个 <td> 标签。浏览器靠 <code>rowspan 数值跳过位置,多一个 <td> 就等于强行插入一列,整行结构立刻偏移。
<ul>
<li>错误:<code><tr><td rowspan="3">A</td><td>B1</td></tr><tr><td></td><td>B2</td></tr> → 空 <td> 占位,B2 被挤到第 3 列
<tr><td rowspan="3">A</td><td>B1</td></tr><tr><td>B2</td></tr> → 第二行完全不写第一列的 <td>
document.querySelector('table').rows[1].cells.length,结果应比预期少 1rowspan 值不能超过剩余行数,且不能为 0
rowspan="0" 是非法值,所有主流浏览器都会忽略它,退化为 rowspan="1";rowspan="999" 在 IE 中可能异常,在 Chrome/Firefox 中虽能渲染,但语义已损坏,table.rows[i].cells 索引会错乱。
立即学习“前端免费学习笔记(深入)”;
- 安全做法:先数清从当前行到表格末尾还有几行(含当前行),再填对应正整数
- 动态生成时(如 JS 拼接或模板渲染),必须提前聚合数据、计算连续段长度,不能仅凭“值相同”就加
rowspan - 常见翻车点:
<thead>用了rowspan,但<tbody>第一行没跳过对应列 → 表头和数据列直接脱节
和 colspan 混用时,行列总数必须人工对齐
rowspan 不影响列总数计算,但会改变每行实际渲染的 <td> 数量;colspan 则直接影响当行列总数。两者叠加时,稍有不慎整张表就“裂开”。
- 公式:每行总列数 = 所有
<td>的colSpan值之和(colSpan默认为 1) - 必须确保
<thead>和<tbody>各行该值一致,可用Array.from(tr.children).reduce((s, el) => s + (el.colSpan || 1), 0)快速校验 - 嵌套使用(如一个单元格同时设
rowspan="2"和colspan="2")会覆盖 2×2 区域,右下方 3 个位置都必须留空,建议画草图再写
最易被忽略的一点:屏幕阅读器几乎无法理解 rowspan 的语义关联,尤其当表头本身也跨行时,<th scope="row"> 很可能失效。如果表格用于关键数据展示且需无障碍支持,优先考虑用 headers 属性显式绑定,而不是依赖视觉上的跨行占位。



















