你不需要 jquery 来做到这一点。只是 CSS 和 tbody / thead 标签。
例子:
HTML:
<table>
<thead>
<tr><td>A</td><td>4654</td><td>ABAB</td></tr>
</thead>
<tbody>
<tr><td>A</td><td>498</td><td>JOI</td></tr>
<tr><td>B</td><td>165</td><td>FTY</td></tr>
</tbody>
<tbody>
<tr><td>C</td><td>798</td><td>KPO</td></tr>
</tbody>
</table>
CSS:
thead td,
tbody tr:last-child td {
border-bottom: #000000 solid 1px;
}
td:not(:first-child) {
border-left: #000000 solid 1px;
}
Jsfiddle: jsfiddle
如果您想要连续的边框(通过填充更改边框),可能需要稍微调整 Css。 Example
当然,如果您不能按照相同的原则更改原始 html 或 css,您可以使用 jQuery 转换现有表格。
编辑:我忽略了你想按列值分组的事实。
在这种情况下,通过 javascript/jQuery 检测它们是有意义的,更简单的视觉实现方法是,正如 @printfmyname 在他的解决方案中所做的那样,只需将样式添加到每个组的最后一行,避免将 DOM 更改为捕获行并将它们重新注入到几个 tbody 中。
...但是,无论如何,对于完全相同的 DOM 对象类型(从语义的角度来看)具有不同的 css 让我有点震惊。
我的意思是:它可以解决所要求的问题,而且做得正确且效率更高。
...但前提是您确定您从不想要通过添加或删除某些行来更改该表的内容。
如果您将来想这样做,您最终可能会把事情搞得一团糟。例如:
- 删除组的最后一行将删除组(可视)分隔符。
- 在该组的最后一行之后添加(同一组的)行,将(视觉上)显示下一组中的行。
我再说一遍:我并不是说@printfmyname 是错误的:它有效(我的没有更多的工作)。但这可能会在将来引起一些麻烦,除非我们确定永远不想对表进行任何动态更改。
如果我们不是,那么值得在语义上对行进行分组方面付出更多努力,或者至少通过插入带边距的空(和纤细)行来改进 @printfmyname 解决方案以避免此问题。