奇怪的样式导致合并单元格的宽度失效

本文介绍了一种使用JavaScript实现复杂表格头部合并的方法,并详细记录了解决在合并表格单元格后子行宽度丢失的问题过程。

起因很简单,至少一开始我认为这是个很简单的小玩意,没想到折腾了我整整两天,所以记录下来。

一开始,手上拿到了一套网上搜到的super table可以实现固定表左和表头,刚好我的需求是需要同时实现固定表左、表头、表左相同值自动合并、自定义复杂表头合并。而这个js的一开始就说“colSpan not supported ”,于是决定自己改造一下。

 

表左相同值自动合并比较简单,网上也很多现成的,复杂表头的合并稍微花了点功夫,用递归实现了,不料,在最后收尾的时候出了点问题,如下:

12
3   4

利用js把1和2合并其实很简单

table.rows[0].cells[0].colSpan=2;
table.rows[0].cells[1].style.display="none";


结果合并后变成了这样

 

1
34

也就是说

3和4的宽度丢失了!他们变得一样了!虽然我在代码中设置了

<td style="width:110px;">3</td>
<td style="width:50px;">4</td>

但是它们不生效,哪怕利用IE8的开发者工具进入后修改它的样式也是一样,设置成1000px都一样

开头认为是由于1的宽度没有设置的原因,于是设置1的宽度为3和4的offsetWidth之和,不行,虽然它们在调试的时候,数值的确是110和50

因此我怀疑是由于隐藏单元个导致offsetWidth表现不一致,接着我弃用了
table.rows[0].cells[1].style.display="none";

改用

table.rows[0].deleteCell(1);问题依然一样

 

最后发现在table中定义了样式width:1px,禁用后,一切正常,IE7、8下均能在动态合并后保持子行的宽度不丢失。

 

问题是解决了,可是原理不懂,特此记录。

在媒体查询中合并table单元,可以使用CSS伪元素`:before`和`:after`来模拟单元合并的效果。 首先,在HTML中给需要合并的单元添加一个类名,例如`merge-cell`。然后,在CSS中使用媒体查询来针对不同的屏幕尺寸设置单元样式。 例如,以下代码将在屏幕宽度小于600px时将第一行的第一列和第二列合并成一个单元: ```html <table> <tr> <th class="merge-cell">Header 1</th> <th class="merge-cell">Header 2</th> <th>Header 3</th> </tr> <tr> <td class="merge-cell">Cell 1</td> <td>Cell 2</td> <td>Cell 3</td> </tr> </table> ``` ```css @media screen and (max-width: 600px) { .merge-cell { position: relative; } .merge-cell:before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: -1; border-top: 1px solid #ccc; border-right: 1px solid #ccc; } .merge-cell:first-child:before { border-left: 1px solid #ccc; } .merge-cell:last-child:before { border-right: none; } } ``` 在上面的代码中,当屏幕宽度小于600px时,`.merge-cell`类的单元将被设置为相对定位,同时添加一个`:before`伪元素来模拟合并后的单元。`:before`元素的内容为空,宽度和高度都为100%来覆盖原来的单元。同时,使用`z-index`属性将伪元素置于原单元下方,使其不会遮挡其他单元。 为了模拟合并后的单元边框,使用`border`属性设置伪元素的边框样式。由于合并后的单元需要显示原来单元的左边框和上边框,所以需要添加`border-top`和`border-right`属性。同时,由于第一列的单元需要显示左边框,所以需要添加`border-left`属性。最后,由于最后一列的单元不需要显示右边框,所以需要将`border-right`属性设为`none`。 需要注意的是,当合并单元时,原来的单元的`colspan`和`rowspan`属性将失效,因此需要确保合并后的单元中不含有任何其他单元
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值